100行代码搞定实时视频人脸表情识别(附代码) | 您所在的位置:网站首页 › 动态监控摄像头表情包 › 100行代码搞定实时视频人脸表情识别(附代码) |
点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 本文转自|OpenCV学堂好就没有写点OpenCV4 + OpenVINO的应用了,前几天上课重新安装了一下最新OpenVINO2020.3版本,实现了一个基于OpenCV+OpenVINO的Python版本人脸表情识别。100行代码以内,简单好用! 人脸检测 人脸检测使用了OpenCV中基于深度学习的人脸检测算法,实现了一个实时人脸检测,该模型还支持OpenVINO加速,所以是非常好用的,之前写过一篇文章专门介绍OpenCV DNN的人脸检测的,直接看这里就可以了解详情: OpenCV4.x中请别再用HAAR级联检测器检测人脸,有更好更准的方法 表情识别模型 使用OpenVINO模型库中的emotions-recognition-retail-0003人脸表情模型,该模型是基于全卷积神经网络训练完成,使用ResNet中Block结构构建卷积神经网络。数据集使用了AffectNet表情数据集,支持五种表情识别,分别是: ('neutral', 'happy', 'sad', 'surprise', 'anger')输入格式:NCHW=1x3x64x64输出格式:1x5x1x1 代码实现 首先基于OpenCV实现人脸检测,然后根据检测得到的人脸ROI区域,调用表情识别模型,完成人脸表情识别,整个代码基于Python语言完成。 加载表情识别模型并设置输入与输出的代码如下: 1import cv2 as cv 2import numpy as np 3from openvino.inference_engine import IENetwork, IECore 4 5weight_pb = "D:/projects/opencv_tutorial/data/models/face_detector/opencv_face_detector_uint8.pb"; 6config_text = "D:/projects/opencv_tutorial/data/models/face_detector/opencv_face_detector.pbtxt"; 7 8model_xml = "emotions-recognition-retail-0003.xml" 9model_bin = "emotions-recognition-retail-0003.bin" 10 11labels = ['neutral', 'happy', 'sad', 'surprise', 'anger'] 12emotion_labels = ["neutral","anger","disdain","disgust","fear","happy","sad","surprise"] 13 14emotion_net = IENetwork(model=model_xml, weights=model_bin) 15ie = IECore() 16versions = ie.get_versions("CPU") 17input_blob = next(iter(emotion_net.inputs)) 18n, c, h, w = emotion_net.inputs[input_blob].shape 19print(emotion_net.inputs[input_blob].shape) 20 21output_info = emotion_net.outputs[next(iter(emotion_net.outputs.keys()))] 22output_info.precision = "FP32" 23exec_net = ie.load_network(network=emotion_net, device_name="CPU") 24root_dir = "D:/facedb/emotion_dataset/"实现人脸检测与表情识别的代码如下: 1def emotion_detect(frame): 2 net = cv.dnn.readNetFromTensorflow(weight_pb, config=config_text) 3 h, w, c = frame.shape 4 blobImage = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False); 5 net.setInput(blobImage) 6 cvOut = net.forward() 7 8 # 绘制检测矩形 9 for detection in cvOut[0,0,:,:]: 10 score = float(detection[2]) 11 if score > 0.5: 12 left = detection[3]*w 13 top = detection[4]*h 14 right = detection[5]*w 15 bottom = detection[6]*h 16 17 # roi and detect landmark 18 y1 = np.int32(top) if np.int32(top) > 0 else 0 19 y2 = np.int32(bottom) if np.int32(bottom) 0 else 0 21 x2 = np.int32(right) if np.int32(right) |
CopyRight 2018-2019 实验室设备网 版权所有 |