主頁 > 後端開發 > JavaCV的攝像頭實戰之十三:年齡檢測

JavaCV的攝像頭實戰之十三:年齡檢測

2023-07-04 07:36:35 後端開發

歡迎訪問我的GitHub

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

本篇概覽

  • 本文是《JavaCV的攝像頭實戰》系列的第十三篇,前文《JavaCV的攝像頭實戰之十二:性別檢測》中,借助訓練好的卷積神經網路模型開發出了識別性別的應用,今天在前文基礎上做少量改動,實作年齡識別的功能,效果如下圖:
    在這里插入圖片描述

  • 應用主要功能如下圖所示:
    在這里插入圖片描述

  • 如果您看過《JavaCV的攝像頭實戰》系列的其他文章,就會發現上圖中只有藍色部分是新增內容,其余的步驟都是固定套路,《JavaCV的攝像頭實戰》系列的每一個應用玩的都是相同套路:別看步驟挺多,其實都是同一個流程

關于性別和年齡檢測

  • 使用卷積神經網路推理性別和年齡的更多技術細節,這里有更詳細的說明:
    https://talhassner.github.io/home/publication/2015_CVPR
  • 本篇會使用已訓練好的Caffe 模型,訓練該模型的資料來自Flickr相冊,通過從 iPhone5(或更高版本)智能手機設備自動上傳組裝而成,并由其作者根據知識共享 (CC) 許可向公眾發布,共有26580張照片,涉及2284人,這些人的年齡一共被標識成八組:(0-2、4-6、8-13、15-20、25-32、38-43、48-53、60 -)
  • 關于資料源的更多詳細,請參考: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):
名稱 鏈接 備注
專案主頁 https://github.com/zq2599/blog_demos 該專案在GitHub上的主頁
git倉庫地址(https) https://github.com/zq2599/blog_demos.git 該專案原始碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]:zq2599/blog_demos.git 該專案原始碼的倉庫地址,ssh協議
  • 這個git專案中有多個檔案夾,本篇的原始碼在javacv-tutorials檔案夾下,如下圖紅框所示:
    在這里插入圖片描述
  • javacv-tutorials里面有多個子工程,《JavaCV的攝像頭實戰》系列的代碼在simple-grab-push工程下:
    在這里插入圖片描述

準備:檔案下載

  • 本次實戰需要三個檔案:
  1. 人臉檢測的模型檔案:https://raw.github.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml
  2. 年齡識別的組態檔:https://raw.githubusercontent.com/GilLevi/AgeGenderDeepLearning/master/age_net_definitions/deploy.prototxt
  3. 年齡識別的模型檔案:https://raw.githubusercontent.com/GilLevi/AgeGenderDeepLearning/master/models/age_net.caffemodel
  • 我已將上述檔案打包上傳到CSDN,您也可以在CSDN下載(無需積分):
    https://download.csdn.net/download/boling_cavalry/70730586

準備:代碼介面簡介

  • 編碼前,先把涉及到的所有java檔案說明一下:
  1. AbstractCameraApplication.java:主程式的抽象類,這里面定義了打開攝像頭、抓取每一幀、處理每一幀的基本框架,避免每個應用都把這些事情重復做一遍
  2. PreviewCameraWithGenderAge.java:主程式,是AbstractCameraApplication的實作類,本次實戰的核心功能人臉檢測和年齡檢測,都委托給它的成員變數detectService去完成
  3. DetectService.java:檢測服務的介面,里面定義了幾個重要的api,例如初始化、處理每一幀、釋放資源等
  4. AgeDetectService.java:前文GenderDetectService的子類,僅僅是處理推理結果的邏輯與前文的性別識別略有不同,其余功能完全繼承自性別識別
  • 以上代碼,咱們已經在前文寫過一次了,今天當然不需要重復再做一次,今天是在上述代碼基礎上做兩處小幅度修改,接下來就開始吧

改動一:主程式(PreviewCameraWithGenderAge.java)

  • 卷積神經網路所需的配置和模型檔案,是在主程式的main方法內設定的,上一章是性別檢測,這里替換為年齡檢測的檔案,如下所示,請您將路徑換為自己電腦上的檔案路徑:
    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);
    }

改動二:檢測服務實作(GenderDetectService的子類)

  • 前文《性別檢測》的核心功能都集中在GenderDetectService.java中,今天要做的年齡檢測,除了推理結果的處理邏輯略有不同,其余功能與《性別檢測》完全一致
  • 所以,實作年齡檢測的最簡單方法就是寫一個子類繼承GenderDetectService,這個子類中只有神經網路推理結果的處理邏輯,完整代碼如下,注釋中已經有了詳細說明,就不多贅述了:
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 檢測年齡的服務
 * @date 2021/12/3 8:09
 */
@Slf4j
public class AgeDetectService extends GenderDetectService {

    /**
     * 設定訓練模型時劃分的年齡段,所以推理結果也是這樣的年齡段
     */
    private static final String[] AGES = new String[]{"0-2", "4-6", "8-13", "15-20", "25-32", "38-43", "48-53", "60-"};

    /**
     * 構造方法,在此指定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理解為一個陣列,
        // 第一個元素是"0-2"的置信度
        // 第二個元素是"4-6"的置信度
        // 第三個元素是"8-13"的置信度
        // 第四個元素是"15-20"的置信度
        // ...
        // 第八個元素是"60-"的置信度
        // minMaxLoc方法幫忙我們找出了置信度最高的元素,max是元素位置,pointer是這個元素的置信度
        minMaxLoc(prob, null, pointer, null, max, null);

        // 如果置信度太低,那就是"難以置信",就回傳空字串
        if (pointer.get()<0.6d) {
            return "";
        } else {
            // 如果置信度可信,就回傳該元素對應的年齡范圍
            return AGES[max.x()];
        }
    }
}
  • 至此,編碼完成,按套路出牌讓咱們省下不少時間,接下來開始驗證

驗證

  • 確保攝像頭作業正常,運行PreviewCameraWithGenderAge類的main方法(再次提醒,main方法中檔案的位置,注意是年齡檢測的模型檔案,不是性別檢測的)
  • 天氣很冷,為了領到免費盒飯,群眾演員早就等得不耐煩了,讓他站在攝像頭前,如下圖,年齡識別成功,且實時展示:
    在這里插入圖片描述
  • 至此,本地視窗預覽集成人臉檢測和年齡檢測的功能就完成了,得益于JavaCV的強大,整個程序是如此的輕松愉快,接下來請繼續關注欣宸原創,《JavaCV的攝像頭實戰》系列還會呈現更多豐富的應用;

關于性別+年齡識別

  • 如果您關注過網上關于性別和年齡識別相關的技術文章,您會發現通常這些文章會將兩種識別集成在一起講,并且代碼的效果也是繼承了兩種識別的,如下圖:
    在這里插入圖片描述
  • 也行您會有疑問:欣宸為何不把兩種識別放在一篇文章和一個demo中,這樣內容更完整demo也更強大?
  • 之所以分文兩篇,是因為年齡和性別識別的套路比較接近,如果在一篇文中講完,無非是多寫幾行代碼多打幾行字,不會對技術帶來提升,那還不如每篇只聚焦一個功能,把初始化、使用、資源釋放等技術點說清楚,至于單獨用還是組合用,留給聰明的讀者按自己的需求去自由組合即可

歡迎關注博客園:程式員欣宸

學習路上,你不孤單,欣宸原創一路相伴...

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556514.html

標籤:其他

上一篇:提升性能的利器:深入決議SectionReader

下一篇:返回列表

標籤雲
其他(162008) Python(38266) JavaScript(25520) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7281) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1983) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • JavaCV的攝像頭實戰之十三:年齡檢測

    ### 歡迎訪問我的GitHub > 這里分類和匯總了欣宸的全部原創(含配套原始碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《JavaCV的攝像頭實戰》系列的 ......

    uj5u.com 2023-07-04 07:36:35 more
  • 提升性能的利器:深入決議SectionReader

    # 一. 簡介 本文將介紹 Go 語言中的 `SectionReader`,包括 `SectionReader`的基本使用方法、實作原理、使用注意事項。從而能夠在合適的場景下,更好得使用`SectionReader`型別,提升程式的性能。 # 二. 問題引入 這里我們需要實作一個基本的HTTP檔案服 ......

    uj5u.com 2023-07-03 07:38:51 more
  • 初識識別符號

    關鍵字 abstractassertbooleanbreakbyte case catch char class const continue default do double else enum extends final finally float for goto if implementi ......

    uj5u.com 2023-07-03 07:38:47 more
  • [滲透測驗]—7.4 逆向工程和二進制破解技術

    在本章節中,我們將深入學習逆向工程和二進制破解技術。我們將盡量詳細、通俗易懂地講解,并提供盡可能多的實體。 ## 1.1 逆向工程概述 逆向工程是指從軟體的二進制檔案中提取資訊,以了解其作業原理和設計思路的程序。逆向工程的主要目的是對軟體進行分析、除錯、修改等操作,以實作特定目的(如安全分析、病毒分 ......

    uj5u.com 2023-07-03 07:38:41 more
  • Java雜記————object.getClass()和object.class以及Java中的t

    不說廢話,直接上干貨: (注意大小寫:object為物件,Object為類) 1,object.getClass()它是Object類的實體方法,回傳一個物件運行時的類的Class物件,換句話說,它回傳的是物件具體型別的類物件。 2,Object.class 這是java語言的一種語法糖,用來回傳一 ......

    uj5u.com 2023-07-03 07:38:33 more
  • 基于嵌入式Tomcat的War包啟動器

    # 前言 最近針對java專案的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等 發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則復雜對于小白很不友好,也難以接入到自定義的部署工具/平臺中 之前開發的Jar包部署平臺是servlet ......

    uj5u.com 2023-07-03 07:38:28 more
  • 【numpy基礎】--陣列索引

    陣列索引是指在`numpy`陣列中參考特定元素的方法。`numpy`的陣列索引又稱為`fancy indexing`,比其他編程語言的索引強大很多。 # 1. 選取資料 numpy的索引除了像其他語言一樣選擇一個元素,還可以間隔著選取多個元素,也可以用任意的順序選取元素。 比如一維陣列: ```py ......

    uj5u.com 2023-07-03 07:37:24 more
  • urllib+BeautifulSoup爬取并決議2345天氣王歷史天氣資料

    urllib+BeautifulSoup爬取并決議2345天氣王歷史天氣資料 網址:[東城歷史天氣查詢_歷史天氣預報查詢_2345天氣預報](https://tianqi.2345.com/wea_history/71445.htm) ![image-20230702161423470](https ......

    uj5u.com 2023-07-03 07:31:55 more
  • JavaCV的攝像頭實戰之十二:性別檢測

    ### 歡迎訪問我的GitHub > 這里分類和匯總了欣宸的全部原創(含配套原始碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《JavaCV的攝像頭實戰》系列的 ......

    uj5u.com 2023-07-01 07:45:34 more
  • [滲透測驗]—7.2 社會工程學攻擊技術

    在本章節中,我們將學習社會工程學攻擊技術,包括釣魚、身份欺詐等。我們會盡量詳細、通俗易懂地講解,并提供盡可能多的實體。 ### 1.1 社會工程學概述 社會工程學是一種利用人際交往中的心理因素來獲取資訊、權限或其他目標的手段。與技術性攻擊手段相比,社會工程學更側重于利用人的弱點,如信任、懶惰、貪婪等 ......

    uj5u.com 2023-07-01 07:44:29 more