avatar
文章
23
标签
8
分类
0
首页
音乐
照片
友链
说说
关于
LogoLucky[本科毕设]pytorch-人脸表情识别
搜索
首页
音乐
照片
友链
说说
关于

[本科毕设]pytorch-人脸表情识别

发表于2022-07-01|更新于2025-02-26
|总字数:1.6k|阅读时长:5分钟

两年前的存货


==不提供源码,以后某天可能会开源到github上,本文只是向你提供我的思路,自己动手丰衣足食==
此作品诞生于公元2022年,天临四年,卢雷元年😅😅

基于卷积神经网络的人脸表情识别

概述

功能

实现了对图片、视频和摄像头三种情况下的人脸表情进行检测。
可以检测出七种表情:[‘生气’, ‘厌恶’, ‘害怕’, ‘开心’, ‘自然’, ‘伤心’, ‘吃惊’]

结果

请添加图片描述

整体思路

我不是深度学习方向的大佬,只是一个比小白懂的稍微多一点的菜鸟
因为把大象放进冰箱需要三步,所以此系统的整体构思也是三步:

  1. 检测出图片内人脸所在区域
  2. 对此区域进行卷积表情识别
  3. 将检测的结果显示在界面上

易知,此系统最关键的是图片内的人脸定位,若是定位错误,其它的都是白搭

数据集准备

众所周知,深度学习最重要的是有合适的数据集,在此附上我使用的两个数据集。
1.人脸检测数据集,抱歉,此数据集百度网盘无法分享。
2.表情识别数据集

人脸检测算法

最初我是打算自己制作数据集,自己构造神经网络来实现对图片内单个人脸定位功能。先从百度上爬取单人照片,对其进行标注,然后构造神经网络进行训练,最终失败了,哈哈哈,不能准确的定位到人脸。

然后我开始寻找和复现开源算法,然后发现了Retinaface人脸检测算法,此算法不仅可以对图片内的多张人脸进行检测,还可以选择Retinaface或者MobilenetV1当作主干网络,满足不同情况下的需求。

实现Retinaface的代码你可以自己复现,也可以搬用其他博主发布的算法代码,具体怎么操作看你自己,本文此处略过。

学习之前建议你先了解一下:先验框,上采样,特征金字塔。这些基本名词的意思。

学习此算法需要耗费大量的时间,毕竟是系统的核心,建议借鉴别人发布的代码。

Retinaface论文内运行结果配图如下所示:
在这里插入图片描述

表情识别算法

思路

这有什么思路啊,我只是个小白,又不会自己创造算法,我只学过手写字体识别,然后……嗯……类比一下,就构造了此处所需的表情识别网络。

先看看这七种表情的展示,相互之间差异很小,哪有十个数字之间差异大。因此我模型整体正确率也不高。
在这里插入图片描述
我能做的就是对数据集进行多次卷积处里,卷积核大小和卷积次数多少全看我心情。

卷积代码

主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
self.layer1 = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=5, padding=2),
nn.RReLU(inplace=True),
nn.BatchNorm2d(16),
nn.Conv2d(16, 16, kernel_size=5, padding=2),
nn.RReLU(inplace=True),
nn.BatchNorm2d(16)
)

self.layer2 = nn.Sequential(
nn.Conv2d(16, 64, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, kernel_size=1, padding=0),
nn.RReLU(inplace=True),
nn.BatchNorm2d(64)
)

self.layer3 = nn.Sequential(
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(128),
nn.Conv2d(128, 128, kernel_size=1, padding=0),
nn.RReLU(inplace=True),
nn.BatchNorm2d(128),
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(128)
)

self.layer4 = nn.Sequential(
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(256),
nn.Conv2d(256, 256, kernel_size=1, padding=0),
nn.RReLU(inplace=True),
nn.BatchNorm2d(256),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.RReLU(inplace=True),
nn.BatchNorm2d(256)
)

构建算法我很随意的,没有耗费太多时间,我的时间都耗费在了调参和训练算法上。

卷积参数初始化

此步骤有就行,没不要一直调整初始化参数的值。

1
2
3
4
5
6
7
def initialize_weights(m):
if isinstance(m, nn.Conv2d):
m.weight.data.normal_(0, 0.02)
m.bias.data.zero_()
elif isinstance(m, nn.Linear):
m.weight.data.normal_(0, 0.02)
m.bias.data.zero_()

学习率调整

此处我经过了n次的调整,调整后又重新训练看效果,过程很慢,很好划水……
最终训练时选择的参数为

1
2
3
4
optimizer = optim.Adam(net.parameters() , lr=0.0001)
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.9)

criterion = nn.CrossEntropyLoss()

最终结果

正确率不高,只有63%,感觉以为自己挺菜的,写的是什么垃圾代码😑,但是!!!在kaggle网站上此数据集主页内,其他用户发布了自己构建模型的代码和正确率,全是60%左右,甚至正确率还没我高哦,瞬间感觉自己挺强的。😁😁😁

系统构建

代码合体

将上文构建的人脸检测算法和表情识别算法合体,串联起来,就能实现本论文的主题:表情检测。

什么?你告诉我你不会串?那你还是没搞懂这两个算法。

视频检测

对图片检测挺简单的,直接传输就行,但是呢,视频却不能直接喂给神经网络,此处我的思路是利用opencv将视频分割成一桢一帧的图片,然后传输给算法,再将图片一桢一帧的显示出来,构成视频,fps快的时候,就感受不到是图片了。

1
2
3
4
5
6
7
8
9
self.capture = cv2.VideoCapture(fileName)
while (True):
# 读取一帧
ref, frame = self.capture.read()
if not ref:
break
# 格式转变,因为opencv不是RGB
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = np.array(retinaface.detect(frame))

电脑性能不行的话会很卡,我也没办法,反正我这里会卡,尽量选取的视频像素少一点。

调用摄像头检测同理。

可视化界面

我选择的是使用pyqt5,然后利用qtdesinger软件,很简便的搭建出了我需要的界面
在这里插入图片描述

有手就行。

总结

四年大学时光转瞬即逝,蓦然回首,本科生活即将结束,马上就要离开校园
去更广阔的环境去度过人生的下一阶段。

愿终有一天学有所成,实现父母对自己的期望。

祝大家毕业设计顺利完成。

文章作者: 刘同学
文章链接: https://mouhorse.github.io/2022-07-01/%E6%9C%AC%E7%A7%91%E6%AF%95%E8%AE%BE-pytorch-%E4%BA%BA%E8%84%B8%E8%A1%A8%E6%83%85%E8%AF%86%E5%88%AB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Lucky!
毕业设计
赞助
  • wechat
    wechat
  • alipay
    alipay
cover of previous post
上一篇
MNIST手写数字识别总结(pytorch)
此博客并不是教程,只是一个练习总结 代码汇总放在文末 1.首先导入所需要的库1234567891011import torchfrom torch import nnfrom torch.nn import functional as Ffrom torch import optimimport torchvisionfrom matplotlib import pyplot as pltimport pandas as pdimport numpy as npfrom Util import plot_image,pd_one_hot #辅助函数,在博客末尾附上 2.数据集 此数据集总共包含70K张图片,其中60K作为训练集,10K作为测试集。 更多消息可以查看官网官网链接:官网 3.加载数据 batch_size设置一次处理多少图片,此处设置为512张图片,这样并行处理可以cpu,gpu加快处理速度 1batch_size =...
cover of next post
下一篇
Neurofeedback
Neurofeedback神经反馈(Neurofeedback)是一种基于脑电图(EEG)的生物反馈技术,通过实时监测大脑的电活动,并将这些信号转化为可视化或听觉化的反馈信息,帮助个体学习自我调节大脑功能。它广泛应用于注意力缺陷、焦虑、睡眠障碍等心理和神经问题的辅助治疗,以及提升认知能力和情绪管理。 if (typeof lightGallery !== 'undefined') { var options = { selector: '.gallery-item' }; lightGallery(document.getElementsByClassName('.article-gallery')[0], options); }
avatar
刘同学
欢迎光临我的博客
文章
23
标签
8
分类
0
Follow Me
公告
欢迎来到我的博客!
可以交换友链
联系方式:485182274@qq.com
目录
  1. 1. 基于卷积神经网络的人脸表情识别
    1. 1.1. 概述
      1. 1.1.1. 功能
      2. 1.1.2. 结果
    2. 1.2. 整体思路
    3. 1.3. 数据集准备
    4. 1.4. 人脸检测算法
    5. 1.5. 表情识别算法
    6. 1.6. 思路
      1. 1.6.1. 卷积代码
      2. 1.6.2. 卷积参数初始化
      3. 1.6.3. 学习率调整
      4. 1.6.4. 最终结果
    7. 1.7. 系统构建
      1. 1.7.1. 代码合体
      2. 1.7.2. 视频检测
      3. 1.7.3. 可视化界面
    8. 1.8. 总结
最新文章
Hexo本地与云端布局不同处理办法
Hexo本地与云端布局不同处理办法2025-02-25
解决 Hexo 部署到 GitHub Pages 自定义域名失效
解决 Hexo 部署到 GitHub Pages 自定义域名失效2025-02-24
Butterfly 个性化配置教程
Butterfly 个性化配置教程2025-02-23
Hexo安装并修改主题
Hexo安装并修改主题2025-02-23
MNE脑电预处理
MNE脑电预处理2024-10-07
©2018 - 2025 By 刘同学
框架 Hexo 7.3.0|主题 Butterfly 5.3.3
活出个样子给自己看
搜索
数据加载中