摘要:这篇博文介绍基于opencv:DNN模块自带的残差网络的人脸、性别、年龄识别系统,系统程序由OpenCv, PyQt5的库实现。如图系统可通过摄像头获取实时画面并识别其中的人脸表情,也可以通过读取图片识别,本文提供完整的程序文件并详细介绍其实现过程。博文要点如下:
关于相关的网络模型部分
汇总 | OpenCV DNN模块中支持的分类网络
1. 前言
在这个人工智能成为超级大热门的时代,人脸识别已成为其中的一项研究热点,而卷积神经网络、深度信念网络和多层感知器等相关算法在人脸面识别领域的运用最为广泛。
当前深度学习发展迅速,关于表情识别IEEE上面有许多质量很高的文章,里面介绍的是利用深度神经网络实现的面部表情识别,可以学习和参考。于是自己动手做了这个项目,这里特此将前期工作作个总结,希望能给类似工作的朋友带来一点帮助。这里使用的是已有的模型——如今CNN的主流框架之opencv的的残差网络
二、实现步骤
1.预先加载三个网络模型
2.对于识别部分实现
图片识别
[ ] 读取图片并显示到pyqt页面当中
[ ] 将图片传入到网络模型中
[ ] 将模型中识别后的结果返回到页面并显示
视频识别
[ ] 打开摄像头流/加载图像
[ ] 对每一帧图片进行传送到模型中
[ ] 返回识别后的视频,显示在pyqt当中
保存图片
[ ] 将当前视频帧保存在文件目录下
1、加载模型
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']
# Load network
ageNet = cv.dnn.readNet(ageModel, ageProto)
genderNet = cv.dnn.readNet(genderModel, genderProto)
faceNet = cv.dnn.readNet(faceModel, faceProto)
2、人脸检测
def getFaceBox(net, frame, conf_threshold=0.7):
frameOpencvDnn = frame.copy()
frameHeight = frameOpencvDnn.shape[0]
frameWidth = frameOpencvDnn.shape[1]
blob = cv.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False)
net.setInput(blob)
detections = net.forward()
bboxes = []
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)
bboxes.append([x1, y1, x2, y2])
cv.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight / 150)), 8)
return frameOpencvDnn, bboxes
源码