[本科毕设]pytorch-人脸表情识别
两年前的存货
==不提供源码,以后某天可能会开源到github上,本文只是向你提供我的思路,自己动手丰衣足食==
此作品诞生于公元2022年,天临四年,卢雷元年😅😅
基于卷积神经网络的人脸表情识别
概述
功能
实现了对图片、视频和摄像头三种情况下的人脸表情进行检测。
可以检测出七种表情:[‘生气’, ‘厌恶’, ‘害怕’, ‘开心’, ‘自然’, ‘伤心’, ‘吃惊’]
结果
整体思路
我不是深度学习方向的大佬,只是一个比小白懂的稍微多一点的菜鸟
因为把大象放进冰箱需要三步,所以此系统的整体构思也是三步:
- 检测出图片内人脸所在区域
- 对此区域进行卷积表情识别
- 将检测的结果显示在界面上
易知,此系统最关键的是图片内的人脸定位,若是定位错误,其它的都是白搭
数据集准备
众所周知,深度学习最重要的是有合适的数据集,在此附上我使用的两个数据集。
1.人脸检测数据集,抱歉,此数据集百度网盘无法分享。
2.表情识别数据集
人脸检测算法
最初我是打算自己制作数据集,自己构造神经网络来实现对图片内单个人脸定位功能。先从百度上爬取单人照片,对其进行标注,然后构造神经网络进行训练,最终失败了,哈哈哈,不能准确的定位到人脸。
然后我开始寻找和复现开源算法,然后发现了Retinaface人脸检测算法,此算法不仅可以对图片内的多张人脸进行检测,还可以选择Retinaface或者MobilenetV1当作主干网络,满足不同情况下的需求。
实现Retinaface的代码你可以自己复现,也可以搬用其他博主发布的算法代码,具体怎么操作看你自己,本文此处略过。
学习之前建议你先了解一下:先验框,上采样,特征金字塔。这些基本名词的意思。
学习此算法需要耗费大量的时间,毕竟是系统的核心,建议借鉴别人发布的代码。
表情识别算法
思路
这有什么思路啊,我只是个小白,又不会自己创造算法,我只学过手写字体识别,然后……嗯……类比一下,就构造了此处所需的表情识别网络。
先看看这七种表情的展示,相互之间差异很小,哪有十个数字之间差异大。因此我模型整体正确率也不高。
我能做的就是对数据集进行多次卷积处里,卷积核大小和卷积次数多少全看我心情。
卷积代码
主要代码如下:
1 | self.layer1 = nn.Sequential( |
构建算法我很随意的,没有耗费太多时间,我的时间都耗费在了调参和训练算法上。
卷积参数初始化
此步骤有就行,没不要一直调整初始化参数的值。
1 | def initialize_weights(m): |
学习率调整
此处我经过了n次的调整,调整后又重新训练看效果,过程很慢,很好划水……
最终训练时选择的参数为
1 | optimizer = optim.Adam(net.parameters() , lr=0.0001) |
最终结果
正确率不高,只有63%,感觉以为自己挺菜的,写的是什么垃圾代码😑,但是!!!在kaggle网站上此数据集主页内,其他用户发布了自己构建模型的代码和正确率,全是60%左右,甚至正确率还没我高哦,瞬间感觉自己挺强的。😁😁😁
系统构建
代码合体
将上文构建的人脸检测算法和表情识别算法合体,串联起来,就能实现本论文的主题:表情检测。
什么?你告诉我你不会串?那你还是没搞懂这两个算法。
视频检测
对图片检测挺简单的,直接传输就行,但是呢,视频却不能直接喂给神经网络,此处我的思路是利用opencv将视频分割成一桢一帧的图片,然后传输给算法,再将图片一桢一帧的显示出来,构成视频,fps快的时候,就感受不到是图片了。
1 | self.capture = cv2.VideoCapture(fileName) |
电脑性能不行的话会很卡,我也没办法,反正我这里会卡,尽量选取的视频像素少一点。
调用摄像头检测同理。
可视化界面
我选择的是使用pyqt5,然后利用qtdesinger软件,很简便的搭建出了我需要的界面
有手就行。
总结
四年大学时光转瞬即逝,蓦然回首,本科生活即将结束,马上就要离开校园
去更广阔的环境去度过人生的下一阶段。
愿终有一天学有所成,实现父母对自己的期望。
祝大家毕业设计顺利完成。