使用深度学习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人工智能工具

来进行人脸更多属性的检测