薛继伟, 吕福娟, 刘显德
(东北石油大学计算机与信息技术学院,黑龙江大庆 163318)
一直以来,表情是人类引以为傲的东西,是我们与机器一种本质上的区别. 随着人工智能浪潮的推进,我们更期盼人机之间带有感情的沟通交流,希望机器可以读懂人类的语言、知悉人类的表情,更好地为人类服务. 因此,近年来表情识别成为人工智能领域的研究热点. 面部表情识别是一个集计算机视觉和模式识别[1]等技术为一体的范畴,同时涉及计算机科学、心理学、认知科学和行为科学等多个领域. 目前,情绪识别已经被广泛用于商业,它的研究对于人机交互[2]、汽车驾驶[3]、医疗监控[4]、远程教育[5]、刑侦安防[6]等领域都有着重要的作用和意义.
面部表情是人们用来表达自己内心情绪的方式之一,对比语言能更具形象直观地表达人类的心情. 随着人工智能技术和计算机技术的日益进步,人们日益向往智能化的人机交互方式. 如果计算机能认识和识别人类的情感,将能更好地为人类服务. 因此,人脸表情识别技术的研究便成为近几年计算机学者们的热点话题. 随之而来的是层出不穷的表情识别方法.
常见的传统表情识别方法有LBP[7]、Gabor[8]小波变换以及朴素贝叶斯算法[9]等. 近几年来,深度学习逐渐走进越来越多人的视线,成了人们研究的热点,神经网络也成为其中较为热门的方法,并取得了越来越好的成绩,比如VGGNet[10]、DBN[11](深信度神经网络)等.
近几年,表情识别技术的研究者提出了众多不同的表情识别方法,但结合实时摄像进行表情识别的系统并不是很多. 人脸表情是多个局部区域特征的集合,而卷积神经网络提取出的特征能更多地关注局部.因此,本文采取卷积神经网络,在模型训练之前对数据集进行人脸裁剪处理,使模型注意力更好地集中在人脸区域,从而提升人脸表情识别的置信度;使用何凯明等于2015年提出的ResNet[12]深度残差神经网络为模型框架,并结合前端uni-app框架,设计了一个可以进行静态图片表情识别,以及可以随时拍照进行人脸表情识别并且可以运行在手机端的表情识别系统.
基于神经网络的人脸表情识别[13]通常包括人脸检测与预处理、特征提取与识别分析、表情分类三个阶段. 人脸检测主要目的是在图像中准确定位人脸,为后续表情识别打下基础,如果没有好的人脸检测技术,后续的特征提取与表情分类则无从谈起. 特征提取是处理链中非常关键的一步,因为提取的人脸特征点需要足够准确,以便用于人脸表情识别. 本实验中,将数据处理和模型训练分为两个部分进行,实验流程如图1 所示,即先用人脸检测[14]技术将数据集的人脸区域裁剪切割得到新的数据集,在第二部分模型训练时将新的人脸数据集经过数据增强后输入网络进行训练. ResNet 网络包括18 层、34 层、50 层、101 层、150 层等不同模型,本文使用的模型是ResNet-50.
图1 表情识别流程图Fig.1 Flow chart of facial expression recognition
目前,常用的人脸表情数据集(CK+[15]、JAFFE、FER2013[16])中存在着样本不平衡问题. 样本不平衡问题容易导致模型的训练出现过拟合,同时也会导致模型在不同类别上分类性能出现较大的差异.
基于深度学习的方法需要大量样本来训练,本文使用的数据集是从科赛网下载的人脸数据集,本数据集为彩色图像集,且人脸图像具有丰富的表情数据信息,如:眼睛睁大、眉毛皱起、嘴巴张大、嘴角上扬或者平静思考等不同表情,数据集包含不同年龄段、不同种族以及不同场景下的人脸,如图2所示. 这样的多样性样本使得训练模型更具泛化性,准确率更高,并且数据集较大,避免了训练过程中过拟合的问题.
图2 表情数据集部分图片Fig.2 Some pictures of the emoticon dataset
因本数据集中除拍摄的大量图片外还包含一些模糊的人脸画像或影视剧中非正常人脸图片,所以需要将这些非正常人脸图片过滤,再将过滤后的数据集使用人脸检测技术将图片中人脸部分裁剪出来,得到224*224大小的人脸表情集,裁剪前后的图片如图3所示.
图3 人脸裁剪前后对比Fig.3 Comparison before and after face image cropping
将处理后的新数据集分为训练集和验证集,其中每张图片的表情由一个0~4 的数字代表,0=angry,1=happy,2=neutral,3=sad,4=surprise. 训练集一共37 069 张图片,验证集1928 张图片. 再经过图片翻转、旋转等数据增强[17]变换,模型训练时将裁剪、变换后的数据集输入设计好的网络开始训练. 对人脸表情数据进行一定的改进,在数据层面减少模型的运算资源消耗,同时提升了人脸表情的识别度和效率.
卷积神经网络的卷积层有两个核心思想:网络局部连接和卷积核参数共享,如图4所示,这种特殊结构降低了网络的复杂性,降低参数数量,防止参数过多而造成过拟合,并且使图像识别的精准程度得到提升.
图4 全连接和局部连接Fig.4 Full connection and partial connection
卷积池化交替出现的层组织结构方式能够减少网络参数并对输入进行降维,使提取出的特征具有高度不变性. 并且深度学习方法能够自动地提取更深层次的表情特征,解决了人工提取特征的麻烦,进而提高了识别率[18]. 因此本文将用深度残差网络进行人脸表情识别.
ResNet已经被广泛运用于各种特征提取应用中,它的出现解决了网络层数到一定的深度后分类性能和准确率不能提高的问题,深度残差网络与传统卷积神经网络相比,在网络中引入残差模块,该模块的引入有效地缓解了网络模型训练时反向传播的梯度消失问题,进而解决了深层网络难以训练和性能退化的问题. 本文采用的网络模型是ResNet-50.
ResNet-50经过了4个Block,每一个Block中分别有3,4,6,3个Bottleneck,输入图片经过第一个卷积层,进入Block结构. 每一个Block 包含两种不同的Bottleneck,一种是Conv Block(卷积块),一种是Identity Block(残差块).
最后通过平均池化和全连接,用softmax实现回归.
如图5展示了ResNet-50网络的第一个Block结构. 第一个Block 有3 个Bottleneck 结构,其中包含一个Identity Block和两个Conv Block.
图5 ResNet-50网络的第一个Block结构Fig.5 The first Block structure of the ResNet-50 network
表情识别的实验中,输入数据集的训练图片,输出包含5 个神经元,对应5 种表情,分别为angry,happy,neutral,sad,surprise.
2.3.1 损失函数 本实验是多分类问题,故使用Softmax损失函数对模型输出进行归一化处理,其函数形式如下:
其中:i表示输出节点的编号;zi就是第i个节点的输出值;c表示输出节点的标号,即从1到C,C为输出节点的个数,即分类的类别个数,通过Softmax函数就可以将多分类的输出值转换为范围在[0,1]和为1的概率分布[19].在表情识别任务中,交叉熵(Cross Entropy,CE)是常见的损失度量函数,其公式表达为:
实验中选取的优化器为随机梯度下降算法(Stochastic gradient descent,SGD). SGD计算梯度快,大量的理论和实践工作证明,SGD能很好地收敛. 并且应用像本实验中这种大型数据集时,训练速度会比较快. 相比于标准梯度下降法的遍历全部样本,SGD每输入一个样本更新一次参数的效率要高很多.
2.3.2 DYReLU激活函数 ResNet-50网络中使用线性修正单元(Rectified linear unit,ReLU)作为激活函数,如图6 a,ReLU函数简单且高效. 但是ReLU函数及其变体在推理阶段都是静态的. 静态激活函数在网络运行之前设定激活率,对所有的输入数据都执行相同的操作,缺乏灵活性,约束了网络的表征能力[20-21],所以将ReLU替换为Dynamic ReLU(动态线性修正单元,DYReLU).
图6 ReLU与DYReLUFig.6 ReLU and DYReLU
图7所示是DYReLU的网络结构以及ResNet网络被替换了激活函数之后的Bottleneck. DYReLU的网络结构包含一个池化层(avg pool)和两个全连接层(FC),并且在全连接层中间设置了一个ReLU 激活层,最后经过一个归一化层.
图7 DYReLU和激活函数替换前后对比Fig.7 Comparison of DYReLU and activation function before and after replacing
实验中初始学习率设置为LR=0.01,权重衰减率设置为5,最终在训练集和验证集上分别达到99.56%和93.25%的准确率,相比于使用ReLU激活函数,模型在验证集的准确率提升了2.07%,最终结果如图8 所示,虚线和实线分别是使用动态激活函数与激活函数的PR曲线(P为精准率,R为召回率).
图8 ResNet-50模型训练结果Fig.8 ResNet-50 model training results
服务端使用Django 框架,客户端使用uni-app 框架. uni-app是一个基于Vue.js 开发的、可以适用多端的开源框架,
图9为系统的主页面及表情识别结果,底部的导航栏显示的是系统的三个不同子功能.
图9 系统主页面Fig.9 System main page
点击选择照片时,下方会出现“拍摄”和“从相册选择”,使用者可以选择自己想识别的照片或者当下拍摄照片去识别. 不管是随时拍摄识别或者选取已有图片识别,识别过程都分为人脸检测和人脸表情识别两个部分,当检测到人脸时先在图片中画出人脸框,再进行人脸表情分析,若没有检测到人脸,则会提示“未检测到人脸”. 本系统训练的模型最多可以检测识别5张人脸,即当图片中有多张人脸时,系统会根据人脸面积按从大到小选取,只选择前5张人脸进行分析,如图10的识别结果.
图10 多人识别结果Fig.10 Multi-person recognition results
利用卷积神经网络训练模型,针对图片过大延长训练时间、训练过程中检测人脸消耗运算资源等问题,在模型训练之前采取人脸检测和人脸裁剪手段,得到只包含人脸且大小统一的数据集进行训练,并且将静态激活函数替换为动态激活函数. 最终在验证集上取得93.25%的准确率,相比于使用ReLU 激活函数,替换为DYReLU 之后,模型准确率提升了2.07%. 实验结果表明,在复杂场景下,本文方法具有较好的识别度和识别效率.
虽然人脸表情识别已经取得了较好的识别效果,并且在科研项目上应用广泛,但是遮挡以及侧脸等因素的影响依然较大. 为了克服这些外界因素,未来的表情识别研究可以侧重于侧脸或口罩遮挡的情况,以便于技术成果在更复杂的环境下应用.