使用深度学习opencv 进行人脸年龄的实时检测
往期的文章我们分享了人脸的识别以及如何进行人脸年龄的检测,本期文章我们结合人脸识别的
模型进行人脸年龄的实时检测
人脸年龄的检测步骤
0、打开摄像头,获取图片数据
1、对图片进行人脸的检测
2、把检测到的人脸数据给年龄检测模型去检测
3、把检测结果实时呈现到图片上
import numpy as np
import cv2
import os
AGE_LIST = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)",
"(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)
初始化模型年龄段,由于模型是按照年龄段来进行训练的,当然你也可以使用大量的数据,进行更准确的年龄模型训练
然后cv2.dnn.readNet加载人脸识别的模型,可参考往期文章
顺便在这里介绍一下由人工智能研究所出品的专栏,人工智能目标检测与目标追踪
有兴趣的小伙伴们可以一起探讨学习
最后cv2.dnn.readNet加载人脸年龄的模型
与图片识别不一样的是,若需要实时识别,需要打开摄像头,进行图片的实时显示与识别
capture = cv2.VideoCapture()
time.sleep(2.0)
capture = cv2.VideoCapture() 这行代码便打开电脑配置的默认摄像头,当打开后,稍微延时,等待摄像头的打开,摄像头打开后,便可以获取视频帧的图片
while True:
ret, frame = capture.read()
frame = cv2.resize(frame, (400*600))
results = predict_age(frame, faceNet, ageNet) # 建立的新类
for result in results:
text = "{}: {:.2f}%".format(result ["age"][0], result ["age"][1] * 100)
(startX, startY, endX, endY) = result ["loc"]
y = startY - 10 if startY - 10 > 10 else startY + 10
cv2.rectangle(frame, (startX, startY), (endX, endY),
(0, 0, 255), 2)
cv2.putText(frame, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
cv2.stop()
cv2.destroyAllWindows()
人脸更多属性
在 while true 里面我们实时获取射频帧ret, frame = capture.read()
为了神经网络的快速计算,我们把图片resize一下frame = cv2.resize(frame, (400*600)),获取一个小尺寸的图片,(400*600)这里是指的图片的尺寸(宽400,长600)
然后把获取到的图片给神经网络进行预测判断,这里新建一个类,里面主要处理神经网络的年龄识别
这部分代码与往期文章代码一致,详细代码解析,可以参考往期文章:
当获取到结果后,我们实时显示在视频帧中
def predict_age(frame, faceNet, ageNet):
results = []
(h, w) = frame.shape[:2] #获取图片尺寸
blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),(104.0, 177.0, 123.0))#计算图片blob值
faceNet.setInput(blob)#人脸检测
detections = faceNet.forward()
for i in range(0, detections.shape[2]):#当检测到人脸后
confidence = detections[0, 0, i, 2]
if confidence > 0.5:#判断大于0.5置信度的人脸
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
face = frame[startY:endY, startX:endX]#获取人脸在图片中的位置
if face.shape[0] < 20 or face.shape[1] < 20:
continue#小的人脸忽略
faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227),(78.4263377603, 87.7689143744, 114.895847746),swapRB=False)
ageNet.setInput(faceBlob)
preds = ageNet.forward()#进行人脸年龄的识别
i = preds[0].argmax()
age = AGE_LIST[i]
ageConfidence = preds[0][i]
d = {"loc": (startX, startY, endX, endY), "age": (age, ageConfidence)}
results.append(d)#获取人脸的坐标数据,以及人脸的年龄数据
return results
文章中提供的模型,年龄检测是一个阶段的检测,若想得到更精确的年龄检测,需要大量的数据进行计算训练,当然,小伙伴们也可以使用人工智能研究所出品的:
小程序:AI人工智能工具
来进行人脸更多属性的检测