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) < h else h-1
20            x1 = np.int32(left) if np.int32(left) > 0 else 0
21            x2 = np.int32(right) if np.int32(right) < w else w-1
22            roi = frame[y1:y2,x1:x2,:]
23            image = cv.resize(roi, (64, 64))
24            image = image.transpose((2, 0, 1))  # Change data layout from HWC to CHW
25            res = exec_net.infer(inputs={input_blob: [image]})
26            prob_emotion = res['prob_emotion']
27            probs = np.reshape(prob_emotion, (5))
28            txt = labels[np.argmax(probs)]
29            cv.putText(frame, txt, (np.int32(left), np.int32(top)), cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2)
30            cv.rectangle(frame, (np.int32(left), np.int32(top)),
31                         (np.int32(right), np.int32(bottom)), (0, 0, 255), 2, 8, 0)

打开摄像头或者视频文件,运行人脸表情识别的:

1if __name__ == "__main__":
 2    capture = cv.VideoCapture("D:/images/video/Boogie_Up.mp4")
 3    while True:
 4        ret, frame = capture.read()
 5        if ret is not True:
 6            break
 7        emotion_detect(frame)
 8        cv.imshow("emotion-detect-demo", frame)
 9        c = cv.waitKey(1)
10        if c == 27:
11            break

运行截图如下:

c49f6caa2c7d8f5cb82e937df4df4fc4.png

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

0ae66c477c534683469157ff814a1558.png

c5c8bce7d79cf53053f761646965a6d6.png

  • 11
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
钉钉打卡是一种办公考勤软件,通常需要使用手机进打卡,但有时可能会出现一些问题,如因为手机权限限制或系统限制而无法正常打卡。为了解决这些问题,一些开发者提出了用两代码来解决钉钉打卡的方法,免除了手机的root权限,并且可以永久防封。下面是具体的操作步骤: 1. 首先,需要准备一个具有无障碍权限的手机,无障碍权限可以在手机的设置中找到,打开该权限,并允许相关应用获得该权限。 2. 然后,下载并安装一款名为Auto.js Runner的应用,可以从某些应用市场或者开发者官网获取安装包。 3. 打开Auto.js Runner应用,在应用中创建一个新的脚本,在脚本编辑界面中输入下面的两代码: ```javascript launchApp("钉钉"); click(100, 400); ``` 上述代码中,第一代码的作用是启动钉钉应用,第二代码的作用是模拟点击屏幕上的坐标(100, 400),该坐标应该是“打卡”按钮在屏幕上的位置,具体坐标可以根据手机屏幕的大小进调整。 4. 保存并运这个脚本,脚本会自动打开钉钉应用,并点击屏幕上的“打卡”按钮,完成打卡操作。 使用这种方法可以实现免root永久防封的打卡操作,而且不需要进复杂的设置或者额外的权限获取。但需要注意的是,由于每个手机的屏幕大小和分辨率不同,所以需要根据实际情况进坐标的调整,以确保脚本的正确运。此外,开发者还需要遵守相关法律法规,合法使用此类工具,并确保不会对他人造成不良影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值