陈小强,熊 烨,王 英,陈思彤
(1.兰州交通大学 自动化与电气工程学院,甘肃 兰州 730070;2.光电技术与智能控制教育部重点实验室,甘肃 兰州 730070)
随着我国铁路的发展,列车司机作业由传统的列车操控,转变为列车实时运行信息的长时间监控[1]。由于列车运行时间长且路况复杂的特点,列车司机的工作量日益加大,疲劳驾驶的可能性也日益增大。因此,实时检测出列车司机疲劳程度并预警,对保证列车的安全运营有重大意义。但我国铁路现有线路上机车车载行车安全装置主要是依靠司机一段时间后重复按无人警惕键来确定列车处于正常驾驶状态,大部分机车所配备的能够反映司机驾驶疲劳的车载装置也仅用于事后分析机车状态数据和司机操作数据的机车运行监控记录仪,基本不具备驾驶过程中的在线监测功能。
目前国内外对疲劳检测的研究多是从面部表现、人体生理指标、驾驶行为出发[2]。面部表现以其操作简单、成本低、无需穿戴特殊设备的优点成为近年来的研究热点。
面部表现可大致分为基于眼睛、嘴巴、多面部特征融合三种。
在眼睛特征中,文献[3]利用眼睛开合度计算单位时间内闭眼百分比判断司机是否疲劳。文献[4]构建双流双向卷积神经网络(BCNN)利用双目一致性进行信息交互以检测眼睛凝视方式,并提出基于瞳孔距离的人眼遮挡机制(ESM),以消除侧脸检测时遮挡人眼带来的疲劳检测误差。文献[5]分析疲劳前后人眼瞳孔直径大小随时间的波动的情况,司机清醒状态时以低波幅、快频率为主;相反,疲劳状态时,波形的变化幅度很大,振动频率中存在明显的低频慢波。文献[6]通过头部姿态估计,建立眼睛逆投影开合度和真实开合度的变换关系,修正了凝视方向对眼睛开合度检测的影响。文献[7]通过人眼在脸部的位置来跟踪人眼区域,定位虹膜中心计算眼动速率实时检测疲劳。文献[8]提出一种基于PCA/ICA的迭代补偿算法摘除眼镜以检测疲劳。文献[9]提出一种动态滑动窗口算法以睁闭眼的最佳阈值来检测疲劳。文献[10]利用眨眼频率、PERCLOS、注视方向和注视时间等眼睛特征分析了各自的最优时窗,针对不同眼睛特征最优时窗差异,提出了滑移时窗的数据融合方法以检测司机疲劳。文献[11]设计一种基于模糊综合评价算法,通过眼部高宽比,瞳孔黑色素占比,眼部拟合的椭圆面积三个评价因素判断眼睛开闭状态来检测疲劳。文献[12]提出一种利用深度残差卷积神经网络对不同光照条件下的睁眼和闭眼图像进行分类的方法,以消除光照变化对疲劳检测的影响。文献[13] 通过级联卷积神经网络得到人眼的6个特征点识别人眼状态并检测疲劳。
在嘴巴特征中,文献[14]通过Hough变换定位驾驶员嘴部的特征实现疲劳预警。文献[15]使用Fisher分类器提取嘴巴的形状,将其几何特征作为特征值构成特征向量输入BP网络中,以区别司机在正常、说话、瞌睡时的嘴巴状态。
在多面部特征融合中,对特征信息的融合算法多是模糊逻辑融合方法和贝叶斯分类,文献[16]将PERCLOS、闭眼时间、眨眼频率、点头频率等输入模糊推理系统进行疲劳检测。文献[17]通过自适应神经模糊推理系统判断驾驶员的疲劳程度。文献[18-19]通过贝叶斯算法对多个面部特征进行融合判断司机是否疲劳。文献[20]分别将眼睛嘴巴图像构建识别网络,对采集到的眼睛嘴巴状态进行融合并建立疲劳特征判断模型,提高了因司机头部倾斜、偏转时疲劳检测的准确率。此外,文献[21]利用LBP、Gabor、HOG 三种特征测度矩阵,采用多模态特征的距离测度学习算法从司机面部表情判断是否疲劳。文献[22]从疲劳表情机理和经验获取司机疲劳时的表情特征,将特征量化得到疲劳表情指标作为判据。文献[23]利用卷积神经网络学习到的面部特征替代传统预先定义的面部特征,使用softmax层将特征分为疲劳与非疲劳两类,判断司机疲劳状态。文献[24]通过采集到的司机面部图像建立其特征空间,与疲劳训练样本进行比较,判断司机是否疲劳。
本文提出一种面部多特征融合方法,根据K-means++算法得出不同司机人眼自适应阈值,利用相邻两帧瞳孔和内眼角的特征点位置的差值实现眼动跟踪,计算出眼动速率,通过模糊推理系统将眼睛开合度、嘴巴开合度、眼动速率三个判断指标相结合进行疲劳检测。该方法不仅能在一定程度上解决因个体面部特征差异导致固定阈值无法适用于每位司机以及面部特征判断指标单一的情况,还考虑前后帧图像的相关性,提高了驾驶员疲劳检测的可靠性。
疲劳检测方法流程见图1,输入采集到的司机人脸图像进行特征点定位,提取和计算疲劳检测相关面部特征,并定位到瞳孔和内眼角计算得到眼动速率。通过眼睛开合度判断眼睛开闭,用嘴巴开合度判断驾驶员是否打哈欠,用眼动速率判断眼球运动是否变得迟缓。将眼睛开合度、嘴巴开合度、眼动速率作为模糊控制系统的输入,根据设计的规则库进行推理,得到的模糊量为疲劳状态,将输出的疲劳程度值输入到疲劳判定模块,输出值即为列车驾驶员的疲劳状态从而实现疲劳检测。
图1 疲劳检测方法流程
为了提高疲劳检测方法对光照条件变化的适应能力,使用基于HOG特征检测人脸区域,在人脸区域运用ERT算法定位人脸特征点,从而计算出用于检测疲劳的各个判断指标。
HOG特征的基本思想是利用梯度信息很好地反映图像目标的边缘信息,并通过局部梯度的大小将图像局部的外观和形状特征化[25]。具体流程见图2。
图2 人脸检测流程
ERT(Ensemble of Regression Trees)法是2014年由Vahid Kazemi 和Josephine Sullivan提出的人脸对齐算法[26]。此算法通过建立一个级联的残差回归树GBDT(Gradient Boosting Decision Tree)来使人脸形状从当前形状一步一步回归到真实形状,即每级回归器学习的都是当前初始形状与真实形状的残差。当输入落到一个节点上时,就将残差加到该输入上,起到回归的目的,最终将所有残差叠加在一起,完成人脸对齐的目的。具体步骤如下:
Step1给定训练样本。有训练数据集(I1,S1),…,(In,Sn),其中Ii为图像,Si为人脸特征点的位置,数据组织形式可以表示为
( 1 )
式中:N=nR,n为图片数,R为初始化倍数;i=1,…,N;πi∈{1,…,n},π为满映射,πi(i=1,2,…,n)为第1到第n张图片的满映射,即图像中所有的人脸信息。
Step2初始化:
( 2 )
式中:ρ为面部特征的坐标位置的个数;γ为标准人脸信息。
( 3 )
Step4更新回归器:学习率0<υ<1
( 4 )
( 5 )
Step5更新位置:
( 6 )
( 7 )
图3 人脸识别与特征点定位效果
常用的瞳孔定位方法有灰度投影法、模板匹配法、Hough变换法、统计学习法等。考虑疲劳检测的实时性以及驾驶员与摄像头存在一定距离,所提供的像素信息较少,使用灰度投影法实现瞳孔定位,但该方法不适用于整张脸中检测人眼,由此利用ERT算法定位得到的人眼特征点外接的一个最小矩形框中使用积分投影函数对人眼进行定位,即
( 8 )
( 9 )
式中:I(x,y)表示图像在(x,y)处的灰度值,[xn,xm]和[yn,ym]分别表示图像在水平和垂直的边界。
在不同区域的边界,即当图像的某一列与其前一列或某一行与其前一行相比,发生了较大变化,通过积分得到极大或极小值是人眼的边界位置,在得到的人眼区域将灰度人眼图分别进行水平和垂直方向上的叠加,取叠加后数值最小的部分即为瞳孔的位置。人脸在不同状态下的瞳孔定位效果见图4。
图4 不同情况下的瞳孔定位效果
当人处于疲劳状态时,眼球运动速率会大幅降低。通过瞳孔定位,采用帧差分法计算相邻两帧图像瞳孔与内眼角的距离差值L除以处理这两帧图像所用时间t从而得到眼动速率v[25],见图5。
图5 相邻两帧的眼睛状态
(10)
(11)
L=|L1-L2|
(12)
(13)
PERCLOS(Percentage of Eyelid Closure Over the Pupil Over Time)是目前国际上公认的最有效的疲劳检测算法,它表示一定时间内人眼闭合时间占总时间的比例,有EM、P70、P80三种判断标准,其中P80效果最好,因此采用眼睛闭合80%代表眼睛处于闭合状态。眼睛的开闭状态通常情况下是采用眼部高宽比r来判断的,图6为眼部高宽比,即
图6 眼部高宽比
(14)
式中:h和w分别为眼睛的高度和宽度。
当人处于疲劳状态时会打哈欠,判断嘴巴开闭状态也是疲劳的评价因素之一。将嘴巴高宽比k作为判断嘴巴开闭的依据(图7),即
图7 嘴巴高宽比
(15)
式中:m和n分别表示为嘴巴的高度和宽度。
眼睛是判断是否疲劳最明显的特征,但司机的眼睛大小及形态个体差异明显,固定阈值可能并不适用于判断每位列车司机眼睛开闭状态,针对这个现象,本文提出基于K-means++法的人眼自适应阈值法,相较于传统的K-means法,K-means++法优化了初始中心的选择,使聚类结果更可靠,收敛速度更快,更满足实时检测要求[27]。使用当值列车司机眼睛开合度r的数据制定其自适应阈值。通过K-means++法将疲劳周期内的眼睛开合度聚类为两类,得到两个聚类中心r1、r2,先判断r1与r2的距离,若距离小于0.03,说明聚类效果不明显,这个周期内眼睛都属于同一状态,这时用绝对阈值0.2判断眼睛开闭状态,若小于绝对阈值,则为闭眼,反之为睁眼,下一个周期继续进行聚类直到成功聚类为两类。若距离较远,将眼睛开合度分为两类,较小的一类为闭眼状态,较大的一类为睁眼状态,得到人眼自适应阈值。计算每个眼睛开合度到两个聚类中心r1和r2的距离,距离哪个聚类中心更近,眼睛就属于哪个状态,人眼自适应阈值法具体流程见图8。
图8 人眼自适应阈值法具体流程
为证明本算法的可行性,选用5名眼睛大小形态不同的志愿者分别在正常和疲劳状态下的眼睛开合度用K-means++法进行聚类,得到的聚类中心如表1所示,可以看出在正常状态下,眼睛开合度聚类效果不明显,在疲劳状态下,眼睛开合度聚类效果良好,满足实际要求。同时,每名志愿者的眼睛开合度聚类中心不尽相同,说明阈值的选取具有自适应能力。
表1 眼睛开合度在不同状态下的聚类中心
为进一步区别列车司机打哈欠与其他张嘴行为,使用YawDD公用数据集自行检测了32名志愿者在嘴巴自然状态、说话以及打哈欠状态下的48 557个嘴巴开合度数据,通过K-means聚类将其分3类,聚类结果见图9,相同颜色的点为同一类,三类边界分别为[0,0.109],[0.11,0.324],[0.325,0.875],分别对应嘴巴在自然状态、说话以及打哈欠状态下的嘴巴开合度区间,由此将判断打哈欠的阈值设为0.325用以区分其他张嘴方式。
图9 嘴巴开合度聚类结果
在提取到眼睛、嘴巴特征以及计算出眼动速率的基础上,将眼睛开合度、嘴巴开合度、眼动速率三个判断指标作为输入变量经过设计的模糊控制系统来确定驾驶员的疲劳程度,其中眼动速率还没有统一标准,采用室内环境下均匀光照拍摄人清醒状态下的视频求取其1 800帧眼动速率平均值作为眼动速率标准值。根据司机产生疲劳驾驶现象和形成机制的先验知识制定规则,疲劳等级分为不疲劳、轻度疲劳、中度疲劳、重度疲劳。斯坦福睡意表表明,疲劳的产生是一个随时间渐变的过程,司机从亢奋到沉睡之间存在着注意力处于高水平但不在峰值以及虽反应时间较之前慢但可以对外界做出反应等能安全驾驶的状态,采用疲劳分级不仅能反映出这些状态,还能提醒司机潜在的驾驶风险,使检测更加灵敏,提高驾驶安全性,模糊控制过程见图10。
图10 模糊控制过程
根据第4节疲劳特征相关阈值的选取,眼睛状态的模糊集为{睁开,闭合},论域为[0,1],值得注意的是判断眼睛状态采用自适应阈值,不同阈值情况下,隶属度函数也会不同,此处取表1中志愿2的眼睛开合度数据,其隶属度函数为
(15)
嘴巴状态的模糊集为{张开,闭合},论域为[0,1],其隶属度函数为
(16)
眼动速率快慢的模糊集为{快,慢},论域为[0,4],其隶属度函数为
(17)
由模糊推理得到的模糊输出值为疲劳程度,其模糊集为{不疲劳,轻度疲劳,中度疲劳,重度疲劳},论域为[0,1],根据疲劳区间的划分,输出隶属度函数为
(18)
制定的模糊控制规则如表2所示。
表2 模糊控制规则
考虑检测的准确性和灵活性,选用的检测周期太短容易捕捉不到疲劳特征的变化过程,选用的检测周期太长会导致检测系统不够灵敏,取每50帧为一个检测周期,单位周期内占比最高的疲劳等级为当前周期的疲劳等级。
由于列车司机疲劳驾驶缺少公共的数据集,采用在室内环境下均匀光照自行拍摄视频。实验分四部分进行,第一部分分别检测司机正常状态和逐渐进入疲劳状态下的疲劳等级;第二部分是司机逐渐进入疲劳状态下对比本文方法与单一判断指标眼睛开合度以及眼动速率的疲劳等级;第三部分是司机逐渐进入疲劳状态下对比本文方法与PERCLOS法的检测结果;第四部分检测本文方法的准确性。
图11给出了驾驶员在正常状态下的检测结果,疲劳等级大多稳定分布在0.166~0.5之间,检测到的疲劳等级大多都是不疲劳或轻度疲劳,但由于驾驶员眨眼,导致在58~66帧、114~126帧、154~168帧以及203~215帧疲劳等级曲线出现峰值,275帧以后是因为驾驶员说话或大笑导致疲劳等级曲线出现波动,实验结果符合驾驶员实际状态,且能捕捉到驾驶员眨眼以及说话的行为。
图11 正常状态下检测结果
图12给出了驾驶员逐渐进入疲劳状态的检测结果,疲劳等级曲线在1~25帧时大多处在0.16~0.5之间,检测到的疲劳等级都为不疲劳或轻度疲劳,26~36帧疲劳等级曲线出现突变是由于眨眼所致,47~160帧疲劳等级的值在0.52~0.8之间波动,检测到的疲劳等级大多为中度疲劳或重度疲劳,表明驾驶员处于打瞌睡状态,168~204帧疲劳等级的值稳定在0.85左右,表明驾驶员处于重度疲劳状态,210~234帧眼睛短暂睁开后,疲劳曲线出现波动,之后驾驶员逐渐入睡,疲劳等级的值又稳定在0.85左右,表明驾驶员进入睡眠状态。实验结果符合驾驶员实际状态,且能正确实现不疲劳、轻度疲劳、中度疲劳以及重度疲劳这四个疲劳分级。
图12 逐渐进入疲劳状态的检测结果
图13中,考虑驾驶过程中驾驶员可能出现睁眼但可能很快又陷入疲劳的情况,如139~160帧时眼睛开合度的疲劳等级曲线降低到0.24左右,但实际上并未真正清醒,仅仅使用眼睛开合度来判断容易造成误判。而这段时间内眼动速率疲劳等级曲线在0.5~0.82之间,本文方法融合了眼动跟踪,结合眼动速率与眼睛开合度协同判断眼睛状态,本文方法的疲劳曲线的值在两者中间,起到了修正的作用。
图13 单一参数检测方法与本文方法检测结果对比
此外,可以看出本文方法与单一参数眼睛开合度以及眼动速率的疲劳等级曲线存在一定差异,这是由于驾驶员逐渐进入疲劳的状态变化过程中,嘴巴特征变化明显,仅仅用眼睛特征来检测疲劳不够准确。如0~24帧时驾驶员清醒状态嘴巴完全闭合,本文方法疲劳曲线的值较低,更能反映驾驶员不疲劳的状态。65~124帧是嘴巴开合度较大,本文方法疲劳曲线的值较高,判断出驾驶员处于中或重度疲劳状态,而用单一特征眼睛开合度与眼动跟踪方法仅考虑眼睛特征,在眼睛还未完全闭合时疲劳等级曲线较本文方法更低,显然不够准确。本文方法将多个判断指标相融合,使准确率得到提高。
两种方法的对比结果如表3所示,PERCLOS法由于本身限制只能识别疲劳与不疲劳,且两者的检测结果也有一定差异,本文方法将PERCLOS法、眼动跟踪的判断指标相融合,不仅仅实现了疲劳分级,在检测能力上也更强。
表3 逐渐进入疲劳状态检测结果对比
如表4所示,采集5名测试人员从清醒到疲劳反复的视频进行测试,分别统计出被测视频的准确率,漏检主要是由于头部偏转角度过大未识别出人脸,误检则主要是由疲劳特征变化较大时,人脸特征点定位不准确造成的,得到的平均准确率为95.04%。
表4 本文方法性能测试
实时性是疲劳检测的一个重要指标,根据人的视觉暂态理论分析,检测系统的处理速度在每秒20帧以上时能达到视频流效果,即50 ms/f及以上的处理速度可达到实时检测要求。
对采集的5段视频中每帧各个模块耗时进行统计,其中特征点定位还包括人眼及瞳孔定位,如表5所示,总耗时平均为36.6 ms。此外,基于K-means++法的人眼自适应阈值法是以疲劳周期进行聚类的,而何时找到自适应阈值也是根据人眼开合度聚类情况而定,并未统计在每帧耗时的模块里。但K-means++法本身运算速度极快,一个疲劳周期内的聚类时间只需不到1 ms,所以并不影响实时性。综上两部分,满足要求。
表5 各模块耗时测试结果
如表6所示,本文方法准确率较文献[17]和文献[19]更高,具有良好的性能。
表6 疲劳检测准确率对比
综上所述,通过模糊推理系统融合了眼动速率、眼睛开合度以及嘴巴开合度这三个判断指标,不仅修正了驾驶员短暂转醒但很快又陷入疲劳导致误判的情况,还解决了单一判断指标导致疲劳检测灵敏度不高的情况,准确率可达到95%。
本文引入眼动速率将其通过模糊推理系统与眼睛和嘴巴疲劳检测相关面部特征相融合,不仅在一定程度上修正了驾驶员短暂睁眼而非真正清醒造成误判的情况,还考虑了图像前后帧的相关性代替了传统方法仅使用单幅图像面部特征检测疲劳,提出了基于K-means++的人眼自适应阈值法,得到自适应阈值,解决了因不同司机面部特征差异而导致固定阈值无法适用于每位司机的问题。实验结果表明,本文方法检测准确率达到95%。
由于本文在室内均匀光照下进行检测的,下一步考虑减少光照条件对检测的影响以提高疲劳检测系统的鲁棒性。