100行代码搞定实时视频人脸表情识别(附代码) 您所在的位置:网站首页 动态监控摄像头表情包 100行代码搞定实时视频人脸表情识别(附代码)

100行代码搞定实时视频人脸表情识别(附代码)

2023-05-25 12:32| 来源: 网络整理| 查看: 265

点击上方“小白学视觉”,选择加"星标"或“置顶”

重磅干货,第一时间送达 本文转自|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 实验室设备网 版权所有