亚洲精品不卡久久久久久_色视频线观看在线 _妽妽夹得我好舒服_国产真人一级a爱做片高潮_亚洲aⅴ无码专区在线观看q

當(dāng)前位置: 首頁 >頭條 > 正文

世界播報(bào):JavaCV的攝像頭實(shí)戰(zhàn)之十三:年齡檢測

2023-07-03 21:21:01 來源:博客園


(資料圖片)

歡迎訪問我的GitHub

這里分類和匯總了欣宸的全部原創(chuàng)(含配套源碼):https://github.com/zq2599/blog_demos

本篇概覽

本文是《JavaCV的攝像頭實(shí)戰(zhàn)》系列的第十三篇,前文《JavaCV的攝像頭實(shí)戰(zhàn)之十二:性別檢測》中,借助訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)模型開發(fā)出了識別性別的應(yīng)用,今天在前文基礎(chǔ)上做少量改動,實(shí)現(xiàn)年齡識別的功能,效果如下圖:

應(yīng)用主要功能如下圖所示:

如果您看過《JavaCV的攝像頭實(shí)戰(zhàn)》系列的其他文章,就會發(fā)現(xiàn)上圖中只有藍(lán)色部分是新增內(nèi)容,其余的步驟都是固定套路,《JavaCV的攝像頭實(shí)戰(zhàn)》系列的每一個(gè)應(yīng)用玩的都是相同套路:別看步驟挺多,其實(shí)都是同一個(gè)流程

關(guān)于性別和年齡檢測使用卷積神經(jīng)網(wǎng)絡(luò)推理性別和年齡的更多技術(shù)細(xì)節(jié),這里有更詳細(xì)的說明:https://talhassner.github.io/home/publication/2015_CVPR本篇會使用已訓(xùn)練好的Caffe 模型,訓(xùn)練該模型的數(shù)據(jù)來自Flickr相冊,通過從 iPhone5(或更高版本)智能手機(jī)設(shè)備自動上傳組裝而成,并由其作者根據(jù)知識共享 (CC) 許可向公眾發(fā)布,共有26580張照片,涉及2284人,這些人的年齡一共被標(biāo)識成八組:(0-2、4-6、8-13、15-20、25-32、38-43、48-53、60 -)關(guān)于數(shù)據(jù)源的更多詳細(xì),請參考:https://talhassner.github.io/home/projects/Adience/Adience-data.html論文地址:https://talhassner.github.io/home/projects/cnn_agegender/CVPR2015_CNN_AgeGenderEstimation.pdf源碼下載《JavaCV人臉識別三部曲》的完整源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
名稱鏈接備注
項(xiàng)目主頁https://github.com/zq2599/blog_demos該項(xiàng)目在GitHub上的主頁
git倉庫地址(https)https://github.com/zq2599/blog_demos.git該項(xiàng)目源碼的倉庫地址,https協(xié)議
git倉庫地址(ssh)git@github.com:zq2599/blog_demos.git該項(xiàng)目源碼的倉庫地址,ssh協(xié)議
這個(gè)git項(xiàng)目中有多個(gè)文件夾,本篇的源碼在javacv-tutorials文件夾下,如下圖紅框所示:javacv-tutorials里面有多個(gè)子工程,《JavaCV的攝像頭實(shí)戰(zhàn)》系列的代碼在simple-grab-push工程下:準(zhǔn)備:文件下載本次實(shí)戰(zhàn)需要三個(gè)文件:人臉檢測的模型文件:https://raw.github.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml年齡識別的配置文件:https://raw.githubusercontent.com/GilLevi/AgeGenderDeepLearning/master/age_net_definitions/deploy.prototxt年齡識別的模型文件:https://raw.githubusercontent.com/GilLevi/AgeGenderDeepLearning/master/models/age_net.caffemodel我已將上述文件打包上傳到CSDN,您也可以在CSDN下載(無需積分):https://download.csdn.net/download/boling_cavalry/70730586準(zhǔn)備:代碼接口簡介編碼前,先把涉及到的所有java文件說明一下:AbstractCameraApplication.java:主程序的抽象類,這里面定義了打開攝像頭、抓取每一幀、處理每一幀的基本框架,避免每個(gè)應(yīng)用都把這些事情重復(fù)做一遍PreviewCameraWithGenderAge.java:主程序,是AbstractCameraApplication的實(shí)現(xiàn)類,本次實(shí)戰(zhàn)的核心功能人臉檢測和年齡檢測,都委托給它的成員變量detectService去完成DetectService.java:檢測服務(wù)的接口,里面定義了幾個(gè)重要的api,例如初始化、處理每一幀、釋放資源等AgeDetectService.java:前文GenderDetectService的子類,僅僅是處理推理結(jié)果的邏輯與前文的性別識別略有不同,其余功能完全繼承自性別識別以上代碼,咱們已經(jīng)在前文寫過一次了,今天當(dāng)然不需要重復(fù)再做一次,今天是在上述代碼基礎(chǔ)上做兩處小幅度修改,接下來就開始吧改動一:主程序(PreviewCameraWithGenderAge.java)卷積神經(jīng)網(wǎng)絡(luò)所需的配置和模型文件,是在主程序的main方法內(nèi)設(shè)置的,上一章是性別檢測,這里替換為年齡檢測的文件,如下所示,請您將路徑換為自己電腦上的文件路徑:
public static void main(String[] args) {        String base = "E:\\temp\\202112\\25\\opencv\\";                DetectService detectService = new AgeDetectService(                base + "haarcascade_frontalface_alt.xml",                base + "age\\deploy.prototxt",                base + "age\\age_net.caffemodel");        new PreviewCameraWithGenderAge(detectService).action(1000);    }
改動二:檢測服務(wù)實(shí)現(xiàn)(GenderDetectService的子類)前文《性別檢測》的核心功能都集中在GenderDetectService.java中,今天要做的年齡檢測,除了推理結(jié)果的處理邏輯略有不同,其余功能與《性別檢測》完全一致所以,實(shí)現(xiàn)年齡檢測的最簡單方法就是寫一個(gè)子類繼承GenderDetectService,這個(gè)子類中只有神經(jīng)網(wǎng)絡(luò)推理結(jié)果的處理邏輯,完整代碼如下,注釋中已經(jīng)有了詳細(xì)說明,就不多贅述了:
package com.bolingcavalry.grabpush.extend;import lombok.extern.slf4j.Slf4j;import org.bytedeco.javacpp.DoublePointer;import org.bytedeco.opencv.opencv_core.Mat;import org.bytedeco.opencv.opencv_core.Point;import static org.bytedeco.opencv.global.opencv_core.minMaxLoc;/** * @author willzhao * @version 1.0 * @description 檢測年齡的服務(wù) * @date 2021/12/3 8:09 */@Slf4jpublic class AgeDetectService extends GenderDetectService {    /**     * 設(shè)置訓(xùn)練模型時(shí)劃分的年齡段,所以推理結(jié)果也是這樣的年齡段     */    private static final String[] AGES = new String[]{"0-2", "4-6", "8-13", "15-20", "25-32", "38-43", "48-53", "60-"};    /**     * 構(gòu)造方法,在此指定proto和模型文件的下載地址     *     * @param classifierModelFilePath     * @param cnnProtoFilePath     * @param cnnModelFilePath     */    public AgeDetectService(String classifierModelFilePath, String cnnProtoFilePath, String cnnModelFilePath) {        super(classifierModelFilePath, cnnProtoFilePath, cnnModelFilePath);    }    @Override    protected String getDescriptionFromPredictResult(Mat prob) {        DoublePointer pointer = new DoublePointer(new double[1]);        Point max = new Point();                // 把prob理解為一個(gè)數(shù)組,        // 第一個(gè)元素是"0-2"的置信度        // 第二個(gè)元素是"4-6"的置信度        // 第三個(gè)元素是"8-13"的置信度        // 第四個(gè)元素是"15-20"的置信度        // ...        // 第八個(gè)元素是"60-"的置信度        // minMaxLoc方法幫忙我們找出了置信度最高的元素,max是元素位置,pointer是這個(gè)元素的置信度        minMaxLoc(prob, null, pointer, null, max, null);        // 如果置信度太低,那就是"難以置信",就返回空字符串        if (pointer.get()<0.6d) {            return "";        } else {            // 如果置信度可信,就返回該元素對應(yīng)的年齡范圍            return AGES[max.x()];        }    }}
至此,編碼完成,按套路出牌讓咱們省下不少時(shí)間,接下來開始驗(yàn)證驗(yàn)證確保攝像頭工作正常,運(yùn)行PreviewCameraWithGenderAge類的main方法(再次提醒,main方法中文件的位置,注意是年齡檢測的模型文件,不是性別檢測的)天氣很冷,為了領(lǐng)到免費(fèi)盒飯,群眾演員早就等得不耐煩了,讓他站在攝像頭前,如下圖,年齡識別成功,且實(shí)時(shí)展示:至此,本地窗口預(yù)覽集成人臉檢測和年齡檢測的功能就完成了,得益于JavaCV的強(qiáng)大,整個(gè)過程是如此的輕松愉快,接下來請繼續(xù)關(guān)注欣宸原創(chuàng),《JavaCV的攝像頭實(shí)戰(zhàn)》系列還會呈現(xiàn)更多豐富的應(yīng)用;關(guān)于性別+年齡識別如果您關(guān)注過網(wǎng)上關(guān)于性別和年齡識別相關(guān)的技術(shù)文章,您會發(fā)現(xiàn)通常這些文章會將兩種識別集成在一起講,并且代碼的效果也是繼承了兩種識別的,如下圖:也行您會有疑問:欣宸為何不把兩種識別放在一篇文章和一個(gè)demo中,這樣內(nèi)容更完整demo也更強(qiáng)大?之所以分文兩篇,是因?yàn)槟挲g和性別識別的套路比較接近,如果在一篇文中講完,無非是多寫幾行代碼多打幾行字,不會對技術(shù)帶來提升,那還不如每篇只聚焦一個(gè)功能,把初始化、使用、資源釋放等技術(shù)點(diǎn)說清楚,至于單獨(dú)用還是組合用,留給聰明的讀者按自己的需求去自由組合即可歡迎關(guān)注博客園:程序員欣宸

學(xué)習(xí)路上,你不孤單,欣宸原創(chuàng)一路相伴...

標(biāo)簽:

返回頂部