周 婕,马明栋
(1.南京邮电大学 通信与信息工程学院,江苏 南京 210003;2.南京邮电大学 地理与生物信息学院,江苏 南京 210003)
众所周知,人脸表情作为非语言交际的一种形式,包含着丰富的情感信息,同时传达出一些有关人的认知行为、性格和心理情绪,虽然显示出的信息是比较隐晦的,但更能实时地、真实地反映出人的内心活动,真实性更高,且这种信息表达方式不能被其他方式所替代,因此人脸表情在人们的日常交流中占据着重要地位。随着计算机技术的快速发展,人们对人工智能的研究更加深入,希望通过计算机能模拟人类行为,提高人类的生活质量,造福人类。因此人脸表情识别技术作为通过计算机来预测人类心理状态的一种方式具有广阔的应用前景,比如在教育、医学、心理学、商业、安全驾驶等各大领域都有对此技术的研究。
人脸表情识别的关键就在于人脸不同表情特征点的提取,然而传统的特征提取算法,如尺度不变特征变换(SIFT)、局部二值模式(LBP)等,不仅设计方法比较困难,而且特征点提取不完全,从而导致效率低下。因此,研究人员将卷积神经网络如AlexNet、VGGNet、GoogleNet等用于人脸表情识别。卷积神经网络以其能够共享卷积核,对高维数据处理无压力且特征分类效果好的独特优势,在图像、语音处理方面得到广泛的应用。但随着网络深度的加深,学习能力的加强,反而造成了梯度爆炸和梯度消失,从而出现了所谓的“退化”问题,即优化效果越来越差,测试数据和训练数据的准确率也越来越低。基于这样的背景,He Kaiming等人提出了ResNet网络模型,与其他网络最主要的区别就是在卷积神经网络中引入了残差的思想,主要是通过添加shortcut连接,把通过跳层连接的梯度更新成一样,解决了网络变深之后,前面层次的网络权值得不到更新,从而导致梯度消失的问题。
为了更加高效且准确地识别出人脸表情,该文提出了基于改进的ResNet卷积神经网络,该网络的参数量和运算量更少,能够更快更好地提取人脸表情特征,且保存了“最有辨识力”的信息。同时为了能够实时识别人脸表情,直接利用OpenCV中的基于Haar特征的人脸检测分类器,实现了从视频中抓取人脸,并加载训练好的模型,最终实现对视频人脸表情的实时识别系统。
OpenCV是开源的计算机视觉和机器学习软件库,可以运行在不同的操作系统上。它主要由C函数和C++类组成,但也提供了其他语言接口。OpenCV在图像处理方面提供了很多通用算法,因此大大提高了图像处理的效率。该文主要使用到它的视频处理模块和人脸检测分类器。
视频处理模块主要是从视频序列读取帧,因此只需创建一个cv::VideoCapture类的实例,然后在一个循环中提取并显示视频的每帧就可以读取数据进行处理了。
人脸检测分类器主要是检测并分割出人脸,本系统选用的是Haar特征加上Adaboost级联分类器的组合。Haar特征是一种反映图像灰度变化,像素分模块求差值的特征,主要利用黑色和白色这两种矩形组成特征模板,再用两种矩形像素和的差值作为该特征模板的特征值。通常,人脸的眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等,因此,人脸的一些特征就可以由Haar特征来简单描述。然而如果对一幅图像采用全部的特征去检测,效率必定非常低,因此Haar特征一般结合Adaboost级联分类器,将全部特征分为各个阶段,并且每个阶段的特征是逐渐增加的,使得人脸检测效率大大地提高了。
1.2.1 ResNet网络的提出
深度卷积神经网络起源于AlexNet网络,后来针对此网络的不足,研究人员又提出了VGGNet、GoogleNet等网络,不难看出随着网络深度的增加,网络的表达能力越来越强大,识别的速度和准确率也不断上升,这是因为网络越深,所能获取的信息越多,提取的特征也越丰富。然而实验表明不断加深的网络深度并没有得到人们预期的识别结果,反而出现了“退化”现象,优化效果变差,测试数据和训练数据的准确率也降低了,这是因为网络的加深会造成梯度爆炸和梯度消失的问题。针对这个现象,对输入数据和中间层的数据进行归一化操作,这种方法可以保证网络在反向传播中采用随机梯度下降(SGD),从而让网络达到收敛。但是归一化操作只能解决深度为几十层的网络的梯度消失问题,如果网络深度再加深的话,这种方法就无效了。
为了让更深的网络也能训练出好的效果,He Kaiming等人提出了新的网络结构—ResNet,通过使用Residual Unit成功训练了深度为152层的卷积神经网络,并在ILSVRC 2015比赛中获得了冠军。ResNet网络在获得低误差率,需要较小的参数量和计算量的同时,也加快了模型训练的速度,使得训练模型的效果非常突出。
ResNet较之于其他网络,最主要的区别就是在卷积神经网络中引入了残差函数。ResNet网络在内部的残差块使用了跳跃连接,这样做的好处是缓解了在卷积神经网络中增加深度带来的梯度消失的问题,使得ResNet网络容易优化,即能够通过增加网络的深度来提高准确率。
1.2.2 ResNet网络结构
ResNet网络见图1,主要由输入部分、卷积部分以及输出部分组成,其中卷积部分又分为四个阶段。
图1 ResNet网络结构
由图1可知,ResNet网络的输入部分主要由大卷积核和最大池化这两个部分组成,这一步的目的是为了将大像素的输入图像变成小像素的特征图像,在尽量保留含有信息的特征点的同时,也减少了存储所需的大小。
中间卷积部分是此网络结构的核心,引入的残差块将输入数据分成两条路,如图2,一条路经过2个卷积核为3*3的卷积层,另一条路则直接短接(shortcut),通过shortcut将输入和输出进行一个element-wise的加叠,这个简单的加法不仅不会为网络增加额外的参数和计算量,而且还可以加快模型的训练速度,提高模型的训练效果,这样做可以有效地解决梯度爆炸和梯度消失的问题。最终两条路相加并经过ReLU激活函数处理后输出。这一步的目的是为了实现特征信息的提取。
图2 ResNet残差块
最后的输出部分先是通过全局自适应平滑池化,然后接全连接层输出,这样做的好处是首先通过GAP减少了参数的数量,降低过拟合的发生几率,再连接FC就是高度提纯的特征,方便交给最后的分类器。
1.3.1 残差块的优化
Basicblock结构如图2,将输入数据分成两条路,一条路经过卷积层,另一条路则直接短接(shortcut),最终两条路相加并经过relu激活函数处理后输出。Bottleneck结构如图3,对残差块做了计算优化,即将两个3*3的卷积层替换为两个1*1的卷积层加上一个3*3的卷积层,虽然在原来的结构上增加了一个卷积层,但是通过第一个1*1卷积层的降维处理后又在最后一个1*1卷积层下进行了还原处理,这样做既保持了精度又减少了计算量。直接计算来计较一下两个结构的计算量,比如说,对于256维的输入特征,Bottleneck结构的参数数目为1×1×256×64+3×3×64×64+1×1×64×256=69 632,Basicblock结构的参数数目为(3×3×256×256)×2=1 179 648,计算量简化了约6%。
图3 ResNet残差块的优化
1.3.2 下采样部分的改进
原本的下采样是在每个阶段的第一个卷积下去做的,这样做的后果就是输入数据会通过一个stride=2的1*1卷积,直接使得特征图的尺寸缩小了一半,大量的特征信息丢失,使训练的模型不够精确,从而导致识别率降低。因此,该文将下采样这一步骤转移到3*3的卷积里面,这样做的好处就是避免大量的信息流失,使特征信息的提取更加完整。
1.3.3 激活函数的改进
ResNet网络是在每个卷积之后都加入了ReLU激活函数,主要目的是为了引入非线性因素,将神经网络可以应用到非线性模型中,提高神经网络对模型的表达能力。
ReLU的函数公式是f
(x
)=max(0,x
),函数图像如图4所示。图4 ReLU激活函数图像
ReLU函数能够加快计算与收敛速度,而且在一定程度上缓解梯度消失的问题,但是从ReLU的函数图像中可以看出如果输入小于0的话,经ReLU函数激活后输出为0,这相当于完全没有激活,这个函数也是“死掉的”,即产生所谓的“dying relu”问题,导致后面的权值不再更新,影响到网络的表达能力。因此尝试用PReLU激活函数替代ReLU函数。
PReLU的函数公式是f
(x
)=max(a
×x
,x
),函数图像如图5所示。图5 PReLU激活函数图像
从图中可以看出在负数区域内,PReLU有一个很小的斜率,这样既保留了ReLU函数的优点,同时又能避免“dying relu”问题。同时调整PReLU的位置,将相加后的激活函数移入残差块内部,加强模型的表达能力。
基于改进的ResNet网络的人脸表情识别系统的整体流程设计如图6所示。该系统主要由三个部分组成,分别是视频数据的读取、人脸检测与人脸图像提取、人脸表情的预测及结果输出。
图6 系统流程
视频数据的读取:由于视频或摄像头的实时画面是由一帧一帧的图像组成,因此动态的数据读取本质上是图像的读取。该文使用OpenCV的VideoCapture 函数读取摄像头数据也就是当前帧图像,将获取的实时画面数据存放在定义的Mat数据容器(frame)中,并判断frame是否为空,若不为空则使用窗口显示读取到的图像。
人脸检测与人脸图像提取:这步的作用主要是定位到人脸图像并截取出来,为之后的人脸表情识别做准备。本系统利用OpenCV自带的Haar特征人脸检测器。Haar特征主要是根据人脸的立体感造成的灰度变化而通过像素分模块求差值,这样,人脸的一些特征就可以由Haar特征来简单描述,再结合Adaboost级联分类器,将全部特征分为各个阶段,提高人脸检测效率。OpenCV已经包含许多用于脸部、眼睛、嘴巴等的预先分类器,这些XML文件存储在opencv/data/haarcascades/文件夹中。首先加载所需的XML分类器,XML中存放的是训练后的特征池,其中特征大小是根据训练时的参数而定,然后以灰度模式加载输入图像(或视频),最后就可以在图像中定位人脸位置,如果找到人脸的话,它会以坐标形式返回检测到的脸部的位置从而提取出人脸图像。整个人脸检测过程的原理是将存放在XML中的每个固定大小的特征与输入图像同样大小的区域进行对比,如果相符则记录此矩形区域的位置,然后滑动窗口,重复以上步骤检测图像的其他区域。
人脸表情预测及结果输出:以Tensorflow2.0深度学习框架为基础实现改进后的卷积神经网络来训练模型,再利用训练好的模型完成对人脸表情的预测,并判断抓取的人脸表情属于哪个标签,最后输出识别结果。
该文选取Fer2013数据集作为人脸表情识别研究的数据集,虽然该数据集的测试集存在许多标签的错误,导致测试精度不是很高,但本身已划分了训练集、验证集和测试集,因此选用该数据集,有利于在相同条件下将文中方法与其他相关方法进行比较。
Fer2013人脸表情数据集由35 886张人脸表情图片组成,其中,训练图(Training)28 708张,公共验证图(PublicTest)和私有验证图(PrivateTest)各3 589张,每张图片是由大小固定为48*48的灰度图像组成,共有7种表情,分别对应于数字标签0~6,具体表情对应的标签和中英文如下:0 anger 生气;1 disgust 厌恶;2 fear 恐惧;3 happy 开心;4 sad 伤心;5 surprised 惊讶;6 normal 中性。
数据集并没有直接给出图片,而是将表情、图片数据、用途的数据保存到csv文件中,第一列表示表情标签,第二列为原始图片数据,最后一列为用途。这样处理数据的目的是为了方便训练时读取数据。
一般来说,训练的数据量越大,系统的识别率也越精确,因此,为了得到一个比较成功的神经网络,就需要大量的参数。然而,实际情况中,并没有这么多的数据可以用于训练,因此,在将数据提供给模型之前进行扩充即增强数据。数据集增强主要是为了加大训练的数据量,提高模型的泛化能力及模型的鲁棒性,减少网络的过拟合现象。该文通过对训练图片进行如随机缩放、翻转、平移、旋转等变换操作来增强数据,使数据集的数据量增加了数十倍。
将增强后的Fer2013数据集分别放入ResNet和改进后的ResNet网络中进行训练和测试,可以得到如表1所示的准确率。ResNet在Fer2013数据集上的准确率为70.3%,改进后的ResNet在相同数据集上的准确率为73.2%,准确率提高了将近3%,说明改进后的ResNet网络确实能够提高人脸表情的识别率。
表1 不同模型在数据集上的准确率对比
得到训练模型后,加载OpenCV自带的Haar特征的人脸检测器和训练好的模型,先是通过摄像头按帧读取图像,然后从图像中检测出并截取出人脸,利用训练好的模型完成对人脸表情的预测,判断抓取的人脸表情属于哪个标签,最后输出识别结果。改进方法的效果如图7所示,结果可以接受。
图7 识别结果
本系统实现了结合深度学习来进行人脸表情识别的输出,主要是基于传统ResNet网络的基本结构,并对其进行了优化。输入和输出部分仍保持原来的结构,主要是对中间的卷积部分进行了改进:将中间卷积部分改为前后各一个卷积核为1*1的卷积层,中间是卷积核大小为3*3的卷积层,这样做既可以减少计算量又可以保持精确度不下降;将下采样移到后面的3*3卷积里面去做,目的是为了减少信息的流失,最大程度地保证有信息量的特征点保留下来;用PReLU替代ReLU函数,同时调整激活函数的位置,可以在提高神经网络对模型表达能力的同时避免出现“dying relu”的问题。最后的实验结果表明,与传统ResNet模型相比,改进的网络结构减少了计算量,提高了识别速度以及识别率。