表情识别在计算机视觉和人机交互中具有广泛的应用前景。基于深度学习的表情识别系统可以帮助识别和分析人脸上的情绪状态,应用于智能安防、情感计算和社交机器人等领域。本文将介绍我们基于改进的MobileNetV3模型进行表情识别的工作。通过引入CBAM注意力机制和GELU激活函数,我们有效地提升了模型的性能和准确度。
RAF-DB(Real-world Affective Faces Database)是一个广泛应用于表情识别研究的数据集。该数据集由英属哥伦比亚大学的研究人员构建,旨在为表情识别和情感计算领域提供一个高质量且具有挑战性的资源。RAF-DB数据集包含了大量的真实世界人脸图像,涵盖了各种不同的表情、年龄、性别和种族等多种多样的情况。
RAF-DB数据集包含29,672张人脸图像,这些图像被分为训练集和测试集。数据集中的每张图像都被标注为7种基本表情之一。具体的表情类别及其对应的编号如下:
RAF-DB数据集在表情识别、情感计算、人机交互等研究领域有着广泛的应用。研究人员可以利用该数据集训练和测试各种深度学习模型,以提高模型在复杂环境下的表情识别准确度。此外,RAF-DB还可以用于研究跨文化情感表达的差异、情感识别算法的鲁棒性等课题。
通过对RAF-DB数据集的利用和研究,表情识别领域的研究人员可以开发出更为先进和准确的模型,从而推动情感计算和人机交互技术的发展。
MobileNetV3是一种轻量级的卷积神经网络架构,以其高效的计算性能和较小的模型大小而受到广泛关注。然而,在复杂的表情识别任务中,原始的MobileNetV3仍然存在一些显著的问题。
首先,MobileNetV3设计初衷是为了在移动设备和嵌入式系统上运行,因此它在追求轻量化的同时,对特征提取的能力有所折中。在表情识别中,需要对面部的细微变化进行准确捕捉,这对特征提取的能力提出了更高的要求。MobileNetV3中的深度可分离卷积虽然减少了计算量,但在捕捉局部细节特征方面存在不足,可能会影响到模型的准确性。
其次,原始的MobileNetV3使用了ReLU(Rectified Linear Unit)激活函数。ReLU是一种常用的激活函数,具有计算简单和收敛速度快的优点。然而,ReLU在输入为负值时直接输出零,可能会导致特征信息的丢失,特别是在处理具有微小变化的表情时,这种信息丢失会对识别效果产生负面影响。此外,ReLU函数还存在“死亡ReLU”问题,即当大量神经元的输出恒为零时,网络的学习能力会受到限制。
为了克服原始MobileNetV3在表情识别任务中的局限性,我们对模型进行了两方面的改进:引入CBAM注意力机制和使用GELU激活函数。
首先,我们在MobileNetV3的基础上引入了CBAM(Convolutional Block Attention Module)注意力机制。CBAM通过通道注意力和空间注意力两个模块,增强了模型对重要特征的关注。通道注意力模块通过自适应地调整各个通道的权重,使得模型能够重点关注具有重要信息的通道,而忽略无关或噪声信息。空间注意力模块则通过自适应地调整各个空间位置的权重,使得模型能够重点关注具有显著特征的位置。通过引入CBAM,模型在特征提取阶段能够更有效地捕捉和利用面部的细微变化,从而提高了表情识别的准确性。其中CBAM的网络结构图如下:
其次,我们将原始网络中的ReLU激活函数替换为GELU(Gaussian Error Linear Unit)激活函数。GELU函数在保留输入信息的同时,引入了随机性,使得激活函数的输出更加平滑和连续,能够更好地保留特征信息。与ReLU相比,GELU可以更有效地处理负值输入,减少了特征信息的损失,从而提高了模型的学习能力和泛化性能。此外,GELU还具有良好的数学性质和计算稳定性,有助于提高模型的训练效率和收敛速度。 好的,以下是关于GELU激活函数相对于ReLU激活函数的优势,特别是在表情识别中的应用优势的详细说明:
ReLU(Rectified Linear Unit):ReLU是深度学习中最常用的激活函数之一,定义为
ReLU函数的主要特点是简洁且计算效率高,但它在输入为负值时直接输出零,可能导致信息丢失,并且存在“死亡ReLU”问题。
GELU(Gaussian Error Linear Unit):GELU是一种较新的激活函数,定义为
其中
是标准正态分布的累积分布函数。GELU在输入较小时的输出接近于零,而输入较大时的输出接近于输入值本身,使其具有平滑和连续的特点。
2.1 平滑性和连续性 GELU的输出是平滑和连续的,而ReLU的输出在输入为零时存在不连续性。这种平滑和连续性使得GELU在保留输入信息的同时,能够更好地捕捉特征,从而提高模型的表达能力。在表情识别中,面部表情的细微变化往往需要精细的特征捕捉,GELU的平滑性有助于提高识别的精确度。
2.2 随机性处理 GELU引入了标准正态分布的累积分布函数,使得激活函数在处理负值输入时不完全归零,而是根据概率逐渐减小。相比之下,ReLU在负值输入时直接输出零,可能导致信息丢失。在表情识别中,面部表情的变化有时是微弱且复杂的,GELU可以更好地保留这些微弱特征,提高模型的鲁棒性和泛化能力。
2.3 避免“死亡ReLU” ReLU存在“死亡ReLU”问题,即当大量神经元的输出恒为零时,网络的学习能力会受到限制。而GELU由于其平滑的输出函数,不会出现大规模神经元输出为零的情况,从而避免了“死亡ReLU”问题。在表情识别中,这意味着模型可以更稳定地学习和捕捉面部表情特征。
2.4 数学性质和计算稳定性 GELU具有良好的数学性质和计算稳定性。它的定义基于标准正态分布的累积分布函数,具有明确的数学意义和稳定的计算过程。这种稳定性有助于在训练过程中保持梯度的平滑传递,避免梯度消失或爆炸的问题。在表情识别中,这有助于提高模型的训练效率和收敛速度。
3.1 提高识别准确度 由于GELU的平滑性和连续性,模型在处理面部表情的细微变化时表现更好。这有助于提高表情识别的准确度,特别是在处理复杂和多样化的表情数据时。
3.2 增强模型的鲁棒性 GELU能够更好地处理负值输入并保留输入信息,使得模型在面对不同表情和面部特征时具有更强的鲁棒性。这对于在实际应用中处理各种不同场景和光照条件下的表情识别尤为重要。
3.3 改善训练过程 GELU具有良好的数学性质和计算稳定性,有助于在训练过程中保持梯度的平滑传递,避免梯度消失或爆炸的问题。这使得模型训练更为高效和稳定,有助于在较短时间内达到收敛,从而提高表情识别系统的开发效率。
通过以上优势的综合作用,GELU在表情识别中的应用显著提升了模型的性能和准确性,使得识别系统能够更准确地捕捉和分析面部表情,满足实际应用中的高要求。
通过这两方面的改进,我们的改进版MobileNetV3模型在表情识别任务中取得了显著的性能提升,能够更准确地识别和分析面部表情,满足实际应用中的需求。
需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:Aspiringcode - 编程抱负 即刻实现
4.核心代码
class MobileNetV3_small(nn.Module):
cfg = [
(16, 3, 16, 2, True, 'RE'),
(24, 3, 72, 2, False, 'RE'),
(24, 3, 88, 1, False, 'RE'),
(40, 5, 96, 2, True, 'HS'),
(40, 5, 240, 1, True, 'HS'),
(40, 5, 240, 1, True, 'HS'),
(48, 5, 120, 1, True, 'HS'),
(48, 5, 144, 1, True, 'HS'),
(96, 5, 288, 2, True, 'HS'),
(96, 5, 576, 1, True, 'HS'),
(96, 5, 576, 1, True, 'HS')
]
baseline:
加入CBAM模块后:
对比于baseline获得了0.4个点的提升。 加入CBAM+GELU函数后:
获得了1个点的提升 识别效果展示如下:
mobilenetV3:https://ieeexplore.ieee.org/document/9008835 CBAM Attention:https://link.springer.com/chapter/10.1007/978-3-030-01234-2_1 GELU:https://arxiv.org/abs/1606.08415
在附件中即可所得代码,安装所需要的环境即可运行,运行pip install -r requrement.txt后,运行python train.py即可。数据集下载地址在附件的readme文件中。
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!