孙 晓,丁小龙
1.合肥工业大学 情感计算与系统结构研究所,合肥230601
2.合肥工业大学 计算机与信息学院,合肥230601
人脸表情是人们日常生活中最有效的交流方式之一,通常将它定义为面部肌肉对内在情绪状态所产生的一个或多个运动和变化。自20世纪90年代以来,许多人员致力于该领域的研究[1]。
人脸表情识别包含三部分:图像预处理、特征提取和表情分类。根据特征提取的方法,可以分为基于纹理特征的方法[2]、基于几何特征的方法[3]和基于深度神经网络的方法[4-5]。近几年,飞速发展的深度学习技术和规模越来越大的数据集使得基于深度神经网络的方法在图像识别领域更加重要。
深度神经网络离不开大规模数据,然而对于人脸表情数据集来说,标准人脸表情数据库CK+仅有327个标注的视频序列[6],更早的数据库JAFFE仅有213张面部表情图片[7]。人脸表情数据库还有一个普遍的问题:数据量不平衡。RAF数据库中快乐标签下的数据量是恐惧的17倍;CK+数据库仅有18个蔑视的序列。因此,需要一种图像生成技术,在扩充数据集的同时解决数据量不平衡的问题。为了解决这一问题,研究人员提出了一系列图像处理操作来增加数据库样本的数量,这个过程被称作数据增强。
数据越多,机器学习算法就越有效,在数据量不足的情况下,需要通过一些数据增强方案来扩充训练集,解决过拟合的问题。
最常见的做法是对原始图像进行一些几何变换来模拟真实场景下不同的拍摄角度和拍摄距离,例如旋转、缩放、平移、镜像等。Simard等人[8]提出使用旋转、平移和倾斜原始图像的方法来增加样本的数量。通过组合这三种空间变换,他们获取了大量的样本。Lopes等人[9]使用二维高斯分布在原始图像的眼睛附近加入随机噪声,形成新的两眼位置,通过旋转操作使新的两眼位置处于水平,从而生成新的样本。Krizhevsky等人[10]在原始图像上随机裁剪固定大小的子样本,然后将每个子样本进行水平翻转,将训练集扩充了2 048倍。
针对图像颜色空间的数据增强也是一种常见方法,包括亮度、对比度调节等。Wang等人[11]通过改变原始图像的亮度值来扩大样本数量,在一定程度上减弱了光照对表情识别产生的影响。
还有一些针对图像局部区域的方法,例如通过局部遮盖来模拟真实场景下图像磨损或有遮盖物的场景。Sun等人[12]提出了一种基于兴趣区域的人工脸数据增强策略。人脸中眼睛、嘴巴、鼻子和下巴在表情识别中占较大比重,研究人员将这些区域划分为兴趣区域。他们通过将某张脸的兴趣区域替换为另一张脸的对应部分来生成新的人脸图像。
此外,在图像上添加噪声也是一种常见的方法。这些方法通过对原始图像的空间变换、像素值变换,在保持语义不变的前提下生成多种环境下的样本,从而扩充数据集的数量。然而这些工作往往将所有类别同比例扩大,并不能很好地处理数据量不平衡的问题。针对这一问题,通常会对数据量多的样本集进行欠采样,对数据量小的样本集进行样本扩充。Joe等人从目标函数的角度来缓解数据量不平衡,他们在计算分类误差时对不同类别赋予不同的权值,样本少的权值大,使得网络更关注样本少的类别。
生成对抗网络(Generative Adversarial Network,GAN)是Goodfellow在2014年提出的一种深度生成模型[13],其结构如图1所示。模型分为两部分:生成器和判别器。判别器用以区分真实样本和假样本(生成样本),而生成器接收一个随机噪声作为输入,并生成与真实样本难以区分的假样本。
图1 GAN模型结构
在GAN中,定义值V来衡量真实样本和生成样本之间的差异[13],如式(1)所示。
当Pdata=PG时,取得最优解。
自GAN面世以来,很多研究人员在此基础上提出了改进。Arjovsky等提出了WGAN-GP,通过Earth-Moverh和梯度惩罚使得GAN网络的学习变得更加稳定[14]。CGAN在GAN模型中引入类别信息c,使其能够生成特定标签下的图像[15]。一些研究人员设想利用GAN实现图像风格迁移。Zhu等提出的CycleGAN能将一种风格下的图像转为另一种风格下的图像[16]。但要将输入图像转为多个风格下的图像,CycleGAN需要训练多个模型。Choi等结合CycleGAN和CGAN提出了StarGAN,实现了多风格图像之间的转换,仅由一个简单的生成器便可以生成多种风格的图像[17]。
人脸的不同表情便是不同的风格,本文将StarGAN用于增强数据集,在StarGAN的基础上,改进重构误差。生成器采用深度可分离卷积进行下采样,实现多风格人脸表情图像的转换。生成器接收人脸表情图像和指定类别,生成同一个人指定类别下的面部表情图像。
(1)人脸对齐。人脸对齐是人脸识别任务中一种非常有效的手段,它可以减少由于旋转、视觉角度等造成的一些干扰。人脸对齐之前要先进行人脸关键点检测,因为数据库中已经给出了人脸关键点信息,所以本文并不需要进行人脸关键点检测。为了不影响对齐之后图像的细节,本文使用了一个简单的策略:首先,分别计算两只眼睛的中心位置。在CK+的关键点标注信息中,点37~点42表示左眼,而点43~点48表示右眼。然后,计算穿过两个中心的直线与水平线之间的夹角θ。最后,围绕左眼顺时针旋转图像θ度。
(2)图像裁剪。将对齐之后的图像进行裁剪,用来去除对于表情识别不重要的背景信息。具体区域选取如下:将两眼之间的距离定义为a;竖直方向以眼睛为中心,上下各取长为2a的区域;水平方向由两眼各向外取长为1.5a的区域。这样便选取到一块4a×4a的矩形为裁剪区域。为了适应网络的输入,将裁剪之后的图像大小调整为256×256。图2描述了对CK+数据进行人脸对齐和图像裁剪的过程。
图2 图像预处理示例
3.2.1 目标函数
CGAN为了生成不同类别的图像,在GAN的目标函数中引入分类误差;CycelGAN为了保证生成图像和原图像在内容上的一致性,提出了重构误差;StarGAN将两者结合起来,提出了由对抗误差、分类误差和重构误差组成的新目标函数[17]。本文在StarGAN的基础上改进了重构误差,具体介绍如下:
(1)对抗误差,即原始GAN的误差函数:
其中,G为生成器,Dsrc(x)表示样本x被识别为真实样本的概率。
(2)分类误差。对于给定的输入图像x和目标类别标签c,本文的目标是将x转换为类别标签c下的输出图像G(x,c)。参照CGAN和StarGAN,在判别器D之上添加一个辅助分类器,分类器与判别器共用一个网络,但输出不同[15]。本文使用真实样本的分类误差优化判别器D,生成样本的分类误差优化生成器G。将判别器的分类误差定义为:
其中,c'表示真实样本x的类别标签,Dcls(c'|x)表示真实样本x属于类别c'的概率。通过最小化该目标,判别器D学习将真实样本x分类为其对应的标签c'。另一方面,生成样本的分类损失函数被定义为:
生成器G试图生成类别c下的样本,从而使得该值尽可能得小。
(3)将图像拆分为风格和内容两部分,重构误差用来描述生成图像与原图在内容上的差异。将一张笑脸转为哭脸时,需要保证它们是同一个人的不同表情,因此要求这个误差尽可能得小。将生成的目标图像G(x,c)再次转成原类别c'下的图像,即G(G(x,c),c'),重构误差为原始图像x与二次生成图像G(G(x,c),c')二者之间的差异。StarGAN中用两图像像素值之差的均值计算重构误差,公式为:
重构误差实质上是计算二次生成图像相较于原图像的保真度。式(6)的缺点在于,图像整体发生细微变化和局部发生巨大变化时计算出的值可能相差无几。这就导致有些生成的图像在重要的局部区域存在缺陷而实际的重构误差并不大,例如嘴巴、鼻子这些关键区域。图像处理中,常用均方根误差(Mean Squared Error,MSE)、峰值信噪比(Peak Signal to Noise Ratio,PSNR)、均方根信噪比(Signal to Noise Ratio,SNR)等来衡量两幅图像的相似度。原图像与二次生成图像的均方根误差、峰值信噪比和均方根信噪比公式分别为:
其中,n为图像像素值的个数,为一常数;MAX为图像像素的最大值与最小值之差,本文将图像像素值映射到[-1,1],MAX取值为2;||x||2指x的L2范数。当两幅图像的误差变大时,MSE变大,而PSNR和SNR均减小。但将PSNR和SNR对数内的值取倒数会导致误差值为负数,不符合本文对误差的要求;对整体取倒数会导致误差值很小,不方便计算。因此考虑PSNR和SNR的非对数形式,并取倒数:
由于MAX为一确定的常数,PSNR'与MSE本质上并没有区别,而SNR'需要计算||x||2,计算量较大。最终本文使用均方根误差来计算重构误差,公式为:
其优势如图3所示,用3×3的矩阵来模拟一张图像,每个数值表示该点的像素值。图3(b)中每个点的像素值相较于图3(a)均加1,而图3(c)仅有一点差距较大。当采用原来的计算方法时,图3(b)和图3(a)之间的误差与图3(c)和图3(a)之间的误差是一样的,但显然图3(b)更接近于图3(a)。当采用本文方法时,图3(c)与图3(a)的误差要远远大于图3(b)与图3(a)的误差。对于真实的生成图像,图3(b)可以看成与原图像有很多细微不同,但整体十分相像的生成图像,例如图像整体稍暗、皱纹丢失、毛孔丢失等;图3(c)可以理解为生成图像绝大多数细节都非常接近原图像但在关键位置上差距较大,例如嘴巴、眼睛等区域发生崩坏。在人脸表情识别任务中,嘴巴、眼睛这些关键区域对于识别的影响非常大,如果这些位置出现差错,会对表情识别造成干扰,因此更青睐于类似图3(b)的生成图像。
图3 原图像与生成图像的抽象
最终的优化目标为三个误差的综合,判别器的损失函数为:
当判别器非常容易区分真假样本并将真实样本正确分类时,-Ladv和Lrcls都会减小,该误差会越来越小直至取最小值。生成器的损失函数为:
当生成器生成的样本能够以假乱真,被正确分类,且与原样本是同一个人时,Ladv和Lrec都会减小,该误差会越来越小直至取最小值。其中λcls和λrec为正数,分别是分类误差和重构误差的系数,取值为10时,生成图像的效果较好。
3.2.2 训练过程
本文的训练过程如图4所示。
图4 模型的训练过程
对于获取的每个batch的真实图像x和对应的标签c',具体的训练过程如下:
(1)随机生成标签c;
(2)由真实图像x和标签c得到生成图像x';
(3)将真实图像x输入判别网络得到真实图像的对抗误差xadv和分类误差,将生成图像x'输入判别网络得到生成数据的对抗误差x'adv和分类误差
(4)计算判别器对应的对抗误差Ladv=xadv+x'adv;
(5)固定生成器参数,依据式(13),更新判别器参数;
(6)判别器每更新k次,执行下述过程;
(7)执行(2)和(3);
(8)计算生成器对应的对抗误差Ladv=-x'adv;
(9)由生成图像x'和真实标签c'得到重构图像x'',并计算真实图像x和重构图像x''的重构误差Lrec;
(10)固定判别器参数,依据式(14)更新生成器参数。其中,k是可控变量,当使用WGAN-GP的对抗误差时,常取值为5。
生成器的输入包含两部分:图像和需要转换的类别。本文采用深度可分离卷积[18]对这两个信息进行下采样来将类别标签和图像信息融合,具体策略如下:设输入RGB图像x(h,w,3)和类别的one-hot标签d(1,c),通过填满d的值将d的维度扩充为(h,w,c),合并两者为(h,w,3+c),采用深度可分离卷积代替常用的卷积操作,对合并之后的数据进行下采样。深度可分离卷积先利用3+c个不同的卷积核分别计算3+c个特征图内部的信息,再通过n个1×1的卷积核将这3+c个信息融合到一起,得到n个特征图。这样做不仅减少了参数的数量,更符合人们对图像信息和类别信息融合的认知。
生成器的输入是待转换的图像和类别,输出是转换之后的图像。生成器由3个深度可分离卷积、6个残差块(Basic Residual Blocks)[19]和2个转置卷积组成,输出采用反曲函数Tanh。深度可分离卷积用于下采样,转置卷积用于上采样。判别器有7个卷积层,采用全局最大值池化代替全连接层,为全卷积神经网络。判别器与类别分类器共用一个网络,但包含两个输出:对抗标签和分类标签。
本文采用了一些训练GAN的常用技巧:使用WGANGP的对抗误差以稳定训练过程;生成器采用实例标准化(Instance Normalization),而判别器没有使用任何标准化操作;对于判别网络使用leakyReLU代替ReLU。
本文的实验是基于深度学习框架pytorch实现的,采用的编程语言是python,操作系统为ubuntu16.04,GPU为TITAN Xp。
本文采用了标准数据库The extended Cohn-Kanade Database(CK+)[6]:CK+数据库使用8种表情来构建表情库,包括自然(neutral)、愤怒(anger)、蔑视(contempt)、厌恶(disgust)、恐惧(fear)、快乐(happy)、悲伤(sadness)和惊讶(surprise),包含123个参与者的593个视频序列,其中标注了327个序列。每个序列有10~30帧来描述参与者从自然状态到最具表现力状态的变化过程。每一帧都有一个名为landmarks的描述文件,用于记录面部关键点信息。在本文的实验中,选择每个序列的第一帧表示自然样本,最后两帧表示对应情感样本。样本总量为981,按照3∶1∶1的比例分为3组(训练、验证和测试),相同人的不同表情图像在同一组中。
为了验证本文改进方法的有效性,对比了原Star-GAN和改进StarGAN在CK+上生成的数据,如图5所示。图5(a)是CK+中原有的图像,共5种表情;图5(b)是StarGAN由自然表情生成其他表情的一系列图像;图5(c)是改进之后的StarGAN由自然表情生成其他表情的一系列图像。可以看出,图5(b)相比于图5(c)在脸部的一些细节上更丰富,但在关键位置上显得有些突兀,例如快乐和惊讶图像的嘴巴区域,这与本文改进重构误差的目标一致。当将一张人脸图像从一种表情转为另一种表情的时候,真正变化较大的其实就是嘴巴、鼻子、眼睛等关键区域,对于图像的大多数内容并没有发生太多改变。本文的方法适用于局部区域变化较大的图像生成任务,而CycleGAN和StarGAN中使用的方法更适合于整体变化较大的风格迁移任务,例如将一幅画由写实画风变为抽象画风。
图5 StarGAN与改进StarGAN生成的图像
在图像数据增强方面,有一些常用的简单方法,例如遮盖、裁剪、旋转、水平翻转、高斯滤波等,这些方法被称为传统方法。图6展示了一些常用方法的处理结果,包括中心截取、左遮盖1/3、逆时针旋转5°、引入高斯噪声、引入运动模糊。
图6 传统图像增强方案
将上述5种变换用于扩充CK+的训练集,并与本文方法进行比较。基于改进StarGAN的数据增强方法具体操作是:由于在挑选CK+数据时,选取了每个人自然表情下的图像,因此以每个人自然状态为基准,分别生成其他类别下的图像。生成的图像如图7所示。
图7 改进StarGAN数据增强示例
与图6相比,本文的数据增强方法更具有多样性:本文方法不是在一个域内扩充图像,而是由一个域的图像生成其他域的配对图像,对处理数据量不平衡的数据库有很大的借鉴作用。由于卷积神经网络具有一定的平移不变性、旋转不变性和尺寸不变性,采用平移、截取和轻微旋转时,部分扩充图像与原图像得到的特征值可能相同,仅是对原图像的简单复制;过度遮盖会造成表情特征的大量缺失;大角度旋转已经被证明不适应于非对称图像增强;模糊、引入噪声都需要控制在一定的程度内,不能过度干扰表情特征。因此,传统方法需要针对训练数据进行调整,其对深度模型的提升在同等数据量下略为逊色。深度模型具有很强的学习能力,由于不同的表情来源于不同的人,模型可能会学习到区分不同人的特征,导致同一个人的不同表情得到相同的结果。而本文方法产生的是配对型数据,使得模型更关注于不同表情之间的差异,而不是不同人之间的差异。同样是从语义上扩充数据,本文方法较Sun等[12]的方法实现更为容易。相较于基于采样和目标函数的数据量不平衡解决方法,本文方法能够从根本上扩充小类别的数据量。表1展示了CK+训练集应用两种数据增强方案之后的数据量。
表1 CK+训练集数据量
为了进一步验证本文数据增强方法的有效性,分别对表1的3份训练集进行训练,记录验证集识别率,并在测试集上计算识别率。由于CK+的样本数量较小,本文选择了参数较少的Xception和mobilenet_v2进行评估。为了加快训练速度,本文采用了微调技术,同时也可以在一定程度上缓解网络模型对大规模数据的依赖。
从表2可以看出,本文的数据增强方法能够有效地提高模型的识别精度,与未增强的相比约有4%左右的提升,与传统方法相比在mobilenet_v2上有更好的表现。然而,本文方法扩充之后的数据量比传统方法少很多,而Xception具有更多的参数,对数据量的要求更高,因此本文方法在Xception上的表现比传统方法略差一点。考虑到本文数据增强方法对比传统方法在CK+上扩充的数据不多,实际操作中可将本文方法与传统方法相结合来获取更多的生成样本。从实现成本来看,本文方法需要事先训练一个GAN模型,在本文的硬件环境下大约需要训练26 h才能达到预期效果,调整输入图像大小和采用迁移学习进行参数初始化,可以将训练时间控制在2 h以内。与传统方法相比,这无疑增加了很多工作量,然而配对型数据采集困难,与人工采集相比,本文方法极大地节约了人力成本。
表2 数据增强实验结果对比(识别率)%
表3详细记录了本文方法和传统方法在mobilenet_v2模型上的表现。可以看出,本文方法在原始数据量较小的蔑视和悲伤类别上比传统方法有较好的表现。由此可知,本文的数据增强方法可以适用于一些数据量不平衡的数据库。
表3 mobilenet_v2上各类别识别率 %
尽管从表2中可以看出,由于采用了一些防止过拟合的手段,本文训练的模型并没有对训练集过拟合。但测试集的样本与训练集的样本实际来自于同一分布(数据库),这就导致模型可能已经对这一分布(数据库)过拟合。实际应用中,往往会进行跨数据库训练:训练集来自于样本多的数据库,而验证集和测试集来自于同一分布(样本少的数据库或两个数据库的混合)。
本文使用CK+和JAFFE数据库进行跨数据库实验。JAFFE数据库包含了10位日本女性7种表情(自然、愤怒、厌恶、恐惧、快乐、悲伤和惊讶)下的图像,每个人每种表情大约3张,共213张图像。与CK+相比,JAFFE缺少蔑视标签[7]。由于JAFFE数据量较小,本文简化了跨数据库实验,将JAFFE数据库作为测试集,使用训练好的mobilenet_v2进行测试。
从表4中可以看出,由于CK+的数据多为欧美人而JAFFE的数据为亚洲人,CK+上训练好的模型在JAFFE上的表现并不理想,但基于改进StarGAN的数据增强方法比传统方法的跨数据库识别率更高,这说明了本文方法能在一定程度上提高模型的泛化能力。传统方法更多的是通过模拟多种场景来提高模型的泛化能力。而本文方法是从语义层次上扩大数据量,从而使得模型更关注语义特征。
表4 跨数据库实验对比(识别率) %
上述实验已经验证了本文数据增强方法的有效性,本文最后对比了近期其他方法在CK+数据集以及跨数据集实验的结果,如表5所示。
表5 与其他方法实验结果对比(识别率)%
目前针对CK+数据集,研究重点多为网络模型结构,采用的数据增强方案多为传统方案。本文利用改进后的StarGAN进行数据增强,将mobilenet_v2作为识别模型,与近期方法进行比较。CK+/JAFFE表示在CK+上进行训练,在JAFFE上进行测试。Lopes等设计一套完整的人脸表情识别系统,除了数据增强外还对面部区域进行调整,并尝试多种归一化处理。第2种方法和第3种方法都是采用人工脸进行数据增强,但第3种方法将兴趣区域作为额外输入,辅助判断识别结果,识别率有很大的提高。文献[20]同样采用传统方法,包括平移、水平翻转、旋转、缩放和亮度调节。从表中可以看出,尽管本文并没有对网络结构进行优化,但仍具有较高的识别率和泛化能力。人脸表情识别的精度不仅与数据增强的方法有关,还受模型结构、参数初始化方法、图像预处理、训练方法、是否引入先验知识等因素的影响,这也是今后的研究重点。
本文利用改进的StarGAN,由某一表情下人脸图像生成其他表情下的配对图像,从语义层次上扩大数据集。在CK+和JAFFE数据库上的实验表明,本文方法能够有效解决小样本数据库的过拟合问题,提高模型的识别率;与传统方法相比,本文方法使得模型更关注语义特征,能在一定程度上提高模型的泛化能力。同时,本文方法对解决数据量不平衡问题也有一定的借鉴作用。