专栏首页贾志刚-OpenCV学堂教程 | 100行代码搞定实时视频人脸表情识别

教程 | 100行代码搞定实时视频人脸表情识别

好就没有写点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

运行截图如下:

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用ImageAI快速构建常见对象检测应用

    纯Python的快速对象检测训练与测试平台,基于tensorflow+opencv构建,支持

    OpenCV学堂
  • 人脸识别:insightface自定义数据集制作 | 附练手数据集

    简单来讲,人脸识别这个问题,就是给定两个人脸,然后判定他们是不是同一个人,这是它最原始的定义。它有很多应用场景,比如银行柜台、海关、手机解锁、酒店入住、网吧认证...

    OpenCV学堂
  • 轻松学Pytorch –使用torchvision实现对象检测

    大家好,前面一篇文章介绍了torchvision的模型ResNet50实现图像分类,这里再给大家介绍一下如何使用torchvision自带的对象检测模型Fast...

    OpenCV学堂
  • rest和restful

    开发了那么久,对接接口已经很老练了,但是对于rest和restful概念真的没有听过,而且也没有用过get、post之外的方法。

    wade
  • Discuz! 论坛使用云数据库可能遭遇随机的“The table XXX is full”异常

    一个Discuz! 论坛在腾讯云已经良好工作了很久,不久前突然随机出现以下错误:从字面意思上看,就是数据表“common_visit”满了写不进去,最可能的就是...

    黄希彤
  • Python开发简单记事本

      本文的操作环境:ubuntu,Python2.7,采用的是Pycharm进行代码编辑,个人很喜欢它的代码自动补齐功能。

    oYabea
  • 一图读懂产业互联时代的政企智能安全管理

    产业互联网高速发展,在各行各业深化数字化转型的关键节点,政企机构的网络安全建设面临着更高要求:

    腾讯安全
  • 微软以Apache许可协议开源ASP.NET MVC

    微软开发部门副总裁Scott Guthrie宣布,ASP.NET MVC及相关项目将在Apache许可证下开源,托管在CodePlex上。ASP.NET MVC...

    张善友
  • 需求评审之实战演练

    我在面试时,经常会出一道简易计算器需求的编程题,完了之后再让写一下这个需求的用例,题目看起来很简单,但是几乎可以把我想了解到的基础测试理论全部都涵盖了。

    sylan215
  • 权威发布丨麻省理工科技评论公布2016年十大突破技术

    麻省理工科技评论从2001年开始,每年都会公布“十大突破技术”,并预计其对人类生活和社会的重大影响。这些技术代表了当前世界科技的发展前沿和未来发展方向,反映了近...

    灯塔大数据

扫码关注云+社区

领取腾讯云代金券