irpas技术客

【Pytorch】基于卷积神经网络实现的面部表情识别_薄荷糖C_基于卷积神经网络的面部表情识别

网络 3054

作者:何翔

学院:计算机学院

学号:04191315

班级:软件1903

转载请标注本文链接: https://blog.csdn.net/HXBest/article/details/121981276

一、绪论 1.1 研究背景

面部表情识别 (Facial Expression Recognition )

在日常工作和生活中,人们情感的表达方式主要有:语言、声音、肢体行为(如手势)、以及面部表情等。在这些行为方式中,面部表情所携带的表达人类内心情感活动的信息最为丰富,据研究表明,人类的面部表情所携带的内心活动的信息在所有的上述的形式中比例最高,大约占比55%。

人类的面部表情变化可以传达出其内心的情绪变化,表情是人类内心世界的真实写照。上世纪70年代,美国著名心理学家保罗?艾克曼经过大量实验之后,将人类的基本表情定义为悲伤、害怕、厌恶、快乐、气愤和惊讶六种。同时,他们根据不同的面部表情类别建立了相应的表情图像数据库。随着研究的深入,中性表情也被研究学者加入基本面部表情中,组成了现今的人脸表情识别研究中的七种基础面部表情。

由于不同的面部表情,可以反映出在不同情景下人们的情绪变化以及心理变化,因此面部表情的识别对于研究人类行为和心理活动,具有十分重要的研究意义和实际应用价值。现如今,面部表情识别主要使用计算机对人类面部表情进行分析识别,从而分析认得情绪变化,这在人机交互、社交网络分析、远程医疗以及刑侦监测等方面都具有重要意义。

1.2 研究意义

在计算机视觉中,因为表情识别作为人机交互的一种桥梁,可以更好的帮助机器了解、识别人类的内心活动,从而更好的服务人类,因此对人脸表情识别进行深入研究具有十分重要的意义。而在研究人脸表情的过程中,如何有效地提取人脸表情特征,是人脸表情识别中最为关键的步骤。人脸表情识别从出现到现在已历经数十载,在过去的面部表情识别方法里还是主要依靠于人工设计的特征(比如边和纹理描述量)和机器学习技术(如主成分分析、线性判别分析或支持向量机)的结合。但是在无约束的环境中,人工设计对不同情况的特征提取是很困难的,同时容易受外来因素的干扰(光照、角度、复杂背景等),进而导致识别率下降。

随着科学技术的发展,传统的一些基于手工提取人脸表情图像特征的方法,因为需要研究人员具有比较丰富的经验,具有比较强的局限性,从而给人脸表情识别的研究造成了比较大的困难。随着深度学习的兴起,作为深度学习的经典代表的卷积神经网络,由于其具有自动提取人脸表情图像特征的优势,使得基于深度学习的人脸表情特征提取方法逐渐兴起,并逐步替代一些传统的人脸表情特征提取的方法。深度学习方法的主要优点在于它们可通过使用非常大的数据集进行训练学习从而获得表征这些数据的最佳功能。在深度学习中,使用卷积神经网络作为人脸表情特征提取的工具,可以更加完整的提取人脸表情特征,解决了一些传统手工方法存在的提取人脸表情特征不充足的问题。

将人脸表情识别算法按照特征提取方式进行分类,其主要分为两种:一是基于传统的计算机视觉的提取算法。该类方法主要依赖于研究人员手工设计来提取人脸表情特征;二是基于深度学习的算法。该方法使用卷积神经网络,自动地提取人脸表情特征。卷积神经网络对原始图像进行简单的预处理之后,可以直接输入到网络中,使用端到端的学习方法,即不经过传统的机器学习复杂的中间建模过程,如在识别中对数据进行标注、翻转处理等,直接一次性将数据标注好,同时学习特征与进行分类,这是深度学习方法与传统方法的重要区别。相比人工的选取与设计图像特征,卷积神经网络通过自动学习的方式,获得的样本数据的深度特征信息拥有更好的抗噪声能力、投影不变性、推广与泛化能力、抽象语义表示能力。

二、理论分析与研究 2.1 面部表情识别框架

面部表情识别通常可以划分为四个进程。包括图像获取,面部检测,图像预处理和表情分类。其中,面部检测,脸部特征提取和面部表情分类是面部表情识别的三个关键环节面部表情识别的基本框架如下图所示。

首先是获取图像并执行面部检测,然后提取仅具有面部的图像部分。所提取的面部表情在比例和灰度上不均匀,因此有必要对面部特征区域进行分割和归一化,其中执行归一化主要是对面部光照和位置进行统一处理,将图像统一重塑为标准大小,如 48×48 像素的图片,即图像预处理。然后对脸部图像提取面部表情特征值,并进行分类。采用卷积神经网络(CNN)来完成特征提取和分类的任务,因为 CNN 是模仿人脑工作并建立卷积神经网络结构模型的著名模型,所以选择卷积神经网络作为构建模型体系结构的基础,最后不断训练,优化,最后达到较准确识别出面部表情的结果。

图像预处理

采用多普勒扩展法的几何归一化分为两个主要步骤:面部校正和面部修剪。

主要目的是将图像转化为统一大小。

具体步骤如下:

(1)找到特征点并对其进行标记,首先选取两眼和鼻子作为三个特征点并采用一个函数对其进行标记,这里选择的函数是[x,y]=ginput(3)。这里重要的一点是获得特征点的坐标值,可以用鼠标进行调整。

(2)两眼的坐标值可以看作参考点,将两眼之间的距离设置为 d,找到两眼间的中点并标记为 O,然后根据参考点对图像进行旋转,这步操作是为了保证将人脸图像调到一致。

(3)接下来以选定的 O 为基准,分别向左右两个方向各剪切距离为 d 的区域,在垂直方向剪切 0.5d 和 1.5d 的区域,这样就可以根据面部特征点和几何模型对特征区域进行确定,如下图所示:

(4)为了更好的对表情进行提取,可将表情的子区域图像裁剪成统一的 48×48 尺寸。

2.2 基于 CNN 的人脸面部表情识别算法

卷积神经网络(CNN)是一种前馈神经网络,它包括卷积计算并具有较深的结构,因此是深度学习的代表性算法之一。随着科技的不断进步,人们在研究人脑组织时受启发创立了神经网络。神经网络由很多相互联系的神经元组成,并且可以在不同的神经元之间通过调整传递彼此之间联系的权重系数 x 来增强或抑制信号。标准卷积神经网络通常由输入层、卷积层、池化层、全连接层和输出层组成,如下图所示:

上图中第一层为输入层,大小为 28×28,然后通过 20×24×24 的卷积层,得到的结果再输入池化层中,最后再通过图中第四层既全连接层,直到最后输出。

下图为CNN常见的网络模型。其中包括 4 个卷积层,3 个池化层,池化层的大小为 3×3,最终再通过两个全连接层到达输出层。网络模型中的输入层一般是一个矩阵,卷积层,池化层和全连接层可以当作隐藏层,这些层通常具有不同的计算方法,需要学习权重以找到最佳值。

从上述中可知,标准卷积神经网络除了输入和输出外,还主要具有三种类型:池化层,全连接层和卷积层。这三个层次是卷积神经网络的核心部分。

2.2.1 卷积层

卷积层是卷积神经网络的第一层,由几个卷积单元组成。每个卷积单元的参数可以通过反向传播算法进行优化,其目的是提取输入的各种特征,但是卷积层的第一层只能提取低级特征,例如边、线和角。更多层的可以提取更高级的特征,利用卷积层对人脸面部图像进行特征提取。一般卷积层结构如下图所示,卷积层可以包含多个卷积面,并且每个卷积面都与一个卷积核相关联。

由上图可知,每次执行卷积层计算时,都会生成与之相关的多个权重参数,这些权重参数的数量与卷积层的数量相关,即与卷积层所用的函数有直接的关系。

2.2.2 池化层

在卷积神经网络中第二个隐藏层便是池化层,在卷积神经网络中,池化层通常会在卷积层之间,由此对于缩小参数矩阵的尺寸有很大帮助,也可以大幅减少全连接层中的参数数量。此外池化层在加快计算速度和防止过拟合方面也有很大的作用。在识别图像的过程中,有时会遇到较大的图像,此时希望减少训练参数的数量,这时需要引入池化层。池化的唯一目的是减小图像空间的大小。常用的有 mean-pooling 和max-pooling。mean-pooling 即对一小块区域取平均值,假设 pooling 窗的大小是 2×2,那么就是在前面卷积层的输出的不重叠地进行 2×2 的取平均值降采样,就得到 mean-pooling 的值。不重叠的 4 个 2×2 区域分别 mean-pooling 如下图所示。

max-pooling 即对一小块区域取最大值,假设 pooling 的窗大小是 2×2,就是在前面卷积层的输出的不重叠地进行 2×2 的取最大值降采样,就得到 max-pooling 的值。不重叠的 4 个 2×2 区域分别max-pooling 如下图所示:

2.2.3 全连接层

卷积神经网络中的最后一个隐藏层是全连接层。该层的角色与之前的隐藏层完全不同。卷积层和池化层的功能均用于面部图像的特征提取,而全连接层的主要功能就是对图像的特征矩阵进行分类。根据不同的状况,它可以是一层或多层。

通过该层的图片可以高度浓缩为一个数。由此全连接层的输出就是高度提纯的特征了,便于移交给最后的分类器或者回归。

2.2.4 网络的训练

神经网络通过自学习的方式可以获得高度抽象的,手工特征无法达到的特征,在计算机视觉领域已经取得了革命性的突破。被广泛的应用于生活中的各方面。而要想让神经网络智能化,必须对它进行训练,在训练过程中一个重要的算法就是反向传播算法。反向传播算法主要是不断调整网络的权重和阈值,以得到最小化网络的平方误差之和,然后可以输出想要的结果。

2.2.5 CNN模型的算法评价

卷积神经网络由于强大的特征学习能力被应用于面部表情识别中,从而极大地提高了面部表情特征提取的效率。与此同时,卷积神经网络相比于传统的面部表情识别方法在数据的预处理和数据格式上得到了很大程度的简化。例如,卷积神经网络不需要输入归一化和格式化的数据。基于以上优点,卷积神经网络在人类面部表情识别这一领域中的表现要远远优于其他传统算法。

2.3 基于 VGG 的人脸面部表情识别算法

随着深度学习算法的不断发展,众多卷积神经网络算法已经被应用到机器视觉领域中。尽管卷积神经网络极大地提高了面部表情特征提取的效率,但是,基于卷积神经网络的算法仍存在两个较为典型的问题:

(1)忽略图像的二维特性。

(2)常规神经网络提取的表情特征鲁棒性较差。

因此,我们需要寻找或设计一种对人类面部表情的识别更加优化并准确的深度卷积神经网络模型。

2.3.1 VGG模型原理

VGG模型的提出

VGGNet是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,网络名称VGGNet取自该小组名缩写。VGGNet是首批把图像分类的错误率降低到10%以内模型,同时该网络所采用的3\times33×3卷积核的思想是后来许多模型的基础,该模型发表在2015年国际学习表征会议(International Conference On Learning Representations, ICLR)后至今被引用的次数已经超过1万4千余次。

在原论文中的VGGNet包含了6个版本的演进,分别对应VGG11、VGG11-LRN、VGG13、VGG16-1、VGG16-3和VGG19,不同的后缀数值表示不同的网络层数(VGG11-LRN表示在第一层中采用了LRN的VGG11,VGG16-1表示后三组卷积块中最后一层卷积采用卷积核尺寸为 1\times11×1 ,相应的VGG16-3表示卷积核尺寸为 3\times33×3 )。下面主要以的VGG16-3为例。

上图中的VGG16体现了VGGNet的核心思路,使用 3\times33×3 的卷积组合代替大尺寸的卷积(2个 3\times33×3 卷积即可与 5\times55×5 卷积拥有相同的感受视野)。

感受野(Receptive Field),指的是神经网络中神经元“看到的”输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。那么如果在我感受野相同的条件下,我让中间层数更多,那么能提取到的特征就越丰富,效果就会更好。

VGG块的组成规律是:连续使用数个相同的填充为1、窗口形状为 3\times33×3 的卷积层后接上一个步幅为2、窗口形状为 2\times22×2 的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。

2.3.2 VGG模型的优点

(1)小卷积核: 将卷积核全部替换为3x3(极少用了1x1),作用就是减少参数,减小计算量。此外采用了更小的卷积核我们就可以使网络的层数加深,就可以加入更多的激活函数,更丰富的特征,更强的辨别能力。卷积后都伴有激活函数,更多的卷积核的使用可使决策函数更加具有辨别能力。其实最重要的还是多个小卷积堆叠在分类精度上比单个大卷积要好。

(2)小池化核: 相比AlexNet的3x3的池化核,VGG全部为2x2的池化核。

(3)层数更深: 从作者给出的6个试验中我们也可以看到,最后两个实验的的层数最深,效果也是最好。

(4)卷积核堆叠的感受野: 作者在VGGnet的试验中只使用了两中卷积核大小:1*1,3*3。并且作者也提出了一种想法:两个3*3的卷积堆叠在一起获得的感受野相当于一个5*5卷积;3个3x3卷积的堆叠获取到的感受野相当于一个7x7的卷积。


input=8,3层conv3x3后,output=2,等同于1层conv7x7的结果;input=8,2层conv3x3后,output=2,等同于2层conv5x5的结果。

由上图可知,输入的8个神经元可以想象为feature map的宽和高,conv3 、conv5 、conv7 、对应stride=1,pad=0 。从结果我们可以得出上面推断的结论。此外,倒着看网络,也就是 backprop 的过程,每个神经元相对于前一层甚至输入层的感受野大小也就意味着参数更新会影响到的神经元数目。在分割问题中卷积核的大小对结果有一定的影响,在上图三层的 conv3x3 中,最后一个神经元的计算是基于第一层输入的7个神经元,换句话说,反向传播时,该层会影响到第一层 conv3x3 的前7个参数。从输出层往回forward同样的层数下,大卷积影响(做参数更新时)到的前面的输入神经元越多。

(5)全连接转卷积:VGG另一个特点就是使用了全连接转全卷积,它把网络中原本的三个全连接层依次变为1个conv7x7,2个conv1x1,也就是三个卷积层。改变之后,整个网络由于没有了全连接层,网络中间的 feature map 不会固定,所以网络对任意大小的输入都可以处理。

2.3.3 VGG模型的算法评价

综上所述,VGG采用连续的小卷积核代替较大卷积核,以获取更大的网络深度。 例如,使用 2 个 3?3 卷积核代替 5?5 卷积核。这种方法使得在确保相同感知野的条件下,VGG 网络具有比一般的 CNN 更大的网络深度,提升了神经网络特征提取及分类的效果。

2.4 基于 ResNet 的人脸面部表情识别算法 2.4.1 ResNet模型原理

ResNet模型的提出

ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广性非常好,甚至可以直接用到InceptionNet网络中。

下图是ResNet34层模型的结构简图:

在ResNet网络中有如下几个亮点:

提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)使用Batch Normalization加速训练(丢弃dropout)

在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。

梯度消失或梯度爆炸。退化问题(degradation problem)。

在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题。但是对于退化问题(随着网络层数的加深,效果还会变差,如下图所示)并没有很好的解决办法。

所以ResNet论文提出了residual结构(残差结构)来减轻退化问题。下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,反而变的更好了。

2.4.2 残差结构(residual)

残差指的是什么?

其中ResNet提出了两种mapping:一种是identity mapping,指的就是下图中”弯弯的曲线”,另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y=F(x)+x

identity mapping

顾名思义,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y?x,所以残差指的就是F(x)部分。

下图是论文中给出的两种残差结构。左边的残差结构是针对层数较少网络,例如ResNet18层和ResNet34层网络。右边是针对网络层数较多的网络,例如ResNet101,ResNet152等。为什么深层网络要使用右侧的残差结构呢。因为,右侧的残差结构能够减少网络参数与运算量。同样输入一个channel为256的特征矩阵,如果使用左侧的残差结构需要大约1170648个参数,但如果使用右侧的残差结构只需要69632个参数。明显搭建深层网络时,使用右侧的残差结构更合适。

下面先对左侧的残差结构(针对ResNet18/34)进行一个分析。如下图所示,该残差结构的主分支是由两层3x3的卷积层组成,而残差结构右侧的连接线是shortcut分支也称捷径分支(注意为了让主分支上的输出矩阵能够与我们捷径分支上的输出矩阵进行相加,必须保证这两个输出特征矩阵有相同的shape)。如果刚刚仔细观察了ResNet34网络结构图,应该能够发现图中会有一些虚线的残差结构。在原论文中作者只是简单说了这些虚线残差结构有降维的作用,并在捷径分支上通过1x1的卷积核进行降维处理。而下图右侧给出了详细的虚线残差结构,注意下每个卷积层的步距stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。

接着再来分析下针对ResNet50/101/152的残差结构,如下图所示。在该残差结构当中,主分支使用了三个卷积层,第一个是1x1的卷积层用来压缩channel维度,第二个是3x3的卷积层,第三个是1x1的卷积层用来还原channel维度(注意主分支上第一层卷积层和第二次卷积层所使用的卷积核个数是相同的,第三次是第一层的4倍)。该残差结构所对应的虚线残差结构如下图右侧所示,同样在捷径分支上有一层1x1的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。

下面这幅图是原论文给出的不同深度的ResNet网络结构配置,注意表中的残差结构给出了主分支上卷积核的大小与卷积核个数,表中的xN表示将该残差结构重复N次。那到底哪些残差结构是虚线残差结构呢。

对于我们ResNet18/34/50/101/152,表中conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层残差结构都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的使命(将特征矩阵的高和宽缩减为原来的一半,将深度channel调整成下一层残差结构所需要的channel)。下面给出了简单标注了一些信息的ResNet34网络结构图。

对于ResNet50/101/152,其实在conv2_x所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的channel,根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但我们conv2_x所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵shape是[56, 56, 256](因为这样才能保证输入输出特征矩阵shape相同,才能将捷径分支的输出与主分支的输出进行相加)。所以第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256]。注意,这里只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半)。

2.4.3 ResNet模型的算法评价

ResNet已经被广泛运用于各种特征提取应用中,它的出现解决了网络层数到一定的深度后分类性能和准确率不能提高的问题,深度残差网络与传统卷积神经网络相比,在网络中引入残差模块,该模块的引入有效地缓解了网络模型训练时反向传播的梯度消失问题,进而解决了深层网络难以训练和性能退化的问题。

三、人脸面部表情识别项目设计 3.1 项目简介

本项目是基于卷积神经网络模型开展表情识别的研究,为了尽可能的提高最终表情识别的准确性,需要大量的样本图片训练,优化,所以采用了 FER2013 数据集用来训练、测试,此数据集由 35886 张人脸表情图片组成,其中,测试图 28708 张,公共验证图和私有验证图各 3589 张,所有图片中共有7种表情。在预处理时把图像归一化为 48×48 像素,训练的网络结构是基于 CNN 网络结构的优化改进后的一个开源的网络结构,下文中会具体介绍到,通过不断地改进优化,缩小损失率,最终能达到较准确的识别出人的面部表情的结果。

3.2 数据集准备

本项目采用了FER2013数据库,其数据集的下载地址如下:

https://·blogs.com/HL-space/p/10888556.html

2、Fer2013 表情识别 pytorch (CNN、VGG、Resnet):https://·blogs.com/weiba180/p/12613764.html


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #基于卷积神经网络的面部表情识别 #一绪论11 #研究背景面部表情识别 #Facial #Expression #recognition