前期的文章我們分享了人臉的識別以及如何進行人臉數據的訓練,本期文章我們結合人臉識別的
模型進行人臉年齡的檢測
人臉年齡的檢測步驟
1、首先需要進行人臉的檢測
2、把檢測到的人臉數據給年齡檢測模型去檢測
3、把檢測結果呈現到圖片上
<code>import numpy as np
import cv2
import os
AGE_LIST = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)",
\t"(38-43)", "(48-53)", "(60-100)"]
prototxtFacePath = "model/deploy.prototxt"
weightsFacePath = "model/res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtFacePath, weightsFacePath)
prototxtAgePath = "model/age_deploy.prototxt"
weightsAgePath = "model/age_net.caffemodel"
ageNet = cv2.dnn.readNet(prototxtAgePath, weightsAgePath)/<code>
初始化模型年齡段,由於模型是按照年齡段來進行訓練的,當然你也可以使用大量的數據,進行更準確的年齡模型訓練
然後cv2.dnn.readNet加載人臉識別的模型,可參考往期文章
順便在這裡介紹一下由人工智能研究所出品的專欄,人工智能目標檢測與目標追蹤
有興趣的小夥伴們可以一起探討學習
最後cv2.dnn.readNet加載人臉年齡的模型
<code>image = cv2.imread("image/img.jpg")
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),
\t(104.0, 177.0, 123.0))
faceNet.setInput(blob)
detections = faceNet.forward()/<code>
使用cv2.imread來讀取要檢測的圖片
image.shape來獲取圖片的尺寸
cv2.dnn.blobFromImage來計算圖片的blob值
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True,crop=False,ddepth = CV_32F )
1.image,這是傳入的,需要進行處理的圖像。
2.scalefactor,執行完減均值後,需要縮放圖像,默認是1,需要注意,scalefactor = 1 / \\sigma,這是真正乘上的值。
3.size,這是神經網絡,真正支持輸入的值。
4.mean,這是我們要減去的均值,可以是R,G,B均值三元組,或者是一個值,每個通道都減這值。如果執行減均值,通道順序是R、G、B。 如果,輸入圖像通道順序是B、G、R,那麼請確保swapRB = True,交換通道。
5.swapRB,OpenCV認為圖像 通道順序是B、G、R,而減均值時順序是R、G、B,為了解決這個矛盾,設置swapRB=True即可。
6.crop,如果crop裁剪為真,則調整輸入圖像的大小,使調整大小後的一側等於相應的尺寸,另一側等於或大於。然後,從中心進行裁剪。如果“裁剪”為“假”,則直接調整大小而不進行裁剪並保留縱橫比。
7.ddepth, 輸出blob的深度,選擇CV_32F or CV_8U
cv2.dnn.blobFromImage這個函數執行:
1.減均值
2.縮放
3.通道交換
等工作,主要對圖片進行預處理,以便神經網絡的學習分類
最後把圖片的blob值放入神經網絡,進行人臉的預測
<code>for i in range(0, detections.shape[2]):
\tconfidence = detections[0, 0, i, 2]
\tif confidence > 0.5:
\t\tbox = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
\t\t(startX, startY, endX, endY) = box.astype("int")
\t\tface = image[startY:endY, startX:endX]
\t\tfaceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227),(78.4263377603, 87.7689143744, 114.895847746),swapRB=False)
\t\tageNet.setInput(faceBlob)
\t\tpreds = ageNet.forward()
\t\ti = preds[0].argmax()
\t\tage = AGE_LIST[i]
\t\tageConfidence = preds[0][i]
\t\ttext = "{}: {:.2f}%".format(age, ageConfidence * 100)
\t\ty = startY - 10 if startY - 10 > 10 else startY + 10
\t\tcv2.rectangle(image, (startX, startY), (endX, endY),(0, 0, 255), 2)
\t\tcv2.putText(image, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)/<code>
detections.shape[2]來存放神經網絡檢測到的人臉,通過遍歷這個list
來獲取每個人臉的置信度,當置信度大於0.5時,我們認為是一個合格的人臉
startX, startY, endX, endY來獲取人臉在圖片中的座標
有了人臉的座標就可以把人臉這部分單獨提出來來計算人臉圖片的blob值
把人臉blob值放入年齡檢測模型中進行人臉年齡的檢測preds
preds[0].argmax把年齡段的每個概率進行對比,並提取最大概率的年齡段的index
age = AGE_LIST[i] 便可以得到我們檢測的人臉年齡
ageConfidence = preds[0][i] 人臉年齡的檢測置信度
最後把檢測到的數據呈現到圖片上並顯示圖片
<code>cv2.imshow("Image", image)
cv2.waitKey(0)/<code>
文章中提供的模型,年齡檢測是一個階段的檢測,若想得到更精確的年齡檢測,需要大量的數據進行計算訓練,當然,小夥伴們也可以使用人工智能研究所出品的:
wx小程序:AI人工智能工具
來進行人臉更多屬性的檢測
關於人臉性別的檢測,我們下期分享!
對opencv感興趣的小夥伴們可以買本屬於自己的書籍進行參考學習
閱讀更多 人工智能研究所 的文章