人脸表情识别系统的设计与实现(含UI界面,有完整代码)

人脸表情识别系统的设计与实现(含UI界面,有完整代码)

这是之前本科做的毕设,当时使用的是keras搭建了一个简单的神经网络作为入门实现了在fer2013人脸表情数据集上的表情分类,并移植到了树莓派上,但是当时的分类准确率并不高。后来研究生深度学习课程使用pytorch框架又重新做了一下该小项目,使用的数据集是北邮团队的RAF-DB(Real-world Affective Faces Database)中的单一表情数据集,模型使用的是RepVGG,最终在验证集上的准确率是77%左右,仍然有待提高。

代码已经放在我的github,若帮助到大家,希望大家点个星星。

1 简介

整个流程大概分为两步:
第一步训练模型阶段,即直接使用人脸表情去训练数据集,然后将训练好的模型保存下来。
第二步是推理阶段,也就是对真实世界的图像中的人脸进行表情的分类,那么这就需要我们先检测出图像中的人脸,然后再对该人脸进行表情的分类,所以推理阶段涉及到两个深度学习小领域:目标检测和物体分类
整个项目的流程大概如下图所示:
在这里插入图片描述

2 数据集

RAF-DB(Real-world Affective Faces Database),该数据集是由北邮的团队在网络上爬取得到,网址link,有单一表情类数据和复合表情数据集,这里我使用的数据集为单一表情数据集。分为7类,包括Surprised、Fear、Disgust、Happy、Sad、Angry、Neutral,图片形状大小为100×100×3,我自己设置的训练集是12271张,验证集是3086张,测试集是直接使用的现实世界的图片。其中训练集和测试集的样本大概如下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 人脸表情特征提取网络

本文使用的是发在CVPR2021年的网络RepVGG,github网址link,该网络模型借鉴了ResNet的残差结构,以一系列的下采样模块构成。与之前大多数CNN网络不同的是在推理阶段,作者采用结构重参数化技术将短路连接和1×1卷积全部转换成3×3的卷积核以加快推理速度,如下图所示。
在这里插入图片描述

4 人脸识别网络

在将人脸表情分类网络训练好并转换成推理阶段的网络后,就可以进行在真实图片上的人脸表情识别了。但是在进行表情识别之前,需要我们先将图片中的人脸识别出来,并将其reshape成100×100的图片大小然后输入到推理阶段的RepVGG。因此涉及到目标检测算法,这里我使用的是SSD算法,原因是因为该算法相比其他目标检测算法快速又不失精准。这里是直接调用opencv库中训练好的人脸识别SSD算法实现。

5 结果

最后我使用PyQT5设计了一个GUI界面,如下图所示。
在这里插入图片描述
分别有以下几个功能:

5.1 打开图片:

即打开电脑本地上的图片,对图片中的人脸进行表情分类,下面跑一下余文乐和我的合照图(doge),对其进行表情分类,如下:
在这里插入图片描述
在这里插入图片描述

可以看到表情的分类在这张图片上还是不错的。

5.2 打开相机:

即打开电脑上自带的摄像头,对视频流中的人脸进行表情的分类,调用摄像头为使用opencv库实现,示例如下
在这里插入图片描述
本人就不出镜了,找一张霉霉小时候的照片跑了一下,红色数字代表该表情是happy的概率。在调用摄像头对其中的人脸进行表情识别时,可以实时跟踪视频流中的人脸并实时做出表情的分类,此处就不再演示了。

5.3 绘制曲线:

这里主要是绘制的模型训练过程中检测的各个指标,这里我是在训练模型的时候就直接保存了,此处是直接打开该图片,如下图只显示我调好的模型的损失与精度曲线:
在这里插入图片描述
在这里插入图片描述

5.4 混淆矩阵:

混淆矩阵是衡量分类任务在各类样本上的准确率情况,横向为预测的表情,纵向为表情的真值,横向概率相加为1,本文只显示模型在验证集上的混淆矩阵情况。
在这里插入图片描述
分析该概率矩阵可以看到,模型在Fear和 Disgust类表情上准确率不高,原因可能是这两类表情与其他类表情差距不大,比较难分类,还有可能是这两类图片的个数不多,模型未完全学到该两类表情的特征。

6 总结

使用比较新的网络RepVGG对人脸表情进行了分类,人脸表情数据集使用的是RAF-DB,在验证集上的准确率为77%左右,仍然有所改进。

由于我使用的是RepVGG官方给出的源码(当然也可以采用VGG/ResNet这种比较传统的网络,当时采用RepVGG的原因是觉得作为研究生深度学习课设得有一些新颖的网络,所以用了个比较新的网络),然后跟我的其他的本项目的程序放在一个项目中了,所以代码搞得有点乱,如果有小伙伴想要本项目的源码,可以私信我,我看到后会积极回复的。

tips:
本项目有一个小bug,就是在调用摄像头时,如果人脸贴的摄像头太近,程序会卡住,不知道是哪里出问题了0.0。以后有时间再改吧,欢迎大家私信与我交流!

猜你喜欢

转载自blog.csdn.net/weixin_43706434/article/details/124308667