李京徽, 郭昕刚
(长春工业大学 计算机科学与工程学院, 吉林 长春 130012)
随着汽车数量的快速增长,交通事故越来越多,给出行带来了巨大的安全隐患。为了最大限度地减少交通事故的发生,政府最近出台了多种相关政策,并取得了显著成效。现阶段,交通事故依然威胁着人们的生命安全。例如,缺乏道路安全驾驶意识、酒后驾驶和疲劳驾驶是导致交通事故的主要因素,其中,疲劳驾驶占交通事故原因的14%,占交通事故的20%,在重大交通事故中约占43%,在大型卡车和公路交通事故中约占37%[1]。现在大多采用基于驾驶者面部特征的疲劳驾驶检测方法,但以这种方法进行特征提取的时候存在误差,导致提取效率不高,并且精度低和鲁棒性差,而且在之后的疲劳判定中,评判参数单一。针对以上问题,文中提出一种以人脸多特征融合的检测疲劳驾驶算法。
能准确、快速进行人脸检测定位是疲劳驾驶检测的首要任务,因为检测结果关乎到算法的性能。而在不断行驶中,驾驶员的人脸可能受光照、姿势或者遮挡等因素的影响,图像特征可能无法采集,从而降低了预定特征方法的鲁棒性和可靠性。
YOLO(You Only Look Once)模型是一种基于深度学习的快速检测模型[2]。而文中所使用的YOLOv3-tiny则是YOLOv3的简化版。YOLOv3算法原理也很简单,即引入残差模型和FPN架构。而YOLOv3-tiny是在YOLOv3的基础上去掉一些特征层,只保留了2个独立预测分支,具体网络结构如图1所示。
图1 YOLOv3-tiny网络结构
从图1显示网络结构可以看出:
1)总共有24网络层,比yolo3的107层减少很多。
2)只有两个yolo层,分别是yolo16和yolo23,其大小分别为13×13和26×26,此外,每个yolo层也对应有3个anchors,总共有6个anchors值。
3)yolo层前面是一个1×1的卷积层,该层的输入和输出部分保持width, height以及channels不变。在darknet里面,其卷积公式为
式中:padding=0。
因为考虑到疲劳驾驶人脸检测需要较高精度,因此,在YOLOv3-tiny训练阶段可以选择WIDER FACE(Face Dtection Data Set and Benchmark)[3]数据集,WIDER FACE[4]数据集包含32 203幅图像和393 703张标记人脸,包括不同的比例、姿势、遮挡、表情、化妆、照明。WIDER FACE 数据集如图2所示。
图2 WIDER FACE 数据集
基于改进的YOLOv3-tiny网络驾驶员面部区域,建立了基于dlib的人脸关键点检测模型[5],如图3所示。
图3 dlib的人脸关键点检测模型
提取驾驶员面部的细粒度特征。dlib库含有68个人脸关键点,该库采取级联形状回归方法对人脸构成的关键点进行查询。
在人脸关键点检测中,dlib[6]采用并提供了一个基于数百万张面孔的模型。该方法利用像素强度的稀疏子集预估人脸关键点的位置,是一种采用回归树的集成方法[7],此方法具备检测精度高、耗时少等长处,文中将运用于提到的人脸特征提取中。
在使用dlib工具箱提取68个特征点后,可以将这些特征点形成128维特征向量[8]在这个向量空间中,在一个面的欧氏距离比不在一个面的欧氏距离更近。因此,基于dlib工具包提取的128维特征向量可以作为身份验证的驱动生物特征识别技术。
根据传统方式PERCLOS[9]的疲劳检测算法仍是现在传统方式PERCLOS的疲劳检测算法依据。这些方法大多采用P80[10]标准提取眼睛状态参数。根据设计思路,首先需进行采集并预处理眼睛部位图像,随后对驾驶员的眼睛轮廓采用椭圆拟合方法。得出最终计算结果,驾驶员眼睛状态参数就是椭圆的长轴与短轴之比。但可以预见,驾驶员眼睛图像预处理可靠程度的好坏是判断此方法的基础。在实际场景中,由于光照条件的不断变化和驾驶过程中驾驶员头部姿势的不断变化,这种方法可能具有较低精度。
为此,文中在dlib人脸特征点定位的基础上提出一种新的参数----眼特征向量(EFV)[11],用于评价驾驶员的眼部状态。根据dlib眼特征点定义EFV,驾驶员眼部状态是反映驾驶员疲劳状态的重要指标,采用椭圆拟合方法取得驾驶员眼部提取模块输出数据是文中采用的方案之一。眼睛的状况(开或者闭)可以依靠椭圆的长轴和短轴之间的联系来判定。另外,还使用PERCLOS对司机的疲劳状况进行了评判。
(1)
式中:pi----眼特征点坐标,i= 1,2,…,6。
当驾驶员的眼睛处于不同的状态时,眼特征点有显著差异,如图4所示。
(a) 开眼图像的EFV (b) 闭眼图像的EFV图4 眼睛状态
从图4可以看出,当驾驶员眼部处于不同状态时,与眼睛特征点一致的EFV也有显著差异。所以,EFV可以作为表达驾驶员疲劳检测算法中眼睛状态的重要参数。
EFV差异(橙色表示关闭,蓝色表示打开)如图5所示。
图5 EFV差异(橙色表示关闭,蓝色表示打开)
打哈欠频率是与PERCLOS和眨眼频率相似的数据,可用这种标准来判定疲劳状态。根据张口的程度来判断疲劳是不准确的。在司机正常驾驶的过程中,有时候说话交谈也会开口,导致开口程度也在不断地发生变化,这对于依靠开口程度进行疲劳状态判定的影响是非常大的。通过对打哈欠过程分析发现:在说话时,开口的程度较小,时间较短;在打哈欠状态下,开口的程度较大,时间较长。
为了区分打哈欠和说话,文中将驾驶员口部状态分为三种类型:闭嘴、小口和大嘴。在之前文中提到的眼部特征点定位的基础上,提出一种与眼部状态参数相似的新参数----口特征向量(MFV)[12],用于评价驾驶员的口腔状态。根据dlib口特征点,可以定义MFV
(2)
式中:Mi----嘴特征点坐标,i=1,2,…,8。
当司机的嘴处于不同状态时,其嘴部特征点也存在明显差异,如图6所示。
图6 口腔状态
MFV差异如图7所示。
图7 MFV差异
从图7可以看出,当驾驶员的嘴巴处于不同状态时,其MFV值也存在显著差异,这与口型特征点是一致的。所以,MFV被用于评估司机是否疲劳的参数是可行的。
描述驾驶员疲劳水平的状态是一个动态变化的过程。目前,大多数研究人员已采用卡内基梅隆大学研究中心Wierwille[13]提出的闭眼百分比(PERCLOS)作为疲劳驾驶的有效指标。它是测量驾驶员单位时间内眼睛闭合所花费的时间,其数据表示为疲劳状态下的一种物理量。美国联邦政府的相关交通部门已经在实验室中模拟证明了PERCLOS在体现驾驶员疲劳状态上的有效性。PERCLOS定义为
(3)
式中:Ntotal----单位时间内闭合眼睛的图像总数量;
Nclose----单位时间内闭合眼睛的图像数量。
为了考虑获得驾驶员特征的眼睛分类器,必须首先验证驾驶员的身份信息,以获得与驾驶员身份相对应的眼睛分类器,随后对身份验证分类信息进行基于PERCLOS的在线识别。当驾驶员在驾驶过程中,利用车载高清摄像头获取驾驶员的实时面部数据。接下来,使用改进的YOLOv3-tiny网络检测驾驶员的脸部。如果检测到驾驶员的脸部,则将脸部区域用作输入图像,并使用dlib工具箱定位脸部特征点。为了降低错误检测率,文中补充了驾驶员的头部姿势信息作为辅助判别参数。当改进的YOLOv3-tiny网络无法检测到面部或定位面部特征点时,确定驾驶员在驾驶过程中处于异常的头部姿势,并且将该帧图像用作闭眼帧。完成面部特征点定位后,基于眼睛特征点的坐标计算EFV,然后通过身份验证获得驾驶员眼睛状态分类器确定图像中驾驶员的眼睛状态。最终在设定时间内的帧数(文中设置1 000帧)中计算驾驶员的闭眼图像数量,从而计算得出PERCLOS值。如果PERCLOS>ThPERCLOS(ThPERCLOS是驾驶员的疲劳状态确定阈值(文中取0.4)),则确定驾驶员处于疲劳状态,否则处于非疲劳状态。
通常在驾驶过程中,驾驶员眨眼时间每次在100~400 ms,是一个相对较快的速度。然而,在疲劳状态下,闪烁的持续时间更长,且大于1 s,并且闪烁频率增加。不难发现,驾驶员的疲劳程度也可以通过观察眨眼频率来直观地表现。文中规定系统以眨眼的方式依次检测睁眼、闭眼,睁眼的状态变化,因此眨眼频率公式为
(4)
式中:T----时间,min;
NBlink----闪烁次数。
普通人醒着后每分钟眨眼10~20次。当他们疲劳时,眨眼频率将增加64%。根据相关研究,在完成身份验证后,将基于眨眼频率进行驾驶员疲劳状态的在线识别。通过设置特定的帧数(文中设置1 000帧)计算驾驶员的眨眼图像数,然后计算眨眼频率。如果FBlink>ThBlink(ThBlink是驾驶员的疲劳状态确定阈值(文中为20)),则确定驾驶员处于疲劳状态,否则就处于非疲劳状态。
利用打哈欠频率来判断疲劳与利用PERCLOS的眨眼频率类似,也是评估方法中的一个重要指标。打哈欠是一种深呼吸活动,通常在懒惰、疲倦和缺乏休息时发生,通过扩大肺部吸入更多氧气。它刺激中枢神经系统以增强精神,这是疲劳下的条件反射,利用这种条件反射活动可以直观评估疲劳水平。为了区分非打哈欠状态,通过程序观察开嘴的程度和时间来判断非打哈欠状态。文中设定,当系统检测到“ Close-Small-Big-Small-Close”的状态变化且打开时间超过2 s时,就是打哈欠。打哈欠频率公式为
(5)
式中:T----时间,min;
NYawn----闪烁次数。
相关研究表明,人的哈欠频率是由疲劳状态的多少来决定增减,文中基于打哈欠频率来研究驾驶员疲劳。为了获得考虑驾驶员特征的口部分类器,必须首先验证驾驶员的身份信息,以获得与驾驶员身份相对应的口部分类器。然后,将在线识别驾驶员身份验证后获得的打哈欠频率,从而确定驾驶员疲劳状态。在驾驶过程中,利用车载高清摄像头获取驾驶员的实时面部图像及相应数量。接下来,使用改进的YOLOv3-tiny网络检测驾驶员的脸部,并对其进行面部特征点定位。根据口部特征点的坐标计算MFV,以及驾驶员身份验证获得的口部状态分类器,并利用相关数据确定图像中驾驶员的口部状态。最后,在特定数量的帧中计算驱动程序的打哈欠次数(文中设置1 000帧),然后计算打哈欠频率值。如果FYawn>ThYawn(ThYawn是驾驶员的疲劳状态确定阈值(文中为3)),则确定驾驶员处于疲劳状态,否则就处于非疲劳状态。
文中算法表明,该系统在各种条件下都具有良好的精度和高速性能,并且可以准确地判断驾驶员的疲劳状态。与Adaboost+CNN[14]和MTCNN+LRCN算法[15]相比,文中算法提高了疲劳驾驶检测算法的准确性。其可满足疲劳驾驶检测系统对实时性能的更高要求。比较结果见表1。
表1 疲劳状态判断的时间花费
提出基于神经网络的疲劳驾驶检测方法。利用YOLOv3-tiny卷积神经网络对驾驶员人脸进行检测,之后,利用dlib库对人脸进行特征点的快速精确提取,这种方法即使在复杂环境下对人脸的特征提取也有良好的鲁棒性。最后,制定相应的判定算法,完成了疲劳驾驶的检测判定。但系统也存在一些问题,在面对现在因为疫情影响都戴口罩进行防护,口部被遮挡,无法在戴口罩的时候进行口部检测,需要进一步提高系统的实用性和准确率等问题。