# 1.研究背景
在深度学习中,传统的卷积神经网络对面部表情特征的提取不充分以及计算参数量较大的问题,导致分类准确率偏低。因此,提出了一种基于改进的VGG19网络的人脸表情识别算法。首先,对数据进行增强如裁剪、翻转等处理,然后采用平均池化取代全连接操作从而大幅降低网络的参数量,最后,测试的时候采用了10折交叉验证的方法增加数据量以提升模型的泛化能力。实验结果表明,改进后的神经网络在FER2013测试数据集上的识别准确率为73.112%。
# 2.图片演示

# 3.实时摄像头演示


# 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展示了数据集中的几个样本。

# 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,更加易于数据处理。而交叉熵损失函数计算公式如下:

#### 网络模型的改进
首先,[参考该博客利用超深度卷积神经网络提取人脸表情特征](https://mbd.pub/o/bread/Y5iTmp1r)。然后,通过卷积核大小是1×1的平均池化层对提取的特征进行降维。最后,采用带有动量的随机梯度方法对算法进行优化,通过softmax 函数来进行分类。
在训练过程中,改进后的网络结构的参数量如表1所示。表格只统计了网络结构中所有的卷积层,不包含其他网络层。相比原始VGG网络中140MB大小的参数量,减少了50MB左右,大大节省了计算资源和训练时间。

# 7.实验结果的分析
我们做了一系列的实验,它们都遵循这样一个过程:数据预处理(包括数据增强)-搭建神经网络-训练-测试-评估模型。其中一组实验单独使用CNN(VGG19)对FER2013进行了实验。经过约10小时250轮的训练获得训练模型并在测试集上进行测试。准确率为73.112%。我们在下图中分别记录了训练、验证,测试时的混淆矩阵。

# 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)

参考博客[《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&教程).zip

共10个文件
png:8个
py:1个
md:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 189 浏览量
2025-02-07
23:51:59
上传
评论 1
收藏 2.3MB ZIP 举报
温馨提示
知识点: Opencv基于VGG19的表情识别系统是一种基于深度学习框架的表情识别技术,其核心是利用Opencv和VGG19模型来实现表情的识别。Opencv是一种开源的计算机视觉和机器学习软件库,它提供了许多常用的图像处理和计算机视觉功能。VGG19是一种深度卷积神经网络模型,由牛津大学的研究人员提出,它的特点是拥有19层的深度结构,能够提取复杂的图像特征。 在这个项目中,Opencv和VGG19模型被用于构建一个表情识别系统。该系统通过学习大量的面部表情图片,能够识别出新的面部表情图片所表达的情绪。这种技术在人机交互、情感计算等领域有着广泛的应用。 项目中包含的源码文件是该系统实现的核心,它包含了实现表情识别的所有代码。这些代码包括数据预处理、模型构建、训练和测试等部分。通过运行这些源码文件,我们可以构建和训练自己的表情识别模型。 此外,项目中还包括了Fer2013数据集。这是一个广泛用于表情识别研究的数据集,包含了来自不同人的大量面部表情图片。通过使用这个数据集,我们可以在系统中训练和测试模型,以验证其准确性和性能。 项目还提供了一个教程,详细介绍了如何使用源码和数据集来构建和使用表情识别系统。这个教程对于初学者来说非常有用,它可以帮助他们快速掌握如何使用Opencv和VGG19模型进行表情识别。 总结起来,Opencv基于VGG19的表情识别系统是一个综合运用了Opencv、VGG19模型、源码和Fer2013数据集以及相关教程的技术方案。通过该项目,我们可以构建一个高效准确的表情识别系统,为相关领域提供技术支持。
资源推荐
资源详情
资源评论





























收起资源包目录












共 10 条
- 1
资源评论


飞翔的佩奇

- 粉丝: 7681
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于PLC技术龙门式精密油压机电气设计方案探讨.doc
- (源码)基于Win32 API的试制小游戏.zip
- 互联网+背景下高中学生历史学科核心素养的培养初探.docx
- 网络存储产品在NVR系统中的应用-公共场所其他.docx
- 计算机维修电脑部件组成实训报告.doc
- (源码)基于KiCad和ESP32S3的心电图模拟数字转换系统.zip
- 使用纯 Python 编写机器学习算法的实现指南与示例
- 信息化校园建设.ppt
- 四层电梯的PLC控制.doc
- (源码)基于Pygame的推箱子游戏(Sokoban).zip
- 《flash8动画设计实例教程》第五章.ppt
- 软件开发项目初步验收专业技术方案.doc
- 工程项目管理2011年7月自考复习资料.doc
- (源码)基于lnArduino框架的红点焊接机控制板.zip
- XX年国家网络安全宣传周活动实施方案.docx
- (源码)基于Python和TensorFlow的以图搜图系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
