(資料圖片)
本篇概覽這里分類和匯總了欣宸的全部原創(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é)議 |
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)簽: