opencv人臉性別年齡檢測

一、引言

在計算機視覺領域,人臉分析是一個熱門且應用廣泛的研究方向。其中,人臉性別年齡檢測能夠自動識別圖像或視頻流中人臉的性別和年齡信息,具有諸多實際應用場景,如市場調研、安防監控、用戶個性化體驗等。OpenCV 作為一個強大的計算機視覺庫,提供了豐富的工具和預訓練模型來實現這一功能。

二、原理概述

人臉檢測:首先需要在輸入的圖像或視頻幀中檢測出人臉。OpenCV 常用的人臉檢測方法基于 Haar 級聯檢測器或基于深度學習的目標檢測算法(如 SSD、YOLO 等)。Haar 級聯檢測器通過構建一系列簡單的 Haar 特征,并利用 AdaBoost 算法訓練出一個強分類器來識別圖像中的人臉區域。基于深度學習的方法則通過在大規模人臉數據集上訓練卷積神經網絡(CNN),學習人臉的特征模式,從而實現更準確的人臉檢測。?
性別年齡預測:一旦檢測到人臉,將人臉區域進行預處理(如裁剪、歸一化等)后輸入到預訓練的性別年齡預測模型中。這些模型通常也是基于深度學習的 CNN 架構。在訓練過程中,模型學習到不同年齡和性別人臉的特征表示,通過對輸入人臉圖像的特征提取和分析,預測出該人臉對應的性別(通常為男性或女性)和年齡范圍(如兒童、青少年、成年人、老年人等)。

pip install opencv - python

下載預訓練模型:?
人臉檢測模型:對于 Haar 級聯人臉檢測,可以從 OpenCV 官方的 GitHub 倉庫下載haarcascade_frontalface_default.xml文件。該文件包含了訓練好的 Haar 級聯分類器參數。

性別年齡預測模型:性別年齡預測模型通常基于深度學習,如 Caffe 模型。可以從相關開源項目中下載預訓練的deploy_gender.prototxt和gender_net.caffemodel文件用于性別預測,以及deploy_age.prototxt和age_net.caffemodel文件用于年齡預測。這些模型在大規模人臉數據集上進行了訓練,具有一定的準確性。

準備輸入數據:準備用于檢測的圖像或視頻文件。確保圖像或視頻中的人臉清晰可見,光線條件良好,以提高檢測的準確性。

三、代碼實現

1.導入必要的庫

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np

導入cv2庫用于計算機視覺處理,PIL庫中的Image、ImageDraw、ImageFont用于在圖像上繪制中文字符,numpy庫用于數值計算。

2.加載模型文件路徑

獲取路徑:通過網盤分享的文件:model2
鏈接: https://pan.baidu.com/s/1gS-5xqOexYyMQ_wUQJTR0w 提取碼: ued3

faceProto = "model2/opencv_face_detector.pbtxt"
faceModel = "model2/opencv_face_detector_uint8.pb"
ageProto = "model2/deploy_age.prototxt"
ageModel = "model2/age_net.caffemodel"
genderProto = "model2/deploy_gender.prototxt"
genderModel = "model2/gender_net.caffemodel"

定義人臉檢測、年齡預測和性別預測模型的配置文件(.pbtxt或.prototxt)和權重文件(.pb或.caffemodel)的路徑。

3.讀取模型

ageNet = cv2.dnn.readNet(ageModel, ageProto)
genderNet = cv2.dnn.readNet(genderModel, genderProto)
faceNet = cv2.dnn.readNet(faceModel, faceProto)

使用cv2.dnn.readNet函數讀取年齡、性別和人臉檢測模型,以便后續用于推理

4.定義年齡和性別標簽列表及均值

ageList = ['0-2歲', '4-6歲', '8-12歲', '15-20歲', '25-32歲', '38-43歲', '48-53歲', '60-100歲']
genderList = ['男性', '女性']
mean = (78.4263377603, 87.7689143744, 114.895847746)

創建年齡和性別標簽列表,用于將模型預測的類別索引轉換為實際的年齡范圍和性別描述。同時定義了圖像歸一化所需的均值。

5.人臉檢測函數

def getBoxes(net, frame):frameHeight, frameWidth = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),[104, 117, 123], True, False)net.setInput(blob)detections = net.forward()faceBoxes = []for i in range(detections.shape[2]):confidence = detections[0, 0, i, 2]if confidence > 0.7:x1 = int(detections[0, 0, i, 3] * frameWidth)y1 = int(detections[0, 0, i, 4] * frameHeight)x2 = int(detections[0, 0, i, 5] * frameWidth)y2 = int(detections[0, 0, i, 6] * frameHeight)faceBoxes.append([x1, y1, x2, y2])cv2.rectangle(frame, (x1, y1), (x2, y2),(0, 255, 0), int(round(frameHeight / 150)), 6)return frame, faceBoxes

這個函數接受一個模型net和一個視頻幀frame作為輸入。首先獲取幀的高度和寬度,然后使用cv2.dnn.blobFromImage將幀轉換為適合模型輸入的 blob 格式,設置模型輸入并進行前向推理得到檢測結果。遍歷檢測結果,篩選出置信度大于 0.7 的檢測框,將其坐標轉換為實際圖像中的坐標并添加到faceBoxes列表中,同時在原幀上繪制檢測框。最后返回繪制了檢測框的幀和檢測框坐標列表。

6.在圖像上繪制中文字符的函數

def cv2AddchineseText(img, text, position, textColor=(0, 255, 0), textSize=30):if isinstance(img, np.ndarray):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontStyle = ImageFont.truetype("simhei.ttf", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

該函數用于在圖像上繪制中文字符。首先判斷輸入的圖像是否為 OpenCV 的numpy.ndarray格式,如果是則將其轉換為PIL的Image格式。然后使用ImageDraw和ImageFont設置字體樣式并在圖像上指定位置繪制文本,最后再將圖像轉換回 OpenCV 的BGR格式并返回

7.主循環

cap = cv2.VideoCapture(0)
while True:_, frame = cap.read()frame = cv2.flip(frame, 1)frame, faceBoxes = getBoxes(faceNet, frame)if not faceBoxes:print("當前鏡頭中沒有人")continuefor faceBox in faceBoxes:x1, y1, x2, y2 = faceBoxface = frame[y1:y2, x1: x2]blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), mean)genderNet.setInput(blob)genderOuts = genderNet.forward()gender = genderList[genderOuts[0].argmax()]ageNet.setInput(blob)ageOuts = ageNet.forward()age = ageList[ageOuts[0].argmax()]result = "{},{}".format(gender, age)frame = cv2AddchineseText(frame, result, (x1, y1 - 30))cv2.imshow("result", frame)if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()
cap.release()

初始化攝像頭設備,通過cv2.VideoCapture(0)打開默認攝像頭。進入無限循環,不斷讀取攝像頭的幀,使用cv2.flip對幀進行水平翻轉(以實現鏡像效果)。調用getBoxes函數進行人臉檢測,獲取繪制了檢測框的幀和檢測到的人臉框列表。如果沒有檢測到人臉,則打印提示信息并繼續下一次循環。對于檢測到的每一張人臉,提取人臉區域,將其轉換為適合性別和年齡模型輸入的 blob 格式,分別輸入到性別和年齡預測模型中進行推理,獲取預測結果并從標簽列表中找到對應的性別和年齡描述,將兩者組合成結果字符串,使用cv2AddchineseText函數在圖像上繪制結果。最后使用cv2.imshow顯示處理后的幀,當用戶按下Esc鍵(鍵值為 27)時,退出循環。循環結束后,釋放攝像頭資源并關閉所有 OpenCV 窗口。

完整代碼:

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as npfaceProto = "model2/opencv_face_detector.pbtxt"
faceModel = "model2/opencv_face_detector_uint8.pb"
ageProto = "model2/deploy_age.prototxt"
ageModel = "model2/age_net.caffemodel"
genderProto = "model2/deploy_gender.prototxt"
genderModel = "model2/gender_net.caffemodel"ageNet = cv2.dnn.readNet(ageModel, ageProto)
genderNet = cv2.dnn.readNet(genderModel, genderProto)
faceNet = cv2.dnn.readNet(faceModel, faceProto)ageList = ['0-2歲', '4-6歲', '8-12歲', '15-20歲', '25-32歲', '38-43歲', '48-53歲', '60-100歲']
genderList = ['男性', '女性']
mean = (78.4263377603, 87.7689143744, 114.895847746)def getBoxes(net, frame):frameHeight, frameWidth = frame.shape[:2]blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),[104, 117, 123], True, False)net.setInput(blob)detections = net.forward()faceBoxes = []for i in range(detections.shape[2]):confidence = detections[0, 0, i, 2]if confidence > 0.7:x1 = int(detections[0, 0, i, 3] * frameWidth)y1 = int(detections[0, 0, i, 4] * frameHeight)x2 = int(detections[0, 0, i, 5] * frameWidth)y2 = int(detections[0, 0, i, 6] * frameHeight)faceBoxes.append([x1, y1, x2, y2])cv2.rectangle(frame, (x1, y1), (x2, y2),(0, 255, 0), int(round(frameHeight / 150)), 6)return frame, faceBoxesdef cv2AddchineseText(img, text, position, textColor=(0, 255, 0), textSize=30):if isinstance(img, np.ndarray):  # 判斷是否為OpenCV圖片類型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontStyle = ImageFont.truetype("simhei.ttf", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)cap = cv2.VideoCapture(0)  # 裝載攝像頭
while True:_, frame = cap.read()frame = cv2.flip(frame, 1)frame, faceBoxes = getBoxes(faceNet, frame)if not faceBoxes:print("當前鏡頭中沒有人")continuefor faceBox in faceBoxes:x1, y1, x2, y2 = faceBoxface = frame[y1:y2, x1: x2]blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), mean)genderNet.setInput(blob)genderOuts = genderNet.forward()gender = genderList[genderOuts[0].argmax()]ageNet.setInput(blob)ageOuts = ageNet.forward()age = ageList[ageOuts[0].argmax()]result = "{},{}".format(gender, age)frame = cv2AddchineseText(frame, result, (x1, y1 - 30))cv2.imshow("result", frame)if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()
cap.release()

最后實現對人臉性別年齡的檢測

四、總結

通過 OpenCV,我們可以方便地實現人臉性別年齡檢測。利用其提供的預訓練模型和豐富的函數接口,結合簡單的代碼編寫,就能夠搭建起一個實用的人臉分析系統。希望本文能幫助你快速上手并在實際項目中應用這一技術

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76838.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【NLP】 22. NLP 現代教程:Transformer的訓練與應用全景解讀

🧠 NLP 現代教程:Transformer的訓練與應用全景解讀 一、Transformer的使用方式(Training and Use) 如何使用Transformer模型? Transformer 模型最初的使用方式有兩種主要方向: 類似 RNN 編碼-解碼器的架…

Spring Boot 集成 RocketMQ 全流程指南:從依賴引入到消息收發

前言 在分布式系統中,消息中間件是解耦服務、實現異步通信的核心組件。RocketMQ 作為阿里巴巴開源的高性能分布式消息中間件,憑借其高吞吐、低延遲、高可靠等特性,成為企業級應用的首選。而 Spring Boot 通過其“約定優于配置”的設計理念&a…

HTTPS實現安全的關鍵方法及技術細節

HTTPS(HyperText Transfer Protocol Secure)通過多種技術手段實現數據傳輸的安全性,其核心機制基于SSL/TLS協議,并結合數字證書、加密算法等技術。 SSL:Secure Sockets Layer,安全套接字層 TLS:…

Java【多線程】(8)CAS與JUC組件

目錄 1.前言 2.正文 2.1CAS概念 2.2CAS兩種用途 2.2.1實現原子類 2.2.2實現自旋鎖 2.3缺陷:ABA問題 2.4JUC組件 2.4.1Callable接口 2.4.2ReentrantLock(與synchronized對比) 2.4.3Semaphore信號量 2.4.4CountDownLatch 3.小結 1…

【Docker】離線安裝Docker

背景 離線安裝Docker的必要性,第一,在目前數據安全升級的情況下,很多外網已經基本不好訪問了。第二,如果公司有對外部署的需求,那么難免會存在對方只有內網的情況,那么我們就要做到學會離線安裝。 下載安…

MecAgent Copilot:機械設計師的AI助手,開啟“氛圍建模”新時代

MecAgent Copilot作為機械設計師的AI助手,正通過多項核心技術推動機械設計進入“氛圍建模”新時代。以下從功能特性、技術支撐和應用場景三方面解析其創新價值: 一、核心功能特性 ??智能草圖生成與參數化建模?? 支持自然語言輸入生成設計草圖和3D模型,如輸入“剖面透視…

MCU屏和RGB屏

一、MCU屏 MCU屏?:全稱為單片機控制屏(Microcontroller Unit Screen),在顯示屏背后集成了單片機控制器,因此,MCU屏里面有專用的驅動芯片。驅動芯片如:ILI9488、ILI9341、SSD1963等。驅動芯片里…

7.5 使用MobileNet v3進行圖像的區分

MobileNet v3是Google在2019年提出的輕量級卷積神經網絡結構,旨在提高在移動設備上的速度和準確性,廣泛的用于輕量級網絡。 MobileNet v3-Small的網絡結構如下,它的輸入是224x224的3通道彩色圖片。 使用過程如下: 1.創建模型、修改最終分類數量 #1.創建mobilenet_v3_small…

構建面向大模型訓練與部署的一體化架構:從文檔解析到智能調度

作者:汪玉珠|算法架構師 標簽:大模型訓練、數據集構建、GRPO、自監督聚類、指令調度系統、Qwen、LLaMA3 🧭 背景與挑戰 隨著 Qwen、LLaMA3 等開源大模型不斷進化,行業逐漸從“能跑通”邁向“如何高效訓練與部署”的階…

PostgreSQL技術大講堂 - 第86講:數據安全之--data_checksums天使與魔鬼

PostgreSQL技術大講堂 - 第86講,主題:數據安全之--data_checksums天使與魔鬼 1、data_checksums特性 2、避開DML規則,嫁接非法數據并合法化 3、避開約束規則,嫁接非法數據到表中 4、避開數據檢查,讀取壞塊中的數據…

【機器學習】機器學習筆記

1 機器學習定義 計算機程序從經驗E中學習,解決某一任務T,進行某一性能P,通過P測定在T上的表現因經驗E而提高。 eg:跳棋程序 E: 程序自身下的上萬盤棋局 T: 下跳棋 P: 與新對手下跳棋時贏的概率…

Ubuntu20.04 設置開機自啟

參考: Ubuntu20.04 設置開機自啟_ubuntu進bos系統-CSDN博客

數據庫中存儲過程的流程語句講解

一、流程語句講解 二、總結 一、流程語句講解 1.1 if語句講解 語法: IF condition THENstatements; ELSEIF condition THENstatements; ELSEstatements; END IF; 題目示例: # 判斷成績等級 # 輸入學生的編號,取出學生的第一門課,然后判斷…

kubernetes》》k8s》》ConfigMap 、Secret

configmap官網 ConfigMap是一種 API 對象,使用時, Pods 可以將其用作環境變量、命令行參數或者存儲卷中的配置文件。ConfigMap將配置和Pod解耦,更易于配置文件的更改和管理。ConfigMap 并不提供保密或者加密功能。 如果你想存儲的數據是機密的…

git在IDEA中使用技巧

git在IDEA中使用技巧 merge和rebase 參考:IDEA小技巧-Git的使用 git回滾、強推、代碼找回 參考:https://www.bilibili.com/video/BV1Wa411a7Ek?spm_id_from333.788.videopod.sections&vd_source2f73252e51731cad48853e9c70337d8e cherry pick …

Spring 事務失效的原因及解決方案全解析,來復習了

Spring 事務失效是指在使用 Spring 聲明式事務管理時,預期的事務行為(如事務的開啟、提交、回滾等)未按預期執行,導致數據操作未滿足 ACID 特性(原子性、一致性、隔離性、持久性),從而引發數據不…

「出海匠」借助CloudPilot AI實現AWS降本60%,支撐AI電商高速增長

🔎公司簡介 「出海匠」(chuhaijiang.com)是「數繪星云」公司打造的社交內容電商服務平臺,專注于為跨境生態參與者提供數據支持與智能化工作流。平臺基于大數據與 AI 技術,幫助商家精準分析市場趨勢、優化運營策略&…

python每日一練

題目一 輸入10個整數,輸出其中不同的數,即如果一個數出現了多次,只輸出一次(要求按照每一個不同的數第一次出現的順序輸出)。 解題 錯誤題解 a list(map(int,input().split())) b [] b.append(a[i]) for i in range(2,11):if a[i] not in b:b.append(a[i]) print(b)但是會…

Docker實戰:從零構建高可用的MySQL主從集群與Redis集群

在分布式系統架構中,數據庫集群是保障數據高可用和性能的關鍵組件。本文將通過Docker技術,手把手教你搭建MySQL主從集群和Redis Cluster,并分享獨創的優化技巧與運維實戰經驗。 一、為什么選擇Docker部署集群? 傳統數據庫集群搭…

STM32電機庫 電機控制特性

ST MC FW庫提供FOC和六步法兩種電機控制方式。這使得它能夠驅動永磁同步電機 (PMSM) 和無刷直流電機 (BLDC)。FOC 更適合 PMSM,而六步法更適合 BLDC 電機。該固件可以驅動內嵌式PMSM 和標貼式PMSM。 ST Motor Control 固件庫提供以下功能: FOC SVPWM 生成: 可配置的 PW…