冯文文, 曹银杰*, 李晓琳, 胡卫生
(1.聊城大学物理科学与信息工程学院,聊城 252059; 2.山东省光通信科学与技术重点实验室, 聊城 252059; 3.上海交通大学电子信息与电气工程学院,上海 200240)
随着交通、经贸的快速发展以及人们生活水平的不断提高,汽车、货车等车辆的不断普及增加,这给人们带来极大便利的同时,道路交通事故发生率也不断地提高。其中,疲劳驾驶是引起交通事故的一个重要原因。据不完全统计,20%~30%的交通事故是由疲劳驾驶引起的。根据美国国家交通安全委员会(National Transportation Safety Board,NTSB)对107起交通事故的调查研究,表明58%的事故与驾驶员疲劳打瞌睡息息相关。拉夫堡大学通过对4 621名轿车以及996名货车的男性司机进行了实时跟踪研究,发现29%的驾驶员在驾驶过程中打瞌睡,其中10%的驾驶员因疲劳驾驶导致交通事故。在中国,48%的车祸是由驾驶员疲劳造成的[1]。
因此,检测驾驶员疲劳,并对驾驶员疲劳驾驶作出相应的警告,以保障驾驶员安全显得尤为重要,疲劳检测技术也成为了中外重点研究课题。中外对疲劳检测的研究方法主要有:基于驾驶员生理指标、基于驾驶员驾车行为特征以及基于机器视觉与人脸表情识别的非接触式疲劳检测方法[2]。基于生理指标的检测方法主要有对脑电信号(electroencephalography,EEG)、眼电信号(electrooculography,EOG)、呼吸频率以及心电信号等进行测量,这要求驾驶员佩戴一些检测的设备,会在一定的程度上影响驾驶员的驾驶行为,影响驾驶的舒适度;基于驾驶员行为特征的疲劳检测方法有通过车辆驾驶相关的参数如车速、方向盘角度、加速状态等判断驾驶员的疲劳状态[3],但由于道路的状况不同,驾驶员习惯的迥异以及车辆状况的不同等都会影响疲劳检测的准确度;基于机器视觉与人脸表情识别的非接触式疲劳检测方法,利用对驾驶员的眼睛闭合程度、嘴巴的张开的程度等特征来推断驾驶员的疲劳状态,这类方法通常采用摄像头获取驾驶员的面部信息,通过数字图像处理技术对眼睛状态进行实时识别,并依此判断驾驶员的疲劳状态[4],但在疲劳表情特征提取时,图片的预处理会受光照环境、人脸角度等的影响,对于采集数据的环境限制也较大。
伴随着互联网和计算机技术的不断发展,人脸面部表情识别技术也不断地改进。目前,有传统机器学习方法和深度学习方法两种途径对表情识别进行研究。基于传统机器学习方法的人脸面部疲劳识别指的是利用传统的算法进行特征提取的过程。传统的特征提取算法有局部二值模式(local binary patterns, LBP)算法[5]、Gabor 小波变换算法[6]、尺度不变特征变换(scale-invariant feature transform,SIFT)算法[7]等。传统的机器学习方法在提取面部疲劳表情特征时都依赖于手动的特征设计过程,需要人为参与,会浪费一定的时间和人力资源。随着深度学习在目标检测等领域取得巨大的成就,深度学习也促进了疲劳检测技术的发展。Zhu等[8]提出了一种使用卷积神经网络对眼电信号进行无监督学习的算法,利用该算法对眼部的一些特征进行提取,代替人工设计算法进行特征提取的过程,并在后处理中使用线性动态系统(linear dynamic system, LDS)算法减少不利的干扰。Zhang等[9]提出了一种基于卷积神经网络(convolutional neural network,CNN)的计算眨眼频率的眼睛状态识别方法,采用红外视频检测提升了驾驶员佩戴太阳镜情况的准确率,但疲劳参数过于单一。研究表明,使用深度网络直接从图像中学习视觉特征表示,相较于手工设计的特征对光照、姿势等条件变化具有更好的鲁棒性,预测精度显著提高。以上的疲劳驾驶检测算法都取得了很大的效果与进展,但仍然存在不足。
由于这些方法的不足和深度学习技术的不断融合。提出一种改进的深度卷积神经网络驾驶员面部疲劳表情检测方法。该方法首先利用Dlib库中含有方向直方图(histogram of oriented gridients, HOG)[9]和级联分类器(support vector machine, SVM)算法相结合的预训练的人脸检测器,用该检测器实现面部区域检测。随后使用级联回归(ensemble of regression trees, ERT)[9]实现面部特征点标定。然后利用softmax损失函数与中心损失函数共同作为模型训练的监督信号,扩大类间间距,缩小类内间距的深度卷积神经网络对驾驶员面部疲劳表情进行特征提取、训练和学习,最后对疲劳表情状态进行识别。实验结果表明,本文提出的改进的深度卷积神经网络方法来识别疲劳表情,对驾驶员疲劳检测是有效的。
人脸面部疲劳检测属于人脸表情识别的一种,主要是通过对人脸表情状态特征判断是否疲劳。人脸面部疲劳的状态参数主要是通过眼睛、嘴巴、头部姿态等特征获得,其中约80%~90%的疲劳特征是通过眼睛的闭合程度、眨眼的频率和速度、眼睛的运动或眼睛的其他生理特性来检测是否疲劳。常见的眼睛状态检测的方法是利用单位时间内眼睛闭合时间所占的百分率(percentage of eyelid closure over the pupil over time,PERCLOS)[10]方法,它用在单位时间内眼睛的闭合时间所占的百分比来推测驾驶员的疲劳程度。目前疲劳检测系统通常采用 P80 作为驾驶员疲劳识别,其中 P80 指以眼睛闭合时间占特定时间的 80% 为疲劳状态评价指标。虽然PERCLOS在视觉的方法中效果较好,但它也存在不足,PERCLOS算法在人佩戴深色眼镜时易受影响。除此之外,每个人的眼睛也有差异,这也为疲劳检测带来了困难,并且只依据眼睛的状态来判断驾驶员的疲劳状态,容易发生误判、错判。除了眼睛,另一个反映疲劳特征的是频繁地打哈欠动作,当嘴巴张开一定的程度时,哈欠就发生了。总的来说疲劳时伴随着眼睛变小、出现闭合甚至完全闭合、眨眼次数减少、目光呆滞、头部下低、不断地打哈欠。通过这些面部的特征来检测疲劳。
疲劳检测整体框架如图1所示。
图2 非疲劳、轻度疲劳和严重疲劳部分表情Fig.2 Partialnon-fatigue,mild fatigue and severe fatigue expressions
疲劳检测分为3大部分:①通过数据采集,建立人脸疲劳数据集,数据集包括正常、轻度疲劳和严重疲劳3种状态的表情,并将采集的数据集归一化;②利用基于定向梯度直方图(HOG)和线性SVM算法的预先训练好的人脸检测Dlib方法,同时完成人脸检测和人脸对齐任务,并定位出人眼和嘴巴等68个关键点位置;③用具有泛化能力的softmax和中心损失的深度卷积神经网络模型对299×299大小的人脸非疲劳、轻度疲劳和严重疲劳的表情进行训练,提取眼睛、嘴巴及一些细微的面部表情特征,完成人脸面部疲劳图像的识别。
目前公开的人脸图像数据集有很多,但是在人脸面部疲劳图像数据集方面,缺乏开放性的疲劳表情数据集。需要建立有效的人脸面部疲劳数据集,以供研究多融合深度卷积神经网络算法对人脸面部疲劳识别的需求,来验证该算法的有效性。因此通过互联网搜集图像、采集相关视频图像及自行拍摄相关图像,采集的图像包含人脸非疲劳状态、轻度疲劳状态和严重疲劳状态3种表情图像。
疲劳数据部分非疲劳、轻度疲劳和严重疲劳的表情如图2所示。表1所示是人脸面部疲劳数据集基本数量。
表1 疲劳数据集数量
这里将数据集按6∶2∶2的比例分为训练集、验证集和测试集。训练集是用于训练模型参数的,而验证集是用于调整训练模型中的超参数和评估模型的能力,防止训练集在训练过程中产生过拟合现象。测试集用于评估模型的精确度,即对样本的泛化误差。
采用的是Dlib库中自带的人脸位置检器函数,用于实现人脸定位。该函数是基于方向梯度直方图(HOG)和级联分类器SVM算法进行人脸检测。2005年,Dalal等[11]提出了一种用于人类检测的方向梯度直方图的方法。Dlib在使用含有HOG算法和SVM级联分类器的人脸位置检测函数时,分为以下6步。
(1)对一幅原始的图像进行灰度化处理。
(2)采用HOG算法中的Gamma校正法对输入的图像进行颜色空间归一化,Gamma压缩公式为
I(x,y)=I(x,y)gamma
(1)
其目的是调节图像的对比度,降低图像局部的阴影和光照变化造成的影响,同时可以抑制噪声的干扰。
(3)计算图像每个像素横坐标和纵坐标方向的梯度,依据此计算每个像素未知的梯度方向值。图像中像素点(x,y)的梯度为
Gx(x,y)=H(x+1,y)-H(x-1,y)
(2)
Gy(x,y)=H(x,y+1)-H(x,y-1)
(3)
式中:Gx(x,y)、Gy(x,y)、H(x,y)分别表示输入图像中像素点(x,y)处的水平方向梯度、垂直方向梯度和像素值。像素点(x,y)处的梯度幅值和梯度方向分别为
(4)
(5)
计算每个像素的梯度,主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
(4)为每个cells细胞单元构建梯度方向直方图,即将图像划分成小cells,对每一个cell块对梯度直方图进行规定权重的投影,目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。
(5)把细胞单元组合成大的快(block),块内归一化梯度直方图。由于局部光照的变化以及前景-背景对比度的变化,使得梯度强化的变化范围非常大。这就需要对梯度强度做归一化,归一化能够进一步地对光照、阴影和边缘进行压缩。
(6)收集HOG特征,即把提取的HOG特征输入到SVM分类器中,寻找一个最优超平面作为决策函数,输出训练好的人脸检测器模型detector,在原图中寻找人脸的疑似区域。
脑卒中是一种多发于中老年群体的脑血管疾病,卒中后经调查多数患者会出现焦虑抑郁症状,临床多表现为“情绪低落、兴趣减退”等,具有典型的抑郁特点,严重影响患者的生活质量[4]。另一方面,不良情绪会进一步影响患者治疗依从性,加重疾病恢复的不良影响,对于预后改善较为不利。有研究认为,护理干预对于疾病治疗效果具有重要影响,据此本研究特以85例脑卒中后焦虑抑郁患者为例展开对比分析,主要探讨针对性护理的应用效果,现报道如下:
Dlib使用HOG+SVM方法形成预训练好人脸检测器get_frontal_face_detector()函数,实现人脸检测。
通过Dlib的HOG和SVM方法检测到人脸并用矩形框标定人脸的轮廓后,利用Dlib库自带的人脸关键点检测器:shape_predictor_68_face_landmarks.dat进行检测。
(6)
根据Dlib库中所含HOG和SVM算法及ERT算法,实现了对人脸检测及人脸面部的眉毛、眼睛、鼻子、嘴巴等特征点的标定。图3所示为人脸检测、68个特征点标定及眼睛和嘴巴定位的图像。
图3 人脸检测、关键点标定和眼睛、嘴巴定位Fig.3 Face detection, key point calibration, eye and mouth positioning
深度卷积神经网络是用卷积代替全连接进行特征提取的一种具有多层神经网络的模型,该网络避免了对图像复杂的前期预处理,可以直接使用图像的原始图像作为输入,并对其特征提取,训练学习,分类识别。疲劳检测过程需要对大量的图像进行处理,收集的每张图像包含了不同的信息,怎么将每一类疲劳表情特征更好地连接在一起,本文没有用传统的损失函数而是采用了中心损失函数[13]的深度卷积神经网络学习人脸疲劳表情特征。并且建立了16层具有模块化的深度卷积神经网络模型。利用该网络对不同的人脸非疲劳、轻度疲劳和严重疲劳表情进行特征提取,并对这些特征进行训练学习。
损失函数用来衡量模型预测的好坏,即用来表现预测值和实际数据之间的差距程度。常常使用传统的损失函数,如softmax loss。它虽然可以保证类间差异最大化,但不能保证类内差异最小化,从聚类角度分析,很多时候类内间距甚至会大于类间距离,这使提取的特征并不好。另一方面softmax分类结果不是0就是1,这会使得模型过度自信,使得分类结果准确率较低。而中心损失函数对类内间距太大做了优化,使得类内间距最小。中心损失保留了原来的分类模型,但又为每一个类指定了一个类别中心。也就是同一类的图像对应的特征都尽量地靠近和自己相同的类别中心,对于不同的类别中心则尽量远离。所以在传统的损失函数的基础上,加入中心损失函数,共同作为深度卷积模型训练的监督信号进行联合优调,使得输出的人脸疲劳表情特征类间分散、类间聚合化。
设输入的不同疲劳图像为xi,该对应的类别为yi,对每种不同状态的疲劳表情都规定一个类别中心,记作cyi。期望每种疲劳图像对应的特征f(xi)都尽可能的接近自己的类别中心cyi。那么损失函数为
(7)
则多张图像的中心损失为它们各自损失函数的累加,即
(8)
L=Lsoftmax+λLcenter
(9)
式(9)中:λ是一个超参数,即中心损失函数的权重系数。
总的来说,使用中心损失来训练人脸疲劳表情模型的过程是,首先随机初始化各个中心cyi,接着不断取出batch进行训练,这时在取出的每个batch中,使用总的损失L,这样不仅使用神经网络模型的参数对模型进行更新,还对cyi进行梯度计算,并更新中心的位置。利用MNIST数据集进行实验,设计一个5层卷积网络,最后使用全连接层,让最后一层向量变为二维,分别使用softmax训练100步和加入中心损失后的训练epoch为100步的二维向量图,如图4所示。
图4 softmax和softmax+中心损失的二维向量图Fig.4 2D vector diagram of softmax and softmax+center loss
从图4中可以看出,只使用softmax损失函数训练的结果不具有内聚性,而加入中心损失可以让训练时的特征具有内聚性。中心损失的加入使得训练的特征具有内聚性,生成的模型具有更好的鲁棒性。
对于不同像素的三原色(red,green,blue, RGB)非疲劳、轻度疲劳和严重疲劳图片转换成299×299相同像素的图片,便于后边特征的提取。根据GoogLeNet[14-16]建立了自己的网络训练模型,对3种表情的特征进行提取以及学习。网络训练模型结构如表2所示。
表2 网络训练模型结构(输入299×299×3)
采用了16层且模块化的卷积神经网络结构。网络模型采用了模块化(Inception)的结构,便于对层数的添加和修改。如表2中的Inception模块采用4个并行计算:①经过一个1×1小的感受野的卷积核与输入量进行卷积提取特征;②一个1×1的卷积后加上两个3×3的卷积,1×1的卷积可以减低输入的特征通道,减少参数的计算量,同时又不减少特征信息的提取;③一个1×1的卷积后加上一个5×5的卷积,这样不仅可以用一个较大的感受野的卷积提取特征,同时用1×1的卷积又起到了降维的作用,减小了计算的复杂度;④一个3×3的平均池化加上一个1×1的卷积,平均池化改变输入的特征排列,1×1的卷积进行特征提取。最后将这4个并行的计算结果得到的特征在通道这个维度上相加在一起。使用1×1、3×3、5×5不同大小的卷积核模块化的结构,卷积后有着大小不一的感受野,每一个模块的最后都是不同尺度特征的融合。同样的,Inception (6b)模块也采用了4个并行计算。和Inception(5a)不同的是,他采用了非对称的1×7和7×1卷积核,来代替7×7卷积核。这样减少了大量的权值参数,加快了运算速度并减轻了过度拟合。
网络模型的每一个模块都使用了1×1卷积核进行降维。这样就不用担心丢失很多有用的特征信息,这相当于将获得的特征进行压缩,相应的训练速度提高了。并且在第2个、第3个大的模块使用了非对称的卷积核,可以对更为丰富、更多的特征空间进行处理,来增加特征的多样性。
本文使用的是自采集的疲劳表情数据集以及公开的用于设计和测试打哈欠检测算法和模型的YawDD[17]视频数据集。自采集的疲劳表情数据集共有19 940张图像,该数据集分为非疲劳状态、轻度疲劳状态和严重疲劳状态3种类型。然后分别从中划分60%的样本为训练集,20%的为验证集,剩下的20%为测试集。YawDD视频数据集包括两类视频:一个数据集是摄像机安装在汽车的前镜下,包括不同种族、不同性别的司机,每个参与者有3~4个视频,每个视频包含不同的嘴巴特征状态,如正常、说话、唱歌和打哈欠,共有322个视频。另一个数据集是摄像机安装在驾驶员的仪表板上,每个参与者有一个单独的视频,包括开车时说话、打哈欠的状况,共有29个视频。这两类视频数据集都是640×480大小、24位真彩色的无音驾驶视频,如图5所示。
图5 YawDD数据集示例Fig.5 YawDD data set example
实验的硬件是E5-2640 v4的CPU处理器,RAM为64.0 GB,实验进行在操作系统为Windows环境下使用tensorflow[18]框架实现。为验证改进的深度卷积网络算法对疲劳检测识别的有效性,以及中心损失函数对模型训练的影响,设置了5个实验进行对比。具体实验如表3所示。
表3 具体实验
实验中共同使用Adam优化器,学习率设置为0.001,迭代训练次数为100 000次。dropout为网络模型添加的正则化损失函数[19],失活概率为0.4,中心损失的中心学习率设置为0.5,权重系数λ设置为0.003。实验5加入YawDD打哈欠数据集,扩大了数据集样本。
实验1~实验4都是对疲劳测试集中1 252张非疲劳的表情图片、1 260张轻度疲劳的表情图片和1 476张严重疲劳的表情图片在不同的网络模型中进行识别检测。识别的结果如表4所示。
表4 实验结果
从表4看出,这4个不同的网络的训练集准确率都在98.90%以上,说明基于深度卷积神经网络对训练的疲劳数据集有较好的拟合效果。通过加入dropout防止模型过拟合的技术,以及使类内间距减小的中心损失函数的不断改进,训练集的准确率逐渐地提高,这说明了本文提出的改进的深度卷积神经网络模型对疲劳表情识别检测是十分有效的。在分别加入dropout和中心损失函数的实验的测试集平均准确率相比只有sofmax loss的实验平均准确率分别提高了2.27%和1.52%。这表明dropout与中心损失函数更有效地降低了网络过拟合的问题。在dropout和中心损失共同作用的实验中,测试的准确率则提高,效果更优越,说明中心损失和dropout层两者并不冲突,两者共同作用使深度卷积神经网络模型提取驾驶员面部疲劳表情特征更具鲁棒性。
实验5在实验4的基础上加入了YawDD打哈欠数据集,扩充了训练、验证和测试识别的数据量,训练集中有7 500张非疲劳表情图像,7 536张轻度疲劳表情,8 200张严重疲劳表情;验证集中和测试集中的非疲劳表情有2 500张,轻度疲劳有2 512张,严重疲劳有2 733张图片,随着数据量的增加训练需要的时间更长,但训练集准确率和测试集准确率提高了。表5是加入YawDD数据集训练以及测试的结果。
表5 扩充数据集的训练测试结果Table 5 Training test results of the extended data set
从表5可以看出,数据集的扩展使得网络的泛化能力更强,识别检测的准确率更高。
以上实验结果表明,与传统的疲劳驾驶检测算法相比,改进的深度卷积神经网络直接输入原始图像,可以自动的输入的图像进行特征提取,并挖掘目标图像的深层信息且不依赖人工的参与。与其他的深度学习模型相比,加入dropout层以及中心损失函数改进的深度学习训练模型,不仅使类间间距扩大,同时还使类内间距最小化,改善模型对疲劳表情的分类能力,提高了疲劳识别的准确率,具有较好的鲁棒性。
驾驶员面部疲劳表情特征是疲劳驾驶检测的关键,从疲劳表情识别的准确率和鲁棒性,提出一种以softmax损失与中心损失相结合的深度卷积网络模型来实现疲劳驾驶检测的方法。利用开源机器学习库Dlib中的HOG+SVM算法实现人脸检测和对齐,以及库中的级联回归数ERT算法实现人脸关键点定位,继而实现对眼睛和嘴巴的定位。最后利用深度卷积神经网络有效地从不同的脸部疲劳状态图像中,自动学习和提取具有区分性的面部疲劳表情特征,很好地避免了传统的人工提取特征难的问题。相比传统的机器学习方法,深度卷积网络在复杂的背景下提取面部疲劳表情特征更加高效,准确率更高。
在原有的softmax损失深度网络结构中加入中心损失,不仅使深度人脸疲劳检测识别模型的类间间距最大,而且使得训练学习的不同疲劳状态特征之间的类间间距减小。网络中还加了防止模型过拟合的dropout等方法的16层GoogLeNet模型。实验结果表明,改进的深度卷积网络,在自建数据集和YawDD打哈欠标准数据集上都取得了98.81%的疲劳识别准确率。与传统的驾驶疲劳检测方法相比,避免了繁琐的人工特征提取的工作;与原来只有softmax损失的深度学习网络相比,检测识别速度更快、准确率更高、鲁棒性更好。
在实际的驾驶应用场景中,包含很多驾驶员开车的姿态、夜间驾驶光照、遮挡物等干扰因素,因此今后会继续研究在复杂场景下的疲劳驾驶检测算法,并在驾驶员疲劳时,警告驾驶员,减少交通事故的发生。