冯向荣,马玉琨,李琳芳,安金梁,张志霞
(河南科技学院信息工程学院,河南新乡453003)
据调查,在我国有27%以上的驾驶员认为有过疲劳驾驶的经历[1],2010年美国汽车协会交通安全基金会进行了一项交通安全事故调查,结果表明因疲劳驾驶造成的交通事故占比21%[2].因此,如何检测、识别驾驶员的疲劳程度,及时提醒驾驶员采取措施,避免疲劳驾驶,减少疲劳驾驶交通事故,具有重要意义.关于疲劳驾驶的研究,按疲劳特征选取的不同可以分为4个方面:①基于驾驶车辆行驶特征进行的疲劳检测,这一类方法主要利用车辆行驶轨迹、行驶速度、驾驶人打方向盘的快慢和握方向盘的松紧等特征来检测疲劳程度.如Chai等[3]提出了使用方向盘状态来检测疲劳状态.张明明[4]提出利用驾驶人对方向盘的握力特征来检测疲劳状态,此类方法受驾驶习惯、道路情况影响较大,检测正确率不高.②基于驾驶员生理信号特征进行的疲劳检测,主要是利用脑电信号、心电信号和肌电信号.如Luo等[5]采集驾驶人前额脑电信号数据,利用自适应多尺度熵特征提取算法进行的疲劳驾驶检测方法.Wang等[6]利用股二头肌肌电图进行的疲劳检测方法等.这一类方法需要驾驶员穿戴检测人体生理信息的设备,会干扰到驾驶员的正常驾驶.③利用驾驶员行为特征进行的疲劳检测.此类方法主要利用驾驶人头部、眼部、嘴部动作特征来检测驾驶人疲劳状态.如Xu等[7]利用眼球运动特征检测驾驶人的疲劳程度.Knapik等[8]利用热成像检测哈欠等.此类方法缺点是易受光线和驾驶员头部动作影响,优点是准确度更高、容易实现、实时性强.④将多个特征进行的融合疲劳检测[9].此类方法将上述三类采用的特征融合在一起,需要大量的训练集,训练过程较为繁琐,且实时性难以保障.本文提出基于归一化平均眼睛宽高比的疲劳检测方法,利用python和opencv实现了疲劳检测预防系统.
驾驶人疲劳首先会体现在眼睛上,眼部特征能最直观的表现出驾驶人的疲劳状态.轻微疲劳时:眼部疲劳,眼皮沉重;中度疲劳:眼睛会发涩,轻微疼痛;重度疲劳:昏昏欲睡,神志不清,有时会有突然醒来的感觉,有时甚至呼呼大睡.随着疲劳程度的加深,眨眼的频率增加,眼睛的高宽比变小,单次闭眼时长增加直至睡着.
图1 人眼特征点标注Fig.1 Eye feature point labeling
如图1所示,给眼睛标注6个点,眼睛的高宽比用EAR0表示,则
通过实时计算驾驶人不同状态的EAR,可以得到图2.
图2驾驶员不同状态情况下眼睛高宽比Fig.2 Eye aspect ratio of drivers in different states
图2 是驾驶员不同状态情况下眼睛的高宽比,试验条件是:分别实时截取驾驶员精神饱满、轻度疲劳、重度疲劳3种情况下的眼睛实时高宽比,共截取视频帧数200帧,fps=25,从spirited图中可以看出,精神饱满时眼睛高宽比较大,高宽比大部分时间大于0.3,当然偶尔会有眨眼动作,偶尔会出现小于0.3的情况;从Mild fatigue图中可以看出,当处于轻度疲劳状态时,相比精神饱满状态,眼睛的高宽比开始变小,高宽比小于0.3的情况频率变大,小于0.3的帧数增多,且偶尔会出现连续快速的眨眼动作.从Severe fatigue图中可以看出,当重度疲劳时,大部分帧中的眼睛高宽比小于0.25,甚至接近于0,说明驾驶人处于昏昏欲睡、神志不清的状态,偶尔会出现大于0.3,甚至接近0.4的情况,说明驾驶员在下意识的同疲劳作斗争,偶尔会清醒一下.
通过以上分析可知,驾驶人疲劳情况与高宽比(EAR)、眨眼频率、单次眨眼时长3个行为特征密切相关.疲劳状况越严重总体高宽比变小,眨眼频率变大,单次眨眼时长增加.
另外,不同的驾驶人,眼睛形状不同.在同样精神状态下,不同的人,眼睛的高宽比会有很大的不同,因此不能简单用眼睛高宽比来判断驾驶人的疲劳程度.
当前众多算法中都是以眼部行为特征中的一个特征来检测驾驶人疲劳程度[10],如仅采用眨眼频率特征来检测疲劳程度,或者用一个眼部行为特征与嘴部特征、头部特征、车辆行为特征或驾驶人生理特征相融合来检测疲劳程度,这样就忽视了眼部的另外两个重要行为特征.基于此提出了NMAER疲劳检测方法.该方法用一个简单数学公式融合了高宽比、眨眼频率和眨眼时长3个眼部的重要行为特征,计算量小,计算速度快.
假设有一段n帧的驾驶员驾驶行为视频,首先读取视频中连续N帧,N的取值为:50<N<5 000,试验取值为:N=200,然后计算出每一帧的EAR,则N帧中EAR的最大值为
数组EAR的长度为N,则NMEAR的值为
公式(3)通过对眼睛高宽比(EAR)的求和,融合了眨眼时长、频率和EAR信息,通过归一化(除以M),解除了因不同个体眼睛高宽比不同所带来的影响.通过求均值,可以淡化因特殊情况导致的眨眼所带来的影响.
公式(2)和公式(3)仅仅计算出了一个M值和一个NMEAR的值,事实上由于n远大于N,也就会有很多个M值和很多个NMEAR的值.当n较大时,可用如下公式计算M和NMEAR的值
式(4)从第N帧开始,每增加一帧,就计算一个NMEAR值,共计算n-N个NMEAR值,实时性较强;式(5)从第N帧开始,每增加一帧就计算一次M值,共计算n-N个M值.从公式(4)和公式(5)可用看出,从第N帧开始,每增加一帧就可以计算出一个NMEAR值.
对于M和NMEAR的计算,在实际应用中还可以用公式(6)和公式(7)来分别计算NMEAR和M值
式(6)从i=0开始,每隔N帧,计算一个NMEAR值,共需计算k=n//N个NMEAR值,与公式(4)相比,公式(6)计算量更小,实时性比公式(4)稍差.
实现NMEAR算法需要做的工作包括,对输入的视频图像进行预处理,利用基于HOG+SVM的人脸检测算法,进行人脸检测,借助Dlib的关键点检测器对人脸68个关键点进行定位,提取人眼坐标点,计算EAR、M和NMEAR,判断驾驶人的疲劳状态.算法流程见图3.
图3 NMEAR疲劳检测算法流程Fig.3 Flow chart of NMEAR fatigue detection algorithmv
Dlib工具包提供的人脸检测方法是基于图像的HOG(图像方向梯度直方图)特征,并结合了支持向量机算法.这种检测方法具有鲁棒性好、准确率高等特点,被广泛应用于面部检测.算法思想是首先训练好人脸分类器,然后对图片进行扫描,提取出HOG特征,将HOG特征喂入分类器,从而判断出人脸所在位置.Dlib所提供的人脸检测器只能处理灰度图,因此首先需要对图片进行预处理,转化成灰度图,然后调用人脸检测器来实现人脸的检测.
Dlib工具箱提供两种人脸特征点定位方法,第一种是含有5个特征点的定位器,但这种定位器由于特征点太少,无法完成眼睛宽高比计算.第二种是68个特征点的定位器,脸部68个关键点见图4.
图4 人脸68个关键点示意Fig.4 Schematic diagrams of 68 key points of human face
检测出图片中的人脸后,调用Dlib中定位器在检测出的人脸上进行关键点标注,提取出关键点的坐标,通过切片技术,分别得到左眼6个关键点的坐标和右眼6个关键点的坐标.
得到眼部12个关键点的坐标后,利用公式(1)求出每一帧的EAR;利用公式(2),求出M;利用公式(3)求出 NMEAR.
利用上述步骤求出图(1)中所对应数据的NMEAR的值分别为:
精神饱满时NMEAR0=0.887 442 360 728 619
轻度疲劳时NMEAR1=0.698 335 779 855 587
重度疲劳时NMEAR2=0.384 320 098 641 971
上述3个NMEAR的值均正确地反映了驾驶人的驾驶时的疲劳状态.
但由于图1中所对应的数据较少,取N=200,这里只求出一个NMEAR值,因为数据较少,所求的M值在200个EAR内是最大的,但这个M值可能并不是真的最大,导致计算的NMEAR值偏大,在实际疲劳驾驶检测时数据是足够大的,视频帧数多达数十万甚至上百万,求得的M值比较准确.实测时由于数据量大,通常采用公式(4)和(5),或公式(6)和(7)来计算 NMEAR 和 M 值.
经过对100个短视频进行测试初步界定精神饱满、轻度、中度和重度指标见表1.
表1 NMEAR疲劳程度表征Tab.1 Characterization of NMEAR fatigue degree
事实上用单个的NMEAR来判定疲劳程度是不准确的,因此本文提出用NMEAR概率分布的方法来判定疲劳程度,取连续的N0个NMEAR,统计这N0个NMEAR落入上述区间的概率,通过落入疲劳区间的概率来判断驾驶人的疲劳程度.如落入NMEAR≥0.7区间的概率>50%,这判定驾驶员为精神良好.
数据为中午13时录制的一段时长20 min 28′的视频(模拟驾驶),视频描述:驾驶人有午休习惯,录制前有轻微疲倦,开始录制时驾驶人精神振作,但很快就显示了困意,随着时间推移,疲倦加重,中间有强制睁大眼睛的行为(与疲倦斗争),但随后眨眼次数显著增多,闭眼时间变长,甚至有短暂睡着现象.视频共 36 785帧,帧宽度为1 280,帧高度为 720,帧速率 30.1帧 /s,N 取 200帧,采用公式(1)、公式(4)和公式(6)分别计算出EAR和NMEAR.结果见图5.
图5 NMEAR随疲劳程度变化Fig.5 Variation of NMEAR with fatigue degree
图5由3副子图组成,由上至下依次为ERA图、公式(4)计算的NMEAR0和公式(6)计算的NMEAR1图.可以看出NMEAR0值和NMEAR1值变化趋势是一致的.观察EAR图,可以看出EAR值有所变小,但变化不明显,不能清楚展现驾驶员疲劳程度.而从NMEAR0和NMEAR1的变化图上看以看出,NMEAR值变化明显,呈明显下降趋势,显示出了驾驶员从精神较好到严重疲劳的变化过程.图中的NMEAR值准确表达了视频中驾驶人的疲劳程度变化情况,NMERA值总体上随着驾驶时间的增加在减小,说明疲劳程度在加深.
疲劳程度判定.由图5中的NMEAR子图可知,NMEAR呈震荡变化,因此用单一的NMEAR值判定疲劳程度不够准确,因此我们取100个NMEAR值用于当前疲劳程度的判定,如当前的NMEAR值为NMERA(k),则取数组 NMEAR[k-100:k]中的 100 个值,统计 NMEAR 值在区间 NMEAR≥0.7、0.6≤NMEAR<0.7、0.5≤NMEAR<0.6和NMEAR<0.5出现的概率,如果某一区间出现的概率大于50%,则判定为该项对应的疲劳程度成立.如:NMEAR<0.5在数组NMEAR[k-100:k]出现的概率大于50%,则判定为重度疲劳.
算法性能统计,为了验证算法的可行性和先进性,分别录制了5组不同人员的驾驶视频,每组为20人每次时长约5分钟的视频,用NMEAR算法进行检测,选定阈值为0.7(仅仅判定疲劳与否,不具体判定疲劳等级).结果见表2.
表2 NMEAR法检测正确率统计Tab.2 Statistical table of detection accuracy of NMEARM method
由表2可以看出,NMEAR算法疲劳检测的正确率高达96%,而计算NMEAR运算量很小,如果采用公式(4),检测完毕一段n帧的视频,只需要n个加法,n-N个乘法,n-N个除法.可见算法在疲劳检测层面提高了检测速度.
本文提出的NMEAR算法算式简单、计算量小,且将眼部3个关键行为特征融合在了一起,克服了因个体差异、眼睛高宽比不同带来的影响.实验表明NMEAR疲劳驾驶检测正确率高达96%.但NMEAR算法仍会受到光线和头部运动的影响,解决方案是可以采用双摄像头(普通摄像头+红外摄像头)交叉布置.