# 1.研究背景
在深度学习中,传统的卷积神经网络对面部表情特征的提取不充分以及计算参数量较大的问题,导致分类准确率偏低。因此,提出了一种基于改进的VGG19网络的人脸表情识别算法。首先,对数据进行增强如裁剪、翻转等处理,然后采用平均池化取代全连接操作从而大幅降低网络的参数量,最后,测试的时候采用了10折交叉验证的方法增加数据量以提升模型的泛化能力。实验结果表明,改进后的神经网络在FER2013测试数据集上的识别准确率为73.112%。
# 2.图片演示
![1.png](dc78ec2fd252ad65a76d085b05f14958.png)
# 3.实时摄像头演示
![3.png](db7d087e905b1f15bd240a4ddbfece22.png)
![4.png](444cb0426dea53f09a487341ffde90de.png)
# 4.视频效果演示
[Opencv基于VGG19的表情识别系统(源码&Fer2013&教程)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1MD4y1173A/?vd_source=bc9aec86d164b67a7004b996143742dc)
# 5.数据集的准备
#### FER2013数据集
FER2013数据集由Pierre Luc carrier和Aaron Courville通过搜索相关的情感关键词在网络上爬取的。这些图像都是经过人工标注的。它是由35886张表情图片构成,测试集28708张,公有验证集和私有验证集各3589张,每张图片是由大小为48×48像素的灰度图组成,分为7个类别,分别为中性、快乐、惊讶、悲伤、愤怒、厌恶、恐惧。图1展示了数据集中的几个样本。
![](cd7cde1c18cb68b4a33a9e53ceefc953.png)
# 6.VGG19表情分类网络的构建
#### 现有网络存在的问题
近几年来,前馈神经网络(FNN)和卷积神经网络(CNN)也被用来提取表情特征。基于卷积神经网络(CNN)的新的识别框架在FER中已经取得了显著的结果。CNN中的多个卷积和汇集层可以提取整个面部或局部区域的更高和多层次的特征,且具有良好的面部表情图像特征的分类性能。经验证明,CNN比其它类型的神经网络在图像识别方面更为优秀。基于神经网络的方法也存在着两个问题:
(1)简单的神经网络(如FNN)忽略图像二维信息。
(2)浅层卷积网络所提取的特征,鲁棒性较差。
基本上面的人为设计特征与神经网络的缺陷,我们尝试着用深度卷积网络来解决表情识别的问题。
#### 模型的设计
(1)我们采用深度卷积神经网络来将人脸表情特征提取与表情分类融合到一个end-to-end的网络中。分别采用了VGG19和Resnet18来完成表情的识别与分类。
(2)VGG19 的每一个小块是有一个卷积层,一个BatchNorm层,一个relu层和一个平均池化层来构成的。而resnet是由两个卷积层,两个BatchNorm层组成,而且每个resnet模块输入输出端还有快捷链接。
(3)在全连接层之前加入了dropout策略,增加了模型鲁棒性;
(4)我们都去掉了传统VGG19与Resnet18中的多个全连接层,直接在一个全连接层后直接分为7类去识别。
#### 损失函数的设计
[受到该博客的启发,我们探索了两种损失函数的计算方法](https://afdian.net/item?plan_id=1e0bd0065c1411ed806652540025c377),第一种是交叉熵损失函数。模型在全连接层之后,得到了每一类的输出概率,但此时概率是没有经过归一化的,我们通过一个softmax层,将概率归一化到1,更加易于数据处理。而交叉熵损失函数计算公式如下:
![image.png](11b417c27980d8f63ab22f05f459d2cb.png)
#### 网络模型的改进
首先,[参考该博客利用超深度卷积神经网络提取人脸表情特征](https://mbd.pub/o/bread/Y5iTmp1r)。然后,通过卷积核大小是1×1的平均池化层对提取的特征进行降维。最后,采用带有动量的随机梯度方法对算法进行优化,通过softmax 函数来进行分类。
在训练过程中,改进后的网络结构的参数量如表1所示。表格只统计了网络结构中所有的卷积层,不包含其他网络层。相比原始VGG网络中140MB大小的参数量,减少了50MB左右,大大节省了计算资源和训练时间。
![image.png](5cf30803ebbc544f9a8b20b00afb7639.png)
# 7.实验结果的分析
我们做了一系列的实验,它们都遵循这样一个过程:数据预处理(包括数据增强)-搭建神经网络-训练-测试-评估模型。其中一组实验单独使用CNN(VGG19)对FER2013进行了实验。经过约10小时250轮的训练获得训练模型并在测试集上进行测试。准确率为73.112%。我们在下图中分别记录了训练、验证,测试时的混淆矩阵。
![PrivateTest_cm.png](d83d9319af88ddaa75eb45d3e0d1acc5.png)
# 8.代码实现
```
import torch.nn as nn
from torch.utils import data
from torchvision import transforms
from PIL import Image
from torchvision import models as MD
import torch
import torchvision.datasets as datasets
def Make_data(path):
img=datasets.ImageFolder(path,
tensform=transforms.Compose([transforms.Scale([48, 48]), transforms.ToTensor()]))
imgs_load=data.DataLoader(img,batch_size=100,shuffle=True)
return imgs_load
def train(dada_loader):
model = MD.vgg19(pretrained=False)
model.load_state_dict(torch.load("../models/???.pth"))
num_input = model.classifier[6].in_features
feature_model = list(model.classifier.children())
feature_model.pop()
feature_model.append(nn.Linear(num_input, 7))
model.classifier = nn.Sequential(*feature_model)
model = model.cuda()
critersion = nn.CrossEntropyLoss()
opt = torch.optim.SGD(model.parameters(), lr=0.001)
for ench in range(200):
sum = 0
for i, data in enumerate(dada_loader):
img, targe = data[1]
targe = targe.cuda()
img = img.cuda()
output = model(img)
loss = critersion(output, targe)
opt.zero_grad()
loss.backward()
opt.step()
sum += loss
print(sum)
if ench % 20 == 0:
torch.save(model.state_dict(), "../models/" + str(ench) + ".pkl")
def test(dada_loader):
model = MD.vgg19(pretrained=False)
num_input = model.classifier[6].in_features
feature_model = list(model.classifier.children())
feature_model.pop()
feature_model.append(nn.Linear(num_input, 7))
model.classifier = nn.Sequential(*feature_model)
# 加载训练过的模型进行测试
model.load_state_dict(torch.load(""))
model = model.cuda()
for i, data in enumerate(dada_loader):
img, targe = data[1]
targe = targe.cuda()
img = img.cuda()
output = model(img)
_, pred = torch.max(output.data, 1)
print(torch.sum(pred == targe))
if __name__ == '__main__':
trainpath="../train"
trainimg=Make_data(trainpath)
train(trainimg)
testpath = "../test"
testimg = Make_data(trainpath)
test(testimg)
```
# 9.系统整合
下图[源码&环境部署视频教程&表情数据集&自定义UI界面&训练](https://s.xiaocichang.com/s/937dfe)
![5.png](96037f1629476c3cd7676bb276900336.png)
参考博客[《Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)》](https://mbd.pub/o/qunma/work)
# 10.参考文献
[1]王伟东,罗莹,王坤,等.基于核相关滤波的改进目标跟踪算法[J].数字技术与应用.2021,(7).DOI:10.19695/j.cnki.cn12-1369.2021.07.29.
[2]樊轲.基于迁移学习的癫痫发作预测方法[J].电子设计工程.2022,30(12).DOI:10.14022/j.issn1674-6236.2022.12.006.
[3]王彦博,王浩然,张剑书,等.基于计算机视觉的疼痛检测系统的设计与实现[J].电子元器件与信息技术.2021,(6).DOI:10.19772/j.cnki.2096-4455.2021.6.085.
[4]孙帅成,徐春融,刘瑞明.专注度识别应用研究[J].科
没有合适的资源?快使用搜索试试~ 我知道了~
毕设-Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)
共11个文件
png:8个
py:1个
md:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 2 浏览量
2024-12-21
17:59:39
上传
评论
收藏 2.45MB ZIP 举报
温馨提示
毕设-Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程) 在深度学习中,传统的卷积神经网络对面部表情特征的提取不充分以及计算参数量较大的问题,导致分类准确率偏低。因此,提出了一种基于改进的VGG19网络的人脸表情识别算法。首先,对数据进行增强如裁剪、翻转等处理,然后采用平均池化取代全连接操作从而大幅降低网络的参数量,最后,测试的时候采用了10折交叉验证的方法增加数据量以提升模型的泛化能力。实验结果表明,改进后的神经网络在FER2013测试数据集上的识别准确率为73.112%。 R2013数据集 FER2013数据集由Pierre Luc carrier和Aaron Courville通过搜索相关的情感关键词在网络上爬取的。这些图像都是经过人工标注的。它是由35886张表情图片构成,测试集28708张,公有验证集和私有验证集各3589张,每张图片是由大小为48×48像素的灰度图组成,分为7个类别,分别为中性、快乐、惊讶、悲伤、愤怒、厌恶、恐惧。图1展示了数据集中的
资源推荐
资源详情
资源评论
收起资源包目录
SYS.zip (11个子文件)
OpenCV-Enhanced-VGG19-Facial-Expression-Recognition-System-main
11b417c27980d8f63ab22f05f459d2cb.png 27KB
96037f1629476c3cd7676bb276900336.png 109KB
444cb0426dea53f09a487341ffde90de.png 627KB
db7d087e905b1f15bd240a4ddbfece22.png 589KB
5cf30803ebbc544f9a8b20b00afb7639.png 158KB
阿
demo.jpg 161KB
Make_data.py 2KB
dc78ec2fd252ad65a76d085b05f14958.png 696KB
d83d9319af88ddaa75eb45d3e0d1acc5.png 89KB
cd7cde1c18cb68b4a33a9e53ceefc953.png 101KB
README.md 9KB
共 11 条
- 1
资源评论
荒野大飞
- 粉丝: 1w+
- 资源: 2650
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功