注意:本文引用自專業人工智能社區Venus AI
更多AI知識請參考原站 ([www.aideeplearning.cn])
性別和年齡檢測 Python 項目
首先介紹性別和年齡檢測的高級Python項目中使用的專業術語
什么是計算機視覺?
計算機視覺是使計算機能夠像人類一樣查看和識別數字圖像和視頻的研究領域。它面臨的挑戰很大程度上源于對生物視覺的有限理解。計算機視覺涉及獲取、處理、分析和理解數字圖像,以從現實世界中提取高維數據,從而生成可用于做出決策的符號或數字信息。該過程通常包括對象識別、視頻跟蹤、運動估計和圖像恢復等實踐。
什么是 OpenCV?
OpenCV是開源計算機視覺的縮寫。顧名思義,它是一個開源計算機視覺和機器學習庫。該庫能夠處理實時圖像和視頻,同時還具有分析功能。它支持深度學習框架Tensorflow、Caffe 和 PyTorch。
什么是CNN?
CNN即卷積神經網絡,是一種廣泛用于圖像識別和處理的深度神經網絡 (DNN) 。它具有輸入層和輸出層以及多個隱藏層,其中許多是卷積層。在某種程度上,CNN 是正則化的多層感知器。
性別和年齡檢測——目標
構建一個性別和年齡檢測器,可以在 Adience 數據集上使用深度學習模型來大致猜測圖片中人(臉部)的性別和年齡。
性別和年齡檢測——關于該項目
在這個 Python 項目中,我們將使用深度學習從單張臉部圖像中準確識別一個人的性別和年齡。我們將使用Tal Hassner 和 Gil Levi訓練的模型。預測的性別可以是“男性”和“女性”之一,預測的年齡可以是以下范圍之一 – (0 – 2)、(4 – 6)、(8 – 12)、(15 – 20) 、(25 – 32)、(38 – 43)、(48 – 53)、(60 – 100)(最終 softmax 層中的 8 個節點)。由于化妝、燈光、障礙物和面部表情等因素,很難從單張圖像中準確猜測出確切的年齡。因此,我們將其視為分類問題,而不是回歸問題。項目的結果展示動態圖如下所示,請點擊觀看:
ev_20240225_131028
CNN 架構
這個 python 項目的卷積神經網絡很簡單,有 3 個卷積層:
- 卷積層:96 個節點,卷積核大小 7
- 卷積層:256 個節點,卷積核大小 5
- 卷積層:384 個節點,卷積核大小 3
它有 2 個全連接層,每個層有 512 個節點,以及一個 softmax 類型的最終輸出層。
要開始 python 項目,我們將:
- 檢測人臉
- 分為男/女
- 分為 8 個年齡范圍之一
- 將結果放在圖像上并顯示
數據集
對于這個 python 項目,我們將使用 Adience 數據集;該數據集可在公共領域使用,您可以在此處找到它。該數據集作為人臉照片的基準,包含各種現實世界的成像條件,如噪聲、照明、姿勢和外觀。這些圖像是從 Flickr 相冊中收集的,并根據知識共享 (CC) 許可進行分發。它共有 26,580 張照片,涉及 8 個年齡段(如上所述)的 2,284 名拍攝對象,大小約為 1GB。我們將使用的模型已經在此數據集上進行了訓練。
先決條件
您需要安裝 OpenCV (cv2) 才能運行該項目。可以用 pip- 來做到這一點
??????pip install opencv-python
您需要的其他包是 math 和 argparse,它們是標準 Python 庫的一部分。
項目的目錄結構
項目的目錄結構如下:
- opencv_face_ detector.pbtxt
- opencv_face_ detector_uint8.pb
- Age_deploy.prototxt
- Age_net.caffemodel
- gander_deploy.prototxt
- gander_net.caffemodel
- main.py
- 一示例的圖片
關于上述文件類型的解釋:
- .pb文件:這是一個TensorFlow用于保存模型的文件格式。它包含了模型的結構(也就是神經網絡的架構)和模型訓練后的權重(即模型在訓練過程中學到的信息)。使用這個文件,我們可以運行一個已經訓練好的模型來進行面部檢測。
- .pbtxt文件:與.pb文件類似,但它以文本格式存儲protobuf數據,而不是二進制格式。這使得文件內容可以直接閱讀和編輯,但通常大小會更大。
- TensorFlow文件:TensorFlow是一個流行的機器學習框架,用于創建和訓練神經網絡。.pb和.pbtxt文件都是TensorFlow用來保存模型的文件格式。
- .prototxt文件:這些文件用于描述神經網絡的結構,即網絡中每一層應該如何構建。這對于構建用于年齡和性別識別的模型特別重要。
- .caffemodel文件:這種文件格式是Caffe框架的一部分,另一個流行的機器學習框架。.caffemodel文件保存了訓練后的模型參數,即網絡每一層的權重和偏置。這對于運行已經訓練好的年齡和性別識別模型至關重要。
注意:上述這些文件是博主將項目編譯之后得到的結果,而不是原始項目代碼。這些文件類型通常用于存儲訓練好的模型和它們的配置,而不是用于存儲原始的源代碼。原代碼詳見Github:https://github.com/eranid/adience_align/tree/master
main.py腳本詳解:
導入庫:
import cv2
: 導入 OpenCV 庫,用于計算機視覺相關任務。import math
: 導入數學庫,提供數學運算支持。import argparse
: 導入參數解析庫,用于解析命令行參數。
import cv2
import math
import argparse
highlightFace 函數:
- 這個函數用于在圖像中突出顯示人臉。
frame
: 要處理的圖像。conf_threshold
: 用于確定檢測是否有效的置信度閾值。- 函數首先創建圖像的副本,然后根據圖像的尺寸生成一個 blob(神經網絡輸入)。
- 使用提供的神經網絡 (
net
) 對 blob 進行前向傳播,以檢測圖像中的人臉。 - 檢測到的每個人臉都被添加到?
faceBoxes
?列表中,并在圖像上繪制矩形框以突出顯示人臉。 - 返回處理后的圖像和檢測到的人臉框列表。?
def highlightFace(net, frame, conf_threshold=0.7):frameOpencvDnn=frame.copy()frameHeight=frameOpencvDnn.shape[0]frameWidth=frameOpencvDnn.shape[1]blob=cv2.dnn.blobFromImage(frameOpencvDnn, 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>conf_threshold: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(frameOpencvDnn, (x1,y1), (x2,y2), (0,255,0), int(round(frameHeight/150)), 8)return frameOpencvDnn,faceBoxes
解析命令行參數:?
- 使用?
argparse
?庫來解析命令行輸入的參數。這里解析了?--image
?參數,允許用戶指定一個圖像文件的路徑。 - 若不指定,默認使用攝像頭采集當前畫面進行實時檢測。
parser=argparse.ArgumentParser()
parser.add_argument('--image')args=parser.parse_args()
加載模型:
- 指定了用于人臉檢測、年齡和性別預測的模型文件的路徑。
- 使用?
cv2.dnn.readNet
?從這些路徑加載對應的模型。 MODEL_MEAN_VALUES
: 在預處理圖像時用于歸一化的均值。ageList
?和?genderList
: 分別包含年齡范圍和性別類別的列表。
faceProto="opencv_face_detector.pbtxt"
faceModel="opencv_face_detector_uint8.pb"
ageProto="age_deploy.prototxt"
ageModel="age_net.caffemodel"
genderProto="gender_deploy.prototxt"
genderModel="gender_net.caffemodel"MODEL_MEAN_VALUES=(78.4263377603, 87.7689143744, 114.895847746)
ageList=['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']
genderList=['Male','Female']faceNet=cv2.dnn.readNet(faceModel,faceProto)
ageNet=cv2.dnn.readNet(ageModel,ageProto)
genderNet=cv2.dnn.readNet(genderModel,genderProto)
處理視頻流:
- 使用?
cv2.VideoCapture
?打開視頻源(從文件或攝像頭)。 - 在一個循環中讀取每一幀圖像,并使用?
highlightFace
?函數檢測人臉。
video=cv2.VideoCapture(args.image if args.image else 0)
性別和年齡預測:
- 對于檢測到的每個人臉,截取人臉區域并為性別和年齡預測網絡準備輸入 blob。
- 運行性別和年齡預測網絡,并從?
genderList
?和?ageList
?中獲取預測結果。 - 將預測結果(性別和年齡)打印出來,并在圖像上繪制包含這些信息的文本。
- 使用?
cv2.imshow
?顯示帶有預測結果的圖像。 - 循環持續進行,直到用戶按鍵中斷。
padding=20
while cv2.waitKey(1)<0:hasFrame,frame=video.read()if not hasFrame:cv2.waitKey()breakresultImg,faceBoxes=highlightFace(faceNet,frame)if not faceBoxes:print("No face detected")for faceBox in faceBoxes:face=frame[max(0,faceBox[1]-padding):min(faceBox[3]+padding,frame.shape[0]-1),max(0,faceBox[0]-padding):min(faceBox[2]+padding, frame.shape[1]-1)]blob=cv2.dnn.blobFromImage(face, 1.0, (227,227), MODEL_MEAN_VALUES, swapRB=False)genderNet.setInput(blob)genderPreds=genderNet.forward()gender=genderList[genderPreds[0].argmax()]print(f'Gender: {gender}')ageNet.setInput(blob)agePreds=ageNet.forward()age=ageList[agePreds[0].argmax()]print(f'Age: {age[1:-1]} years')cv2.putText(resultImg, f'{gender}, {age}', (faceBox[0], faceBox[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,255), 2, cv2.LINE_AA)cv2.imshow("Detecting age and gender", resultImg)
性別和年齡檢測的 Python 項目示例?
除了捕獲攝像頭畫面進行檢測外,腳本也支持在我們自己的一些圖像上嘗試這個性別和年齡分類器。
我們將進入命令提示符,使用圖像選項運行腳本并指定要分類的圖像:
輸入:
pthon main.py --image girl2.jpg
輸出:
?
資源:
在這個 python 項目中,我們實現了一個 CNN 來從單張臉部圖片或視頻流中檢測性別和年齡。
項目代碼壓縮包和項目的數據集,請原站 ([www.aideeplearning.cn])
如果需要項目的原代碼,請訪問github:
GilLevi/AgeGenderDeepLearning on GitHub.
??版權聲明
文章版權歸作者所有,未經允許,請勿轉載,私自轉載將嚴厲追究法律責任。