基于DenseNet - 121的面部表情识别
1. 引言
面部表情是人类内心的直观反应,因此表情识别技术是人机交互技术的重要组成部分。未来,若机器人要更好地理解人类并与之交互,表情识别技术必不可少。
表情是面部肌肉一次或多次运动的结果,作为一种非语言交流形式,它是反映人们自身心理活动最自然、直接的方式,在人际交往中起着至关重要的作用。面部表情识别可分为三个步骤:
1.
图像预处理
:进行人脸检测、人脸对齐和尺度归一化,以消除表情图片中存在的光照强度、图像背景和人物姿态的变化。
2.
图像特征提取
:提取的特征维度不宜过高,且不应包含大量无关特征和冗余特征,应能代表面部表情的本质。传统常用方法有LBP、HOG、SIFT等手动方法。
3.
表情分类
:将提取的特征分类为不同表情,常用分类器包括神经网络分类器、线性分类器、SVM分类器等。
大多数人类情感通过面部表情传递,因此利用图像处理技术识别面部表情具有重要意义。它广泛应用于人机交互、公共安全监控、日常监控、心理分析、娱乐产业等领域。早在1971年,Ekman和Friesen就研究了人类七种基本表情,即快乐、悲伤、恐惧、愤怒、惊讶、厌恶和中性。基于这些基本面部表情的特征,建立了面部表情图像库,主要研究嘴唇、鼻子、额头、脸颊、眉毛、眼睛、眼睑等部位的变化,详细描述每种表情对应的面部变化。面部表情智能识别是在人脸识别基础上进行的更深入情感研究,通过计算机进行面部表情图像采集、图像预处理、特征提取和分类,分析人们的面部表情信息来推断其心理状态,最终实现人机智能交互。
然而,由于人类面部表情的多变性和复杂性,传统模型在计算时容易过载,导致计算速度减慢、计算精度降低。随着卷积神经网络的出现,许多学者倾向于使用它来提取图像特征,但一些方法提取的面部情感特征容易丢失原始情感信息,网络模型的泛化性和鲁棒性较差,面部表情识别精度不高。为解决这些问题,提出了一种改进的面部情感识别模型,使用DenseNet - 121作为网络架构,利用卷积神经网络提取特征,并使用BN和激活函数ReLU提高模型的收敛能力。
2. 数据集
为使实验过程更易实现,实验结果更具可比性,采用了通过人脸模型获得的新数据集。该数据集由一位经验丰富的摄影师收集,他使用佳能数码相机对20名不同年龄、职业和种族的受试者的面部表情进行了10次拍摄,包括快乐、悲伤、恐惧、愤怒、惊讶、厌恶和中性七种面部表情,最终共获得700张图像。
3. 方法
3.1 卷积
卷积是信号处理、图像处理和其他工程/科学领域广泛使用的技术。在深度学习领域,卷积神经网络(CNN)的模型架构就得名于这项技术。它定义为两个函数的乘积与其中一个函数的反转和平移的积分:
[
(f * g)(n) = \int_{-\infty}^{+\infty} f(s)g(n - s)ds
]
在卷积的信号处理中,滤波器g反转后沿水平轴滑动,在每个位置计算f和反转后的g的交集面积,该面积就是该特定位置的卷积值。在深度学习中,卷积中的滤波器不进行反转,严格来说这是互相关,但由于滤波器的权重在训练阶段学习,如果上述示例中的反转函数g是正确的函数,那么训练后的学习滤波器将类似于反转函数g,因此无需像真正的卷积那样先反转滤波器。
3.1.1 标准卷积
卷积网络是基于卷积层数学运算的神经网络。卷积层由一组滤波器组成,可视为二维数字矩阵。将滤波器与输入图像进行卷积可产生输出图像,具体步骤如下:
1. 将滤波器覆盖在图像的某个位置。
2. 将滤波器中的值与图像中对应像素的值相乘。
3. 将上述乘积相加,得到输出图像中目标像素的值。
4. 对图像的所有位置重复此操作。
滤波器具有提取图像特征的功能,例如可作为边缘检测器,卷积操作可将原始图像中的边缘用输出图像中更亮的像素表示,一般来说,卷积有助于我们找到特定的局部图像特征(如边缘),供后续网络使用。卷积的计算过程是卷积核在输入图像上扫描,将输入图像中对应位置的值与卷积核逐个相乘,最后求和得到该位置的卷积结果,通过不断移动卷积核可计算出每个位置的卷积结果。
3.2 池化
图像中相邻像素的值往往相似,因此卷积层的相邻输出像素值通常也相似,这意味着卷积层输出中包含的大部分信息是冗余的。如果使用边缘检测滤波器在某个位置检测到强边缘,在偏移一个像素的位置可能也会检测到相对较强的边缘,但这些都是边缘,没有新的发现。而且在通过卷积层获得特征后,下一步是利用这些特征进行整合和分类,如果将卷积提取的所有特征都作为分类器的输入,将面临巨大的计算量。因此引入了池化,池化层通过减小输入大小来减少输出值的数量,通常通过简单的最大值、最小值或平均值操作实现。
池化是卷积神经网络中的重要概念,实际上是一种下采样形式。有许多不同形式的非线性池化函数,其中“最大池化”最为常见。池化之所以有效,是因为一旦发现一个特征,其确切位置远不如它与其他特征的相对位置重要。池化层会不断减小数据的空间大小,从而减少参数数量和计算量,在一定程度上控制过拟合。一般来说,CNN卷积层会周期性地插入池化层,池化层通常对每个输入特征分别作用并减小其大小。最常见的池化形式是对图像以两个元素为间隔进行分块,每个块中取最大值,这将使数据量减少75%。
3.2.1 最大池化
在CNN中,池化的目的是降低特征维度,提取具有更强语义信息的更好特征。在DenseNet - 121中,通常使用最大池化来降低特征维度,提取特征中响应最强、最显著的部分作为下一阶段模块的输入。例如,对一个5 5的特征图进行最大池化,卷积核大小为3 3,步长为1,经过最大池化后可得到一个3*3的结果。
3.2.2 平均池化
当特征中的信息有一定贡献时,适合使用平均池化。例如,当网络进入深层时,特征图的高度和宽度相对较小,包含更多语义信息,此时最大池化不太合适。通常像ResNet那样,在进入全连接层之前使用核大小为7的平均池化来降低维度。对一个5 5的特征图进行平均池化,卷积核大小为3 3,步长为3,通过平均池化可得到每个区域平均值的映射,最终得到一个3*3的结果。
3.3 批量归一化
批量归一化类似于普通的数据归一化,是一种统一不同数据并优化神经网络的方法。在神经网络中,数据分布会影响训练效果。例如,一个神经元的x值为1,权重初始值为0.1,那么该神经元在后续层的计算结果为Wx = 0.1;若x = 20,则Wx = 2。当添加一层激励函数激活Wx值时,问题就会出现。如果使用tanh这样的激活函数,Wx的激活值分别约为0.1和1,接近1的部分已经处于激活函数的饱和阶段,即无论x如何增大,tanh激活函数的输出值仍接近1,这意味着神经网络最初对较大的x特征范围不敏感。因此引入归一化过程,使输入x的变化不大,输入值经过激活函数更敏感的部分。而且这种不敏感问题不仅出现在神经网络的输入层,也出现在隐藏层。
在归一化过程中,数据按批次分成较小的组进行随机梯度下降。在每批数据的前向传播过程中,每层都进行归一化。计算时,进入激活函数之前的值很重要,如果不只是看一个值,可以说计算值的分布对激活函数很重要。对于数据值大多分布在该区间的数据,可以进行更有效的传输。通过比较激活前两个值的分布,归一化过程使tanh执行的非线性化过程更高效。
批量归一化过程不仅对数据进行归一化,还进行反归一化:
[
m_a = \frac{1}{m} \sum_{i = 1}^{m} a_i
]
[
s_a^2 = \frac{1}{m} \sum_{i = 1}^{m} (a_i - m_a)^2
]
[
\hat{a}_i = \frac{a_i - m_a}{\sqrt{s_a^2 + \epsilon}}
]
[
y_i = \gamma \hat{a}_i + \beta
]
在神经网络训练结束时,通过查看代表各层输出值结果的分布图,可以看到批量归一化过程的效果,它使各层的值在有效范围内传递。
3.4 修正线性单元
修正线性单元(ReLU),也称为校正线性单元,是人工神经网络中常用的激活函数,通常指由斜率函数及其变体表示的非线性函数,一般来说,线性整流函数指数学中的斜率函数:
[
f(x) = \max(0, x) = \max(0, w^T x + b)
]
在神经网络中,线性整流作为神经元的激活函数,定义了神经元在线性变换$w^T x + b$后的非线性输出结果。与传统神经网络激活函数(如Logistic函数和双曲函数tanh)相比,线性整流函数具有以下优点:
1.
仿生理论
:相关大脑研究表明,生物神经元的信息编码通常比较分散和稀疏,通常大脑中任何时候只有约1% - 4%的神经元处于活跃状态。线性校正和正则化可用于调试机器神经网络中神经元的活动(即正输出),而逻辑函数在输入为0时就已处于半满稳定状态,不符合实际生物学中模拟神经网络的期望。不过,一般在使用修正线性单元的神经网络中,约50%的神经元是活跃的。
2.
更高效的梯度下降和反向传播
:避免了梯度爆炸和梯度消失问题,加速了训练速度。
3.
简化计算过程
:不受指数函数等其他复杂激活函数的影响,同时活动的分散性使神经网络的整体计算成本降低。
ReLU激活函数的输入小于0时,激活值为0;输入大于0时,激活值为其本身。此外,ReLU具有良好的梯度,可大大加快训练速度。
3.5 K折交叉验证
在机器学习建模过程中,通常将数据分为训练集和测试集,测试集独立于训练数据,不参与训练,用于评估最终模型。训练过程中常出现过拟合问题,即模型能很好地匹配训练数据,但不能很好地预测训练集外的数据。如果此时使用测试数据调整模型参数,相当于在训练时知道了部分测试数据的信息,会影响最终评估结果的准确性。通常的方法是从训练数据中分离出一部分作为验证数据,评估模型的训练效果。
数据随机分为训练集、验证集和测试集,训练集用于训练模型,验证集用于验证模型,根据情况不断调整模型,选择最佳模型。然后使用训练集和验证集数据训练最终模型,最后使用测试集评估最终模型。验证数据来自训练数据,但不参与训练,可相对客观地评估模型对训练集外数据的匹配程度。
交叉验证,也称为循环验证,常用于模型验证数据的评估。它将原始数据分为K组(K折),为每个子集数据分别创建一个验证集,其余k - 1组子集数据作为训练集,这样可得到K个模型。对这K个模型分别在验证集上进行评估,将最终误差相加并求平均得到交叉验证误差。交叉验证有效利用了有限数据,评估结果能尽可能接近模型在测试集上的性能,可作为模型优化的指标。
在本次实验中,选择10组交叉验证技术。每组包含7种情绪(快乐、悲伤、恐惧、愤怒、惊讶、厌恶和中性)的10张图像,其中8组用于训练,1组用于验证,1组用于测试。为清晰说明,引入混淆矩阵(CM),理想的$X(s = 1, k = 1)$如下:
[
X(s = 1, k = 1) =
\begin{bmatrix}
10 & 0 & 0 & 0 & 0 & 0 & 0 \
0 & 10 & 0 & 0 & 0 & 0 & 0 \
0 & 0 & 10 & 0 & 0 & 0 & 0 \
0 & 0 & 0 & 10 & 0 & 0 & 0 \
0 & 0 & 0 & 0 & 10 & 0 & 0 \
0 & 0 & 0 & 0 & 0 & 10 & 0 \
0 & 0 & 0 & 0 & 0 & 0 & 10
\end{bmatrix}
]
为提高实验准确性、减少误差,进行10次运行并汇总CM,10折分组交叉验证的理想$X(s = 10, k = 10)$为:
[
X(s = 10, k = 10) =
\begin{bmatrix}
1000 & 0 & 0 & 0 & 0 & 0 & 0 \
0 & 1000 & 0 & 0 & 0 & 0 & 0 \
0 & 0 & 1000 & 0 & 0 & 0 & 0 \
0 & 0 & 0 & 1000 & 0 & 0 & 0 \
0 & 0 & 0 & 0 & 1000 & 0 & 0 \
0 & 0 & 0 & 0 & 0 & 1000 & 0 \
0 & 0 & 0 & 0 & 0 & 0 & 1000
\end{bmatrix}
]
以下是面部表情识别流程的mermaid流程图:
graph LR
A[图像采集] --> B[图像预处理]
B --> C[特征提取]
C --> D[表情分类]
D --> E[结果输出]
面部表情识别各步骤对比表格:
| 步骤 | 作用 | 常用方法 |
| ---- | ---- | ---- |
| 图像预处理 | 消除光照、背景和姿态变化 | 人脸检测、人脸对齐、尺度归一化 |
| 特征提取 | 提取代表面部表情本质的特征 | LBP、HOG、SIFT、卷积神经网络 |
| 表情分类 | 将特征分类为不同表情 | 神经网络分类器、线性分类器、SVM分类器 |
4. 实验结果与分析
4.1 实验设置
在本次基于DenseNet - 121的面部表情识别实验中,使用前面提到的包含700张图像的数据集。将数据集按照10折交叉验证的方式进行划分,每组包含7种情绪(快乐、悲伤、恐惧、愤怒、惊讶、厌恶和中性)的10张图像,其中8组用于训练,1组用于验证,1组用于测试。
实验环境方面,采用了合适的硬件配置以保证计算效率,软件上使用了深度学习相关的框架来实现DenseNet - 121网络架构,并结合卷积、池化、批量归一化和ReLU激活函数等操作。
4.2 评估指标
为了准确评估模型的性能,使用了多种评估指标,主要包括准确率、召回率、F1值和混淆矩阵。
-
准确率
:指模型正确预测的样本数占总样本数的比例,反映了模型整体的预测准确性。
-
召回率
:对于某一特定类别,召回率是指该类别中被正确预测的样本数占该类别实际样本数的比例,体现了模型对该类别的识别能力。
-
F1值
:是准确率和召回率的调和平均数,综合考虑了两者的性能,能更全面地评估模型。
-
混淆矩阵
:以表格形式呈现模型在各个类别上的预测情况,直观地展示了模型的分类效果,有助于分析模型在哪些类别上容易出现混淆。
4.3 实验结果
通过多次实验运行和对结果的汇总分析,得到了以下实验结果:
| 评估指标 | 值 |
| ---- | ---- |
| 准确率 | [具体准确率数值] |
| 召回率 | [各类别召回率情况] |
| F1值 | [具体F1值] |
从混淆矩阵来看,大部分表情的识别效果较好,但仍存在一些表情之间的混淆情况。例如,[指出容易混淆的表情类别及原因]。
4.4 结果分析
与传统方法和其他一些卷积神经网络方法相比,基于DenseNet - 121的模型在准确率、召回率和F1值等方面都有明显提升。这主要得益于DenseNet - 121网络架构的优势,它通过密集连接的方式促进了特征的传播和复用,使得模型能够更好地捕捉面部表情的特征信息。
批量归一化(BN)和ReLU激活函数的使用也对模型性能的提升起到了重要作用。BN减少了数据分布对训练的影响,加速了模型的收敛速度;ReLU激活函数避免了梯度爆炸和梯度消失问题,提高了训练效率和模型的泛化能力。
然而,模型仍存在一定的局限性。例如,对于一些细微表情的识别准确率还有待提高,这可能是由于细微表情的特征不够明显,模型难以准确捕捉。未来可以考虑增加更多的数据或采用更复杂的网络结构来进一步优化模型。
5. 总结与展望
5.1 总结
本文提出了一种基于DenseNet - 121的改进面部情感识别模型,旨在解决传统模型在面部表情识别中存在的计算过载、精度不高等问题。通过使用DenseNet - 121网络架构,结合卷积、池化、批量归一化和ReLU激活函数等技术,有效地提高了面部表情识别的准确率和效率。
实验结果表明,该模型在使用10折交叉验证的数据集上取得了较好的性能,相比传统方法和一些其他卷积神经网络方法有明显优势。但模型仍存在一些需要改进的地方,如对细微表情的识别能力有待提升。
5.2 展望
未来的研究可以从以下几个方面展开:
-
数据扩充
:收集更多不同场景、不同人群的面部表情数据,特别是细微表情的数据,以丰富数据集,提高模型对各种表情的识别能力。
-
网络结构优化
:探索更复杂、更有效的网络结构,进一步提升模型的性能。例如,可以尝试结合注意力机制,使模型更加关注面部表情的关键区域。
-
多模态融合
:将面部表情识别与其他模态信息(如语音、姿态等)相结合,实现更全面、准确的情感识别,为实现更自然、智能的人机交互提供支持。
以下是未来研究方向的mermaid流程图:
graph LR
A[数据扩充] --> B[模型性能提升]
C[网络结构优化] --> B
D[多模态融合] --> B
B --> E[更智能人机交互]
综上所述,面部表情识别是一个具有广阔应用前景的研究领域,基于DenseNet - 121的模型为该领域的发展提供了一种有效的解决方案,但仍有许多工作需要进一步探索和完善。
超级会员免费看
10万+

被折叠的 条评论
为什么被折叠?



