前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >教程 | 100行代码搞定实时视频人脸表情识别

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

作者头像
OpenCV学堂
发布于 2020-07-08 07:27:14
发布于 2020-07-08 07:27:14
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

好就没有写点OpenCV4 + OpenVINO的应用了,前几天上课重新安装了一下最新OpenVINO2020.3版本,实现了一个基于OpenCV+OpenVINO的Python版本人脸表情识别。100行代码以内,简单好用!

人脸检测

人脸检测使用了OpenCV中基于深度学习的人脸检测算法,实现了一个实时人脸检测,该模型还支持OpenVINO加速,所以是非常好用的,之前写过一篇文章专门介绍OpenCV DNN的人脸检测的

OpenCV4.x中请别再用HAAR级联检测器检测人脸,有更好更准的方法

表情识别模型

使用OpenVINO模型库中的emotions-recognition-retail-0003人脸表情模型,该模型是基于全卷积神经网络训练完成,使用ResNet中Block结构构建卷积神经网络。数据集使用了AffectNet表情数据集,支持五种表情识别,分别是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
('neutral', 'happy', 'sad', 'surprise', 'anger')

输入格式:NCHW=1x3x64x64 输出格式:1x5x1x1

代码实现

首先基于OpenCV实现人脸检测,然后根据检测得到的人脸ROI区域,调用表情识别模型,完成人脸表情识别,整个代码基于Python语言完成。

加载表情识别模型并设置输入与输出的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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/"

实现人脸检测与表情识别的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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

运行截图如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Ubuntu配置ADSL + Squid + Iptables代理服务器
一台双网卡服务器,安装Ubuntu Server 12.04,网卡 eth0 空置,eth1连接局域网,IP 192.168.1.1/24,先连接了宽带路由器。
星哥玩云
2022/07/03
1K0
CubieBoard 简单入门
大约一个月之前折腾的部分记录,当时没有完全完成,就着手其他事情了,这是存在Live Writer中的草稿,先发出来吧,后来花了一段时间移植Qt,一直遇到了点问题,并没有完全跑通,后续估计也没有时间再继续折腾这块了,关注着看下,如果有移植好的,后面再跟进。
全栈程序员站长
2022/09/06
6810
CubieBoard 简单入门
WinSCP+SecureCRT连接Ubuntu
WinSCP是一个Windows环境下使用的SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件
ElectricDeveloper
2021/08/18
1.5K0
Linux配置IP地址的方法
注:虚拟机系统通过克隆方式得到其他系统后,在同一网络中无法上网,很可能由于其网卡的UUID相同造成冲突引起的。 解决方案:
全栈程序员站长
2022/06/26
9K0
玩玩树莓派之自动连接无线路由器
前言:啥都没有,还是说说自己的心声,还是啥都没有,嘿嘿,又一段时间没有玩过树莓派了,连连接无线路由器都忘记啦,所以我是来记录记录此过程的。 ---- Step-One:手机安装Fing软件 安装此软件的目的是扫描局同一段域网的IP,想要ssh到树莓派必须知道IP的啦 ---- Step-Two:ssh到树莓派主机,既然都知道了树莓派IP那就ssh上去 ssh pi@172.16.168.125 #默认用户名为pi 密码为raspberry ---- Step-Three:修改网络配置文件/etc
AlicFeng
2018/06/08
7290
VMware虚拟机下ubuntu12配置NFS服务
摘要总结:本文主要介绍了如何在VMware虚拟机下安装Ubuntu 12,并配置NFS服务,包括服务器和客户端的安装、配置和测试。
Jack_Cui
2017/12/28
1.3K0
VMware虚拟机下ubuntu12配置NFS服务
第三章:hadoop安装配置,jps命令不能使用。apt-get命令不能下载jdk,缺少依赖包,设置静态ip后不能上网,ubuntu防火墙,ssh无密码登录
sudo apt-get update sudo apt-get install default-jre sudo apt-get install default-jdk
全栈程序员站长
2022/08/05
1.2K0
VirtualBox NAT host-only高级网络配置
本文主要讲解了如何通过VirtualBox的高级网络配置实现虚拟机互通、虚拟机与主机互通以及让虚拟机可以上网。包括Host-only、NAT、仅主机模式,以及Windows和Linux环境下如何实现SSH登录,还有自定义网段和网卡命名规则等高级配置。
王小雷
2018/01/02
2.7K0
VirtualBox NAT host-only高级网络配置
在 Debian Linux 上设置和配置网桥
如何你想为你的虚拟机分配 IP 地址并使其可从你的局域网访问,则需要设置网络桥接器。默认情况下,虚拟机使用 KVM 创建的专用网桥。但你需要手动设置接口,避免与网络管理员发生冲突。
用户8989785
2021/09/10
5.8K0
Kali-Security渗透系统配置记录
描述:Kail 是基于Debian的Linux发行版它的前身是BackTrack并且由Offensive Security Ltd维护和资助,设计用于渗透测试与取证的系统,系统里面集成了超过300个渗透测试工具复,受到广大的网络安全从业者与爱好者的追捧;
全栈工程师修炼指南
2020/10/26
1.1K0
windows、ubuntu、Red Hat、Solaris 单网卡绑定多个IP
 ========================================================
阳光岛主
2019/02/19
4.7K0
ssh、crt、filezilla等连接不上虚拟机
原因:虚拟机中没有安装ssh软件,安装后即可连接。 安装步骤: root@ubuntu :~$ sudo apt-get install openssh-server root@ubuntu :~$ ssh localhost(如果正常就表示安装成功) 接着在windows中用ssh、crt、filezilla连接虚拟机即可,连接前注意虚拟机中ip要配置好,具体静态ip修改如下: (此方法屡试不爽) nano /etc/network/interfaces interfaces
闵开慧
2018/03/30
3.1K0
Ubuntu 上搭建网桥的具体方法和步骤
网桥工作在数据链路层,起到的作用是把多个局域网连接起来,组成更大的局域网。它的功能主要有两点:过滤和转发,在本篇文章中重点为大家讲解一下Ubuntu 上搭建网桥具体方法。
会长君
2023/04/25
1.4K0
记录虚拟机桥接模式不能上网问题的解决方法「建议收藏」
开启主机的VMware DHCP Service 服务,按下win+R 打开运行小窗口,输入services.msc,回车打开服务管理器
全栈程序员站长
2022/08/12
8.4K1
记录虚拟机桥接模式不能上网问题的解决方法「建议收藏」
使用Ambari安装hadoop集群
      最近需要做些spark的工作,所以弄了几台dell7500就这么准备开始搭建集群,之前用过几台更破的台式机搭建过一次,折腾了半个月之久,终于成功搭建,这次不想走老路,所以网上查了一下,发现一个神器AMBARI,可以部署、管理集群,果然是个好东西,所以就拿来用,但是在安装的过程中碰到了许许多多的问题,所以现在把安装过程总结一下,放到这里,以方便下次安装或者其他有对ambari感兴趣的同学可以参考之。       安装过程大量查阅了网上的相关资料,主要是https://cwiki.apache.or
魏守峰
2018/04/28
1.3K0
Linux服务器基础网络配置
1.查看当前网络设置 ifconfig ifconfig eth0; #查看eth0接口网络设置 ifconfig -a #查看所有网络接口的信息 route 显示路由表 route | grep default 显示主机的默认网关。 ping -c 4 192.168.1.10 发送指定数量的数据包进行网络连接测试。 traceroute 192.168.1.10 测试与其他主机的网络连接路径。 hostname 显示当前主机名称。 ifdown eth0
字母哥博客
2020/09/23
8.3K0
linux中10个有用的IP命令配置静态IP路由
ip 命令是一个新的网络命令行实用程序,用于在 Linux 系统上为网络接口分配 IP 地址或配置/更新网络配置。 它是 iproute2 软件包的一部分,并提供多项网络管理任务,例如打开或关闭网络接口、分配和删除 IP 地址和路由、管理 ARP 缓存等等。 ip命令与旧的ifconfig 命令非常相似,但它的功能要强大得多,添加了更多的功能和能力。 如何配置静态 IP 地址 Internet 协议 (IPv4) 要在 Linux 中配置静态 IP 地址, 你需要更新或编辑网络配置文件以将静态 IP 地址分
入门笔记
2022/06/02
4K0
Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓
在我们的日常生活中,网络已经成为了不可或缺的一部分,而正确配置网络对于系统运行和通信至关重要。而 Linux 系统中的网络配置文件 /etc/network/interfaces 就像是网络世界的一本"说明书",它记录了系统中网络接口的种种参数和配置。但是,你是否真正了解过这个文件呢?本文将带你一起深入解析 /etc/network/interfaces,揭开它的神秘面纱,让你在网络世界中游刃有余!
一只牛博
2025/05/31
3240
树莓派远程及文件传输:以呼吸参数测量及获取为例
在组装完树莓派以后,我们需要让我们的树莓派编程“中央空调”,即:让其他电脑都可以通过远程/局域网来访问控制我们的树莓派我们的树莓派。
代码咖啡
2018/08/28
1.7K0
树莓派远程及文件传输:以呼吸参数测量及获取为例
Ubuntu 14.04下搭建MySQL主从服务器
MySQL的主从复制是异步的,分master/slave,在master端存在一个IO线程,而在slave下存在IO及Sql线程。
星哥玩云
2022/07/01
9400
推荐阅读
相关推荐
Ubuntu配置ADSL + Squid + Iptables代理服务器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档