基于深度学习的面部情绪识别算法仿真与分析

声明:以下内容均属于本人本科论文内容,禁止盗用,否则将追究相关责任

基于深度学习的面部情绪识别算法仿真与分析

  • 摘要
  • 结果分析
    • 1、本次设计通过网络爬虫技术获取了七种面部情绪图片:吃惊、恐惧、厌恶、高兴、伤心、愤怒、自然各若干张,图4.1是获取的部分原始网络图片示例(以厌恶情绪为例)。
    • 2、数据的预处理
    • 4.2 MTCNN算法仿真
      • 1、数据集选择
      • 2、仿真结果
    • 4.3 面部情绪识别算法仿真
    • 4.4 算法性能分析
      • 4.4.1 FERA-C算法在自制数据集上的loss、acc分析
      • 4.4.2 FERA-C算法在自制数据集上的混淆矩阵分析
      • 4.4.3 CK+数据集上的算法对比分析

摘要

面部情绪是人们表达情感的直观画板,随着当代社会计算机视觉领域的不断发展,面部情绪识别已经成为图像识别领域的研究热点,在智能驾驶、智慧医疗、市场营销等公共领域有极大的应用价值。基于机器学习的传统面部情绪识别算法存在特征提取困难、泛化性能不好、训练样本过大、对噪声和变形敏感等劣势。相比之下,基于深度学习的面部情绪识别算法可以自动学习图像特征,并具有更好的泛化能力和鲁棒性。
本次设计结合深度学习中的人脸检测方法和图像识别方法,提出了一种将经典人脸检测算法MTCNN和加入混合注意力机制CBAM的残差神经网络组合起来的面部情绪识别算法,并且进行模型裁剪操作来减小模型参数计算量。主要从人脸检测、面部情绪识别分类、算法对比三个阶段来完成面部情绪识别算法总体设计。
第一个阶段采用经典人脸检测模型MTCNN训练出人脸检测模型权重,并进行人脸检测和人脸关键点的提取验证。第二个阶段在制作完成的七种面部情绪数据集上进行面部情绪识别模型的训练,调用训练权重及人脸检测权重进行图片、视频检测。通过损失率、准确率以及混淆矩阵统计识别结果,进行算法性能分析。最后与残差神经网络模型ResNet和通道注意力模型SENet进行模型性能对比。
仿真结果表明,设计的组合算法在算法整体评价中取得了不错的效果,验证了本次设计提出的组合算法的合理性和可行性。
关键词:卷积神经网络;混合注意力机制;残差结构;人脸检测;面部情绪

结果分析

1、本次设计通过网络爬虫技术获取了七种面部情绪图片:吃惊、恐惧、厌恶、高兴、伤心、愤怒、自然各若干张,图4.1是获取的部分原始网络图片示例(以厌恶情绪为例)。

在这里插入图片描述

图 4.1 “厌恶”原始图片

通过网络获取的原始图片存在大小不一、肢体遮挡、表情图片混入等问题,需要进行数据的第一次清洗去除以上提到的不符合要求的图片。

2、数据的预处理

获取到原始数据集后,考虑到后期面部情绪识别模型主要是针对面部情绪进行训练,为了尽可能减小面部之外的其他人体部位对模型训练的影响,需要对原始数据图片进行人脸裁剪操作,完成数据集归一化处理,并再次进行数据集清洗,去除裁剪不到位和面部遮挡严重的图片,图4.2是数据预处理后得到的部分数据集展示(以厌恶情绪为例)。
在这里插入图片描述

图 4.2 数据预处理后的“厌恶”图片

以上图片都设置成100*100的图像大小,七种面部情绪以此为基准依次操作,经过数据增强最终制作出每类1500张的数据集。

4.2 MTCNN算法仿真

由于本次设计重心在于面部情绪识别分类算法的设计,MTCNN人脸检测算法不作为算法设计详细介绍的重点,在算法仿真阶段进行调用即可。在第二章的第二小节已经对MTCNN算法原理进行了阐述,并且在第三章算法设计中明确了MTCNN算法流程,本章节不再过多叙述。

1、数据集选择

为了生成的人脸检测权重更加精确,选择WIDER FACE数据集作为MTCNN模型训练的数据集,WIDER FACE数据集包含32,203个图片,其中有128,80张用作训练,6,971张用作验证,6,946张用作测试。数据集中的图片来自于各种实际场景,包括社交场合、视频剪辑、电视截图、名人图片等,具有大量的姿态、遮挡和背景变化,是一个比较具有挑战性的数据集。

2、仿真结果

由MTCNN算法流程可知要依次进行P-Net、R-Net、O-Net的训练,最终完成人脸和面部关键点的检测,保存生成的P-Net、R-Net、O-Net模型训练的权重以便后期面部情绪识别仿真阶段进行权重调用。图4.3是MTCNN在图片上的仿真验证。
在这里插入图片描述

图4.3 人脸及关键点图片仿真

在仿真时会首先生成图片中人脸框的左上角和右下角的位置信息以及人脸框置信度,同时生成人脸五个关键点的位置信息,如果图片是非人脸则会返回image not have face的提示。用实时摄像头进行仿真,输出结果与图片仿真一致。

4.3 面部情绪识别算法仿真

通过训练权重在面部情绪识别仿真阶段的调用可以得到仿真结果。图4.4是仿真阶段总体设计流程图。
在这里插入图片描述

图4.4 仿真整体流程

图4.5是面部情绪识别模型在图片上的仿真结果展示,可以看出其能够识别人脸情绪,并标注人脸五个关键点,同时也存在个别情绪识别不准确的情况。
在这里插入图片描述

图4.5 面部情绪识别图片仿真

图4.6是面部情绪识别模型在视频中的仿真结果
在这里插入图片描述

图4.6 面部情绪识别视频仿真

4.4 算法性能分析

4.4.1 FERA-C算法在自制数据集上的loss、acc分析

图4.7是FERA-C模型在自制数据集上的训练结果展示。
在这里插入图片描述

图4.7 FERA-C模型在自制数据集上的训练结果
图4.8是FERA-C模型在自制数据集上训练得到的loss变化过程。
在这里插入图片描述

图4.8 FERA-C在自制数据集上的loss变化

由于模型学到了一些数据集的简单特征,导致train_loss和val_loss前期出现转折,后期模型学到更复杂的特征后,两者变化趋于稳定,但切合度较低。
图4.9是FERA-C模型在自制数据集上训练得到的acc变化过程。
在这里插入图片描述

图4.9 FERA-C在自制数据集上的acc变化

从上图可以看出自制数据集在训练集上的准确率较高且acc变化平滑,但数据集在验证集上的准确率较低,变化波动较为平滑,前期acc转折与自制数据集上loss转折一致。
根据对面部情绪识别算法和训练模型模块的分析,以下问题是导致训练集和验证集在模型训练时loss、acc变化曲线不紧密的一般原因,每一个原因在经过分析后都给出了合理推测。
(1)数据集过小
当数据集较小时,模型会对训练集过拟合,不能很好地泛化到未知数据上,从而导致验证集上的损失波动较大。
自制数据集是每类1500张,总量为10500。其中训练集8400张,验证集2100张,由于在模型训练过程中进行了一定的数据增强,所以数据集过小导致训练集和验证集的loss和acc变化曲线不紧密的可能性较小,后续在算法对比阶段会使用CK+公开数据集进行验证。
(2)模型复杂度较高
过于复杂的模型会更容易对训练集过拟合。当模型过于复杂时,它很可能会在训练集上表现得很好,但在验证集上表现不佳。
本次设计使用的面部情绪识别算法FERA-C主要由残差块、混合注意力机制、基本卷积结构构成,为了避免出现模型复杂度高、参数计算量大的问题,对模型进行了裁剪处理,通过训练得到的权重大小可知此类原因导致训练集和验证集的loss、acc变化曲线不紧密依旧不成立。
(3)学习率过高
学习率过高可能导致模型参数更新过于快速,容易跳过最优解,从而使验证集准确率和损失值跟不上训练集的变化。
本次设计中,在训练模型时,为了获得合适的精确度,设置了不同学习率进行训练,从0.001到0.01不等,实验分析表明0.001较为适合,学习率过高不是导致出现上述训练问题的原因。
(4)训练次数不足
当训练次数不足时,模型可能没有充分收敛,使得验证集上的损失表现波动较大。
在模型训练阶段,将模型训练轮次设置成50轮,batch_size设置为16,通过loss和acc变化可知训练轮次已经达到训练稳定阶段,因此此类原因同样不成立。
(5)数据集缺少代表性
如果数据集缺少代表性,比如数据分布与实际情况有较大出入,则会导致模型对数据集过拟合,进而导致验证集上的损失波动较大,验证集准确率与训练集准确率相差较大。
通过对数据集的仔细分析,发现数据集中存在背景色彩差异度较大、面部化妆严重、不同类数据辨识度较低等问题,此类原因导致出现上述问题较为符合实际情况。

4.4.2 FERA-C算法在自制数据集上的混淆矩阵分析

通过混淆矩阵可以分析单一类别在验证集上的准确率,因为本次设计是七分类问题,故混淆矩阵是7*7的方阵,图4.10是通过自制数据集中的验证集调用面部情绪识别模型训练权重画出的混淆矩阵。
在这里插入图片描述

图4.10 FERA-C算法在自制数据集上的混淆矩阵

通过上图混淆矩阵可以看出七类面部情绪中,只有fear类与sad类的验证准确率较低,主要原因是两类数据集与其他类数据集区分程度较低。

4.4.3 CK+数据集上的算法对比分析

在算法对比阶段,为了验证模型效果,统一采用公开数据集CK+来进行模型训练。由于在设计FERA-C模型结构时参考了ResNet残差结构并使用了CBAM模块,故选择经典卷积神经网络中的ResNet模型和SENet模型来进行算法对比分析。
(1)ResNet模型
ResNet是一种深度卷积神经网络,通过残差块(Residual Block)连接来实现网络的深度。在传统卷积神经网络中,随着网络的加深,出现了梯度爆炸和梯度消失问题。为了解决这些问题,ResNet提出了残差学习的概念,即通过将恒等映射添加到残差块的输出路径上,这使得ResNet可以比传统卷积神经网络更深,并具有更高的准确率。
(2)SENet模型
SENet是一种用于神经网络的注意力机制模型,其核心思想是通过增强网络的注意力机制来提高网络的表现和泛化能力。
SENet模型的通道注意力机制由两个操作组成:Squeeze操作和Excitation操作。Squeeze操作通过使用全局平均池化操作将每个通道的特征压缩成一个数值,然后使用一个非线性激活函数对该数值进行激活,以获得该通道的重要性权重。Excitation操作通过使用一个全连接层对这些权重进行线性变换,并使用Sigmoid函数对变换结果进行激活,从而得到该通道的注意力权重。通过将这些注意力权重乘以原始的特征图,SENet模型可以加强网络对重要的特征信息的关注,提高网络的表现和泛化能力。
(3)CK+数据集
CK+数据集是在 CK数据集的基础上扩展来的,其数据集单张图片大小皆为48*48尺寸的黑白图像,图4.11是CK+数据集部分展示,这个数据集是人脸表情识别中比较流行的一个数据集。
在这里插入图片描述

图4.11 CK+数据集

三种模型训练时的超参数保持一致,训练轮次设置为100轮、batch_size设置为16、优化器选择Adam、学习率设置为0.001。三种模型在CK+数据集上分别进行模型训练,并对比模型效果参数,验证设计的FERA-C模型的可行性和合理性。
图4.12是FERA-C模型在CK+数据集上的loss变化。
在这里插入图片描述

图4.12 FERA-C在CK+数据集上的loss变化

通过上图可知FERA-C模型在CK+数据集上训练得到的train_loss和val_loss变化曲线较为紧密,上一小节中的推测成立。
图4.13是FERA-C模型在CK+数据集上训练得到的acc变化结果。
在这里插入图片描述

图4.13 FERA-C在CK+数据集上的acc变化

通过上图可以看出FERA-C模型在CK+数据集上的训练集准确度与验证集准确度十分接近,证明模型没有出现过拟合或欠拟合风险。图4.14是FERA-C模型训练100轮所用的训练总时间以及最高train_acc和val_acc结果显示。
在这里插入图片描述

图4.14 FERA-C在CK+数据集上的训练结果

通过上图可以看出,FERA-C模型训练在第95轮获得最佳训练准确率:0.9977,在第72轮获得最佳验证准确率:0.9697,总训练时间1265.45s。
图4.15是ResNet模型在CK+数据集上训练得到的loss变化。
在这里插入图片描述

图4.15 ResNet在CK+数据集上的loss变化

通过上图可以看出ResNet在CK+数据集上训练得到的train_loss和val_loss变化曲线同样较为紧密,图4.16是ResNet模型在CK+数据集上训练得到的acc变化。
在这里插入图片描述

图4.16 ResNet在CK+数据集上的acc变化
通过上图可以看出ResNet在CK+数据集上的acc变化符合loss变化。图4.17是ResNet模型训练100轮所用的训练总时间以及最高train_acc和val_acc结果显示。
在这里插入图片描述

图4.17 ResNet在CK+数据集上的训练结果

通过上图可以看出,ResNet模型训练在第41轮获得最佳训练准确率:0.9977,在第52轮获得最佳验证准确率:0.9406,总训练时间1441.17s。
图4.18是SENet模型在CK+数据集上训练得到的loss变化。
在这里插入图片描述

图4.18 SENet在CK+数据集上的loss变化
通过上图可以看出SENet模型在CK+数据集上得到的train_loss和val_loss并行变化。图4.19是SENet模型在CK+数据集上训练得到的acc变化。
在这里插入图片描述

图4.19 SENet在CK+数据集上的acc变化

通过上图可以看出SENet模型在CK+数据集上训练得到的train_acc和val_acc并行变化,在80轮附近趋于稳定。图4.20是SENet模型在CK+数据集上的训练结果。
在这里插入图片描述

图4.20 SENet在CK+数据集上的训练结果

通过上图可以看出,SENet模型训练在第94轮获得最佳训练准确率:0.9808,在第92轮获得最佳验证准确率:0.9596,总训练时间1294.82s。
(4)整体对比总结
三种模型对比分析如表4.1表述

表4.1  三种模型对比统计结果
训练模型	总训练时间	Val_acc_best	Train_acc_bestFERA-C	1265.45	0.9697	0.9977
ResNet	1441.17	0.9406	0.9977
SENet	1294.82	0.9596	0.9808

在对比分析阶段,由于ResNet模型网络深度较深,硬件处理设备无法符合实验要求,故选择三种模型在统一浅层卷积数量中训练。
通过上表可知三种模型在CK+数据集上的最好验证集准确率分别是0.9697、0.9406、0.9596,FERA-C模型在验证集上的最高准确率略高于另外两种模型,由于FERA-C设计时使用了模型裁剪技术减小了参数计算量,故FERA-C模型的总训练时间不算太长,SENet模型作为ResNet模型的升级版,其总训练时间比ResNet模型总训练时间短。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python Qt Designer 初探

代码下载在最下面 #开发环境安装# 本示例在Windows11下, 使用VSCode开发, Python 3.12.2, Qt Designer 5.11 VSCode插件Python、Python Debugger、PYQT Integration、Pylance (准备) VSCode自行官网下载 Visual Studio Code - Code Editing. Redefined (准备) Python 直接…

腾讯和香港中文大学发布文字生成视频AI模型DynamiCrafter

前言 在数字化时代,视觉内容的创造和动态化已成为创意表达和信息传递的重要工具。最近由香港中文大学、腾讯AI Lab联合研发的视频AI模型DynamiCrafter,这一模型能够将静态图像转化为逼真的动态视频,开创了文本到视频生成技术的新纪元。 Hugg…

matlab 将矩阵写入文件

目录 一、概述1、算法概述2、主要函数二、将矩阵写入到文本文件三、将矩阵写入电子表格文件四、将矩阵写入指定的工作表和范围五、将数据追加到电子表格六、将矩阵数据追加到文本文件七、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此…

Go微服务实战——服务的监控与链路追踪(监控数据可视化)

链路追踪背景 对于早期系统或者服务来说,开发人员一般通过打日志的方式来进行埋点(常用的数据采集方式),然后再根据日志系统和性能监控定位及分析问题。对于单体的应用通过日志系统完全可以定位到问题,从而排查异常。…

MySQL B+树索引 和 Redis 中跳表索引的区别

一、MySQL B树索引 和 Redis 中跳表索引 在 MySQL 中常用的索引是 B树索引,而 Redis 中,例如 zset 使用的的是跳表索引,两者有什么区别呢,MySQL 为什么不使用 跳表 呢?或者说 Redis 中为什么不使用 B树 呢&#xff1f…

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据? 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云…

分布式之Skywalking

Skywalking skywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint …

力扣Lc19--- 268. 丢失的数字(java版)-2024年3月20日

1.题目描述 2.知识点 (1)比如数组里面有n个数,然后计算这n个数的总和(用等差求和数列计算),然后减去数组的和,用总和减去数组和即为所得 (2)加强型 for 循环(也称为 for-each 循环&…

[C语言]指针笔试题

题一、 //结构体的大小是20个字节 struct Test{int Num;char *pcName;short sDate;char cha[2];short sBa[4];}*p;//假设p 的值为0x100000。 如下表表达式的值分别为多少? //已知,结构体Test类型的变量大小是20个字节 int main(){printf("%p\n"…

【transformer模型】一篇文章讲透

目录 引言 一、引言 二、Transformer模型的基本结构 1 编码器(python代码片段) 2 解码器 三、自注意力机制的工作原理 四、Transformer模型的应用场景 1 机器翻译 2 文本摘要 3 情感分析 4 语音识别 五、Transformer模型的发展现状及未来趋势…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

Python利用pygame实现飞机大战游戏

文章目录: 一:运行效果 1.演示 2.思路和功能 二:代码 文件架构 Demo 必备知识:python图形化编程pygame游戏模块 一:运行效果 1.演示 效果图◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考&#x…

web集群-lvs-DR模式基本配置

目录 环境: 一、配置RS 1、安装常见软件 2、配置web服务 3、添加vip 4、arp抑制 二、配置LVS 1、添加vip 2、安装配置工具 3、配置DR 三、测试 四、脚本方式配置 1、LVS-DR 2、LVS-RS 环境: master lvs 192.168.80.161 no…

YOLOv5改进系列:新的颈部Eff-QAFPN(Efficientrep)结构助力涨点

一、论文理论 本文提出一种硬件友好的卷积神经网络结构,该结构类似于repvgg。在衡量网络效率时,经常使用Flops或者参数量,这些衡量指标对于硬件计算能力和内存带宽不敏感。因此,如何设计一个神经网络架构,使其有效地利用硬件计算能力和内存带宽是至关重要的。 论文地址:E…

Docker如何端口映射?

Docker是一种流行的开源容器化平台,它允许开发者将应用程序和其依赖资源打包到一个称为容器的可移植单元中。Docker提供了强大的管理和部署工具,使得应用程序可以在不同的环境中运行,无需担心环境配置的问题。在使用Docker部署应用程序时&…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法:滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

7 配置模板虚拟机

使用远程连接工具finalShell连接虚拟机后,接下来我们使用yum命令完成一些基础软件包的安装,以及将咱们新建的用户赋予管理员权限,最后关闭防火墙和卸载自带的JDK。 1. 安装epel-release 我们将使用yum命令进行安装,首先测试是否与…

海外重要行业媒体:知名服务商IntoTheBlock现已集成波场TRON网络分析数据

近日,领先链上分析服务提供商 IntoTheBlock 宣布已将波场 TRON 网络集成至其市场情报套件。该合作引发多家海外加密媒体关注,Crypto Slate、Crypto Briefing等均对此进行了报道,称此次合作意义深远,能帮助数百万用户更深入地了解波场TRON生态系统。 报道表示,波场TRON网络规模大…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…