郭克友,马丽萍,胡 巍
北京工商大学 材料与机械工程学院,北京100048
据统计,在交通事故中,由于驾驶员失误导致的交通事故占据92%~95%[1]。而其中疲劳驾驶和注意力分散是驾驶员在驾驶过程中面临的最危险的驾驶状态。因此对驾驶员驾驶状态进行有效检测,对于防范交通事故的发生有着重要的作用。面部朝向特征作为驾驶员特征检测中的重要组成部分,在驾驶员精神状态判断中占有重要地位。面部特征点定位是计算机视觉中的重要问题,因为许多视觉任务依赖于准确的面部特征点定位结果,如面部识别、面部表情分析、面部动画等。虽然近几年面部特征点定位被广泛研究,并且得到了巨大的成功,但是由于部分遮挡、光照、较大的头部旋转和夸张的表情变化等因素,导致人脸图像具有复杂多样性,因此驾驶员面部特征点定位仍然面临着巨大的挑战。
在人脸特征点定位的研究领域,目前主流的方法大致可以分为基于深度学习的人脸特征点定位方法和基于回归的人脸特征点定位方法[2]。基于回归的人脸特征点定位方法是近几年的一个研究方向,可以看作是主动形状模型(Active Shape Model,ASM)[3]算法相关改进的另外一个方向,就是对形状模型本身的改进。基于深度学习的人脸特征点定位方法是近两三年以来的一个研宄方向。深度学习在语音识别、图像识别和自然语言处理方面取得了重大进展,特别是卷积神经网络(Convolutional Neural Network,CNN)在特征提取方面有着卓越的性能。香港中文大学的汤晓鸥教授团队2013年提出深度卷积神经网络(Deep Convolutional Neural Network,DCNN)方法[4],利用卷积神经网络将5个关键点的定位精度提升到很高的水平。之后基于深度学习的方法逐渐取代了基于形状索引特征和决策树的传统回归方法。当前有许多其他高效的人脸检测和特征提取算法,文献[5]进行了详细的分类与比较,主要有主动形状模型(ASM)和主动外观模型(Active Appearance Model,AAM)类方法、统计能量函数类方法、回归分析方法、深度学习方法、分类器方法、批量提取方法。其中,深度学习在物体检测领域取得了优异成果。多任务级联卷积神经网络(Multi-Task Cascaded Convolutional Neural Network,MTCNN)算法[6]是当前使用较为广泛的人脸检测算法,该算法采用多任务级联网络,同时进行人脸检测和人脸特征点检测,获得了较高的精度及较快的检测速度。Face Net[7]提出基于度量学习的损失函数Trilet Loss,将人脸映射到欧式特征空间的特征向量上,对相同类别和不同类别样本间的距离进行了约束,其人脸识别在LFW上达到很高精度。国内大连理工大学的张明恒等[8]基于支持向量机(Support Vector Machine,SVM)对驾驶员的面部朝向进行检测,利用图像分割算法提取驾驶员面部特征,由眼睛、嘴部形成的特征三角形与人脸模板间的相互位置关系构成反映驾驶员面部朝向的特征向量,并利用此特征向量训练SVM分类器,对驾驶员的面部朝向进行分类。但该算法仅能得到驾驶员面部是否发生了左右和上下偏转,精度较低,且分割算法易受光照等影响,鲁棒性较差。卷积神经网络已经被证明在提取特征和分类方面具有有效性[9],同时它也被证明针对遮挡具有鲁棒性。因此,本文提出了一种基于深度卷积神经网络解决人脸5点特征点(眼角、鼻子、嘴角)预测问题的方法。通过添加更多的卷积层稳定地增加网络的深度,并且在所有层中使用非常小的3×3卷积滤波器,有效减小了参数,避免了过拟合问题,更好地解决了人脸特征点检测问题,其在精度和速度上都取得了良好的效果。
人脸特征点检测的方法有很多[10],本文主要从增加姿态的鲁棒性的角度出发,分别对现有深度学习在人脸特征点定位、人脸识别上的算法进行分析与总结,并提出基于DCNN模型的人脸特征点检测,用多个深度卷积网络分别提取全局、局部以及姿态恢复后的人脸图像特征,能够得到对姿态、部分遮挡等具有不变性的特征。对微调卷积神经网络(Tweaked Convolutional Neural Networks,TCNN)、级联卷积神经网络(Cascaded Convolutional Neural Networks,Cascaded CNN)、DCNN这3种算法的相对精度进行了实验比较。比较结果表明,文献[11]提出的检测算法在精度上具有很大优势。通过对卷积神经网络的训练,得出能够对人脸特征点进行快速有效检测的分类器。本文参考文献[12]的训练算法进行了改进,并进行CNN网络训练,训练的面部特征点有5个,包括2个眼角、1个鼻子、2个嘴角。选择检测特征点为眼角而非眼珠,是因为眼角偏转的角度与头部转向角度保持一致,减小了面部朝向计算的误差。该算法总共包含三层CNN网络,第一层包含3个CNN网络,第二层和第三层都拥有10个CNN网络,利用三层结构,实现了人脸特征点由粗到精定位的过程。第一层的3个CNN网络结构对应3个不同的输入,第一个CNN网络的输入为一整张人脸图片,第二个CNN网络结构的输入图片仅包含了眼睛和鼻子部分,第三个CNN网络结构的输入只包含了鼻子和嘴巴区域。然后训练完成后将分类结果取平均得到特征点粗定位。得到粗定位后,将包含5个特征的更小的范围输入到第二层10个CNN中,每个特征的两次训练结果取平均。第三层利用第二层的输出结果进一步训练,用以提高精度。算法网络结构如图1所示。
在图1第一层DCNN F1结构设计过程中,原文网络结构如图2所示,该网络结构将最后一层卷积展开以后,直接进行全连接操作。由于最后一个卷积层的特征是高度融合图像后的特征,包含信息很多,多次激活函数的作用使得细节特征丢失严重。因此参考文献[12]提到的方法对最后一层网络进行改进,即将最后两层网络进行特征融合,得到一个新的特征层,以这层为基础再进行全连接操作(线性变换)。进行这样的融合以后,全链接层的参数增长很多,在这个既包含细节又包含全局特征的基础上进行回归操作,效果有一定提升,第一层的训练精度更加准确。改进的网络结构如图3所示。原网络的激活函数为双曲正切函数,改进网络的采用ReLU激活函数,很好地解决了饱和问题,并且ReLU函数计算效率高且误差收敛速度快。
本文使用的DCNN总共包含10个网络结构,即1个输入层、4个卷积层、3个池化层、2个全连接层。网络中所有卷积层的大小都为3×3,采用3×3大小的卷积[13]是能够捕获上下左右和中心概念的最小尺寸。此外两个卷积层n×n的堆叠具有(2n-1)×(2n-1)的有效接收域[14],即两个3×3卷积层串联能够拥有5×5大小的感受野,可以替代更大的卷积尺寸并保持较小卷积的优点,
图1 CNN结构
图2 第一层CNN网络结构
图3 改进的第一层CNN网络结构
从而能够有效减少参数个数且拥有更多的非线性变换,使得提取的特征比单个更具区分性。由于卷积操作会损失图像边缘,为了保证卷积后的图像大小与原图一致,设置相应的步长为1,使得像素逐个滑动,并将边缘扩充设置为1,即宽度和高度都扩充了两个像素。卷积运算表示为:
其中,xi和yj分别是第i个输入图和第j个输出图,kij表示第i个输入图和第j个输出图之间的卷积核,bj是第j个输出图的偏差,*表示卷积。在池化层中,采用最大池化的方式,即使邻域内特征点取最大,因为该方式能更好地提取纹理。DCNN在全局神经网络中使用两个全连接层,虽然这样增加了模型的参数,但是使得模型表达能力和非线性表达能力更强,卷积神经网络更加有效与鲁棒。
其中卷积层和池化层都可视化[15],图像经过卷积以后,图片很好地去除了无用信息,留下了回归所需要的人脸边缘信息。如图4显示的是一张被头发遮挡的图像经过第一层卷积的结果。图5显示了第一个网络前三层特征图经过卷积以后出现的变化。可以看出,经过多层卷积以后,特征图变多,特征变复杂,但是已经脱离了人脸原来的基本轮廓,人眼已经无法理解其特征的具体含义。图像经过卷积处理,得到特征图进行池化处理,如图6所示,特征图经过池化操作以后,尽管特征图的多样性使大致轮廓得到保留,但是细节信息丢失严重。正是这个原因,在实现代码的时候,使用了融合前几层特征与最后一层特征的方法,以提高回归出的特征点的精度。
图4 图像经过第一层卷积的结果
图5 网络1前三层卷积特征图
图6 特征图经过Pooling后的结果
2.2.1 训练方法
本文总共需要训练3个网络,第一级的网络输入进行了数据增强(data argument)[16],输入的图片进行了对称(reflect)和旋转(rotation)变换,旋转方向为±5°。第一层的3个网络分开训练,每个迭代1 000 000次,权重W的学习率为0.01,常数向量b的学习率为0.02,学习率的更新策略为Inverse Decay,即每次反向传播以后使用式(2)更新每次的学习率:
这里,learning是学习率,base lr=0.01,γ=0.000 1,power=0.75,iter指迭代次数。学习率每次反向传播以后都在递减,如图7所示。W权重和常数b更新的方法使用Momentum Stochastic Gradient Descent[17]。这个方法收敛波动小,速度快。其中前一次的Momentum衰减率为0.9。
图7 训练中的学习率反向传播
第二级和第三级网络中的每个网络单独训练,迭代次数为100 000次,二、三层网络的迭代次数不宜过大,因为只是微调网络,并且网络较浅。二、三级的网络输入进行了数据增强,输入的图片进行了对称变换,不进行旋转变换。将ground truth的patch图像中的人脸特征点所在位置的label进行均值为0的高斯扰动,使其偏离原来位置,将扰动过的label和patch一起作为第二、三层的训练数据进行训练。其中权重W的学习率为0.01,常数向量b的学习率为0.02,学习率的更新策略为Inverse Decay,对应的base lr=0.01,γ=0.0001,power=0.75。权重W和常数b更新的方法仍然使用Momentum Stochastic Gradient Descent。
2.2.2 训练模型
选择标准人脸库进行实验,得到人脸图像之后,根据输入的坐标数据和人脸检测得出的数据,分析出人脸的具体位置,并定位出特征点的具体位置,输入特征点像素数据进行训练。为了得到最优的训练模型,本文对人脸库中的人脸图像进行了自动分析,分析结果主要包括四类图像:第一类是在无约束条件下捕获的面部经常被遮挡、找不到特征点的图像,例如眼睛可能被头发、太阳镜或带有黑色框架的近视眼镜遮挡。第二类是局部面部特征的外观在不同的拍照姿势(例如正面、正面、上下)之间差别很大,并且一些五官(例如面部轮廓的一侧)甚至可以完全被侧脸的另一边挡住,人脸大幅度旋转(大于45°)造成特征点丢失的图像。第三类是由于光照(光谱、光源分布和强度不同)的多样性可能会明显改变整个脸部的外观,并使某些五官的详细纹理丢失,使人脸呈现阴影部分,导致特征点无法准确判别的图像。图8显示的是前三类图像。第四类是特征点相对清晰可判别的图像。本文对第四类图像进行训练。
图8 人脸图像初步分类
为了使训练网络结构模型达到最优,本文分别选取了不同数量的样本进行训练,接着对训练好的模型进行检测,并且对检测结果进行了平均误差分析,对不同的样本数量检测的平均误差结果进行了对比,其中第二级训练对比结果如图9所示。根据对比结果,样本数量为8 000的模型检测效果最佳,平均误差最小。因此本文选取的训练样本数目是8 000,检测样本数目是2 500。
图9 不同训练样本的平均误差检测结果
2.2.3 分析检测结果
训练完成后,为了检测模型的训练精度,求出了训练完成后各个层的模型在test数据集上精度的直方图。如图10所示的第三层的误差分布,其中横坐标是预测值(prediction)里距离真实值(ground-truth)归一化之后的值。纵坐标为图片数量,即误差在某个范围内图片的数量。横坐标取值范围应该在0~0.05之间,预测值大于0.05,表明预测的特征点在图像之外,为无效预测。图片以0.05为界限(红线),误差大于0.05为无效预测。
图10 Level3的误差分布
从图10可以看出,随着神经网络平均去方差和微调(Finetune)的操作,精度明显提高,误差分布也越来越向0集中。图11则显示了三层网络预测同一个人脸特征点的结果,基本可以准确预测人脸的5个特征点。并且训练的CNN模型已经学出了人脸的五官结构。图12显示的是人脸五点密度分布,训练的CNN不但在无几何约束的情况下学习出了人脸的五点结构,而且这五点的密度分布也比较集中在一个相对小的区域,这个高度集中区域就是误差比较小的区域。因此尽管图片的某些特征点可能被遮挡,但是该网络结构在缺失局部图像数据的情况下,仍然能给出遮挡特征点的正确位置,如图13所示。当图像角度发生不同方向变化时仍然能准确地检测出图像的特征点,如图14所示。从预测结果来看,本文对于各种不同情景,如不同肤色、有无眼镜、不同光照等均适用。
图11 三层网络预测同一个人特征点的结果
图12 test结果密度图
图13 遮挡点预测
图14 不同角度预测
检测结果如表1所示,可以看出本文算法具有更高的准确率,用第三层网络训练的模型检测特征点误差率最低,鼻子的检测准确率最高是98.07%,5个特征点的平均检测率是97.96%。将同一数据用TCNN[18]和Cascaded CNN[19]算法分别做了检测,并且将实验结果与本文的DCNN算法检测结果进行比较。特征点平均检测率对比结果如表2所示。由表2可以看出,本文算法的识别率均优于其他两种方法。
表1 人脸特征点检测准确率
表2 不同方法实验结果对比
首先验证算法可行性。测试图片为笔记本拍摄,距离面部1 m,利用棋盘格标定法获取内参矩阵,同时在被拍摄位置利用激光笔将头部绕y左右方向转动0°~30°,以每5°为转动刻度的视线方向做出标记,并拍摄记录照片。然后利用之前训练好的模型进行脸部特征点检测。再根据检测之后输出的特征点坐标,计算双眼角与嘴角所成平面与正视时此平面的单应性矩阵[20]。最后利用等效算法结合特征点约束求解驾驶员面部转角。具体的算法流程如图15所示。计算过程是根据两个相机对同一场景拍摄的图片,可由单应性关系确定相机间的相对位置关系,可以标定摄像机得到内参矩阵K[21]:
图15 算法流程图
相机从两个不同视角拍摄该平面得到的图像分别为I1和I2,X在图像上对应的投影点分别为U1=[u1v11]T和U2=[u2v21]T,则图像对(I1,I2)单应性矩阵[22]A可以表示为:
设
因采用齐次坐标的表示形式,故可令a33=1,待求矩阵有8个未知量,则可由眼角和嘴角4个点得出以下关系式:
由式(5)求解该线性方程组即可得到单应性矩阵A,且令A=[h1h2h3]。再对单应性矩阵进行分解,利用之前求出的内参矩阵的逆矩阵K-1得到3×3的旋转矩阵R[23]:
确定分解结果后,设用欧拉角[24]表示的旋转矩阵Q=RzRyRx,则Q=R,并利用欧拉角公式可解得相机旋转角度,见式(8)。头部转动角度与相机旋转角度相反。
式中,θx表示绕x轴旋转的角度,Rnm表示R矩阵中第n行第m列的数。
利用式(8)进行实验。其中绕y轴旋转的部分角度计算误差结果如表3所示。误差曲线如图16所示,真值与计算值几乎平行,而计算值基本趋向误差值,是一个小范围值,说明计算误差很小。
表3 测试图片计算结果
图16 真值、计算值与误差对比曲线
通过测试数据可以得到,实验以y轴为转向进行旋转,误差最低是0.11°,误差最大是4.9°,误差控制在1°~5°之间,证明本文算法可以有效判别面部转向。下一步打算采用实车实验来验证算法精度。
本文利用深度卷积神经网络对驾驶员面部特征点进行检测,精确地提取了全局高级特征,直接预测面部5个特征点的坐标。实验结果表明,所提方法实现了非常高的精度,并且具有比其他方法更好的性能。此外,本文方法对姿态、光照、表情和严重遮挡(这在非受控场景中是常见的)具有鲁棒性。并且计算双眼角与嘴角所成平面的单应性矩阵,结合单应性矩阵分解提出了一种计算驾驶员面部转向的算法,角度判断的误差在1°~5°,实验结果表明算法具有可靠的精度。后续工作计划将算法应用到驾驶员注意力实时检测[25]中,以验证算法在车辆行驶过程中的稳定性。