基于模糊综合评价的疲劳驾驶检测算法研究*
2019-10-24潘志庚刘荣飞张明敏
潘志庚,刘荣飞,张明敏
1(杭州师范大学 数字媒体与人机交互研究中心,浙江 杭州 311121)
2(浙江大学 计算机科学与技术学院,浙江 杭州 310007)
随着我国经济的快速发展,汽车已成为主要的交通工具,疲劳驾驶已成为引发交通事故的主要原因之一.因此,研究疲劳驾驶检测系统,实现对驾驶员疲劳状态的监控具有重要意义.在各种疲劳检测方法中,主要有基于传感设备的接触式检测,如对驾驶员的脑电图、心电图等生理信号进行检测[1]和基于模式识别、图像处理的非接触式检测[2].目前,国外在这方面的研究主要偏向第1 种方法,利用各种传感器采集驾驶员的生理数据进行疲劳检测,例如美国研制的方向盘监视装置S.A.M[3],通过安装的传感器检测方向盘的异常来判断驾驶员疲劳情况,欧洲研发的AWAKE 驾驶诊断系统[4],利用CCD 传感器和力学传感器获取的信号以判断驾驶员是否疲劳.
由于第2 种方法具有非侵入性、比较自然、实时的特点,已成为驾驶员疲劳检测领域的研究热点.在各种检测机制中,基于人眼特征信息的研究是目前应用最广泛的.Yang 提出了基于结构光传感器应用于眼睛瞳孔位置的检测[5];Chang 使用haar 特征和极限学习机算法对驾驶员的人眼进行检测与追踪[6];Zhang 等人使用Boost-LBP 特征和SVM 对疲劳面部表情学习与分析[7].在人眼定位研究中,文献[8]使用图像相减法,利用人眼视网膜对850nm 波长红外线与940nm 的红外线反射率存在差异(前者90%,后者40%)这一特征进行图像差分即可得到大致的眼睛区域,但这一方法对相机要求较高.因此,又有人使用微软的深度相机Kinect 对眼睛状态进行分析[9].鄢黎明等人设计了基于DSP 的微处理器技术以实现对人眼进行检测和跟踪[10],也有采用基于主动形状模型(ASM)算法对人眼区域粗定位,再引入平均合成精确滤波器(ASEF)算法与ASM 算法相结合的思路提高对眼睛区域的定位精度[11].近年来,随着深度学习的火热,唐杰等人使用CNN 对人脸关键点进行检测[12],并采用OSTU 最大类间差法[13]分割人眼,虽然达到一定效果,但此类方法容易受到眉毛和头发的干扰,对图像质量要求高且系统开销大.在对驾驶员疲劳检测中,通常都是根据驾驶员眼睛闭合频率与疲劳的相关性关系进行研究[14],即使用美国公路安全局(NHTSA)唯一认证的PERCLOS 原理[15]识别疲劳.因此,如何准确地判别出人眼的睁闭状态是这类疲劳检测的重点和难点,也直接决定了最终的检测结果的准确性.
综上所述,现有的基于计算机视觉的疲劳检测机制中通常都是在对人眼精确定位后利用眼睛单一特征进行分析,判定出人眼状态.该类算法易受外界环境干扰,如光线、眼镜等因素,误判率高,具有一定的局限性.本文提出一种基于模糊综合评价算法,对人眼区域矩形长宽比、拟合椭圆面积、眼睛瞳孔区域黑色素所占比例这3个评价因素进行综合分析,检测出眼睛的睁开闭合状态,再根据PERCLOS 原理,统计人眼每秒的闭合频率,判别出驾驶员是否处于疲劳状态并发出警报.相比于传统方法,本文提出的算法不仅仅只局限于人眼某一特征信息,而是对多个人眼信息进行综合分析,对人眼状态的检测可靠性高,具有较高的实用性和鲁棒性.
1 疲劳检测算法设计
疲劳检测算法设计流程如图1 所示.
Fig.1 Fatigue detection algorithm flow chart图1 疲劳检测算法流程图
本文从视觉角度出发,在驾驶员处于非常自然的状态下(不需要佩戴任何传感设备)进行非接触式疲劳检测.首先采用机器学习方法Adaboost 分类器检测人脸[16],然后对图像进行一系列预处理,分割跟踪人眼并利用积分投影值消除眉毛干扰区域.再根据模糊综合评价法判别出眼睛的睁闭状态,最后利用PERCOLS 算法原理对驾驶员的闭眼频率进行统计,从而实现疲劳检测功能.
2 人脸检测与人眼定位
2.1 基于Adaboost的人脸检测
人脸检测目前比较常用的方法有基于深度神经网络的学习方法,还有一些是基于传统的肤色分割、模板匹配、概率统计、马尔可夫随机域等方法[17].考虑到实时性和系统开销,本文使用了级联分类器Adaboost 算法,Adaboost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).检测过程中,通过计算Haar 特征(Haar-like features)并和Adaboost 结合,大大提高了检测的速度和精确率.图2 所示为通过上面的方法在白天正常光线和夜晚红外光线下的人脸检测结果.
Fig.2 Face detection effect image图2 人脸检测效果图
2.2 人眼粗定位与预处理
在人脸检测的基础上,根据人脸的先验知识“三庭五眼”分布特征[18]分割出大致的人眼区域,再根据对称性分别得到包含左右眼睛的图像子窗口.由于光照对图像处理产生很大的影响,对后面的检测算法带来很大的干扰,所以前面需要对图像做一些预处理工作,以降低噪声的干扰.首先,对输入的图像进行平滑滤波和非线性点运算,作图像增强处理,其次,把图像作灰度化处理并进行直方图均衡,从而使图像像素在每个灰度级上的分布相对均匀,降低了光照对图像处理结果的影响.最后,采用Ostu 最大类间方差法,找到最优阈值,实现图像二值化操作.考虑到各种复杂情况,特别是对于夜晚红外图像,效果并不是很理想,因此,在程序中又设置了一个常数CONST 作为阈值分割补偿.最终,根据实验效果取CONST=50,图3 为人眼粗定位和预处理后的左右眼效果图.
Fig.3 Pre-processing effect map图3 预处理后效果图
2.3 消除眉毛
本文最后是根据一段时间内眼睛闭合持续时间所占百分比,即PERCOLS 算法来对疲劳进行检测,因此,对人眼能否准确地定位,直接影响了最后的疲劳状态的判断结果.从图3 可以看到,粗定位后的左右眼区域明显还存在眉毛部分,如果不去除眉毛,就会对后面的眼睛睁闭状态判断产生干扰,造成误判,因此,要在实验前消除眉毛区域.本文采用的方法是对上述处理得到的包含眉毛的二值化图像进行垂直积分投影,然后以2 行像素的和为单位依次进行遍历比较,找到最小单位值,再以该单位为搜索起点找到第1 个极大值点作为眼睛眉毛的分割点,即图4(a)所示箭头位置.去除分割点以上部分就剔除了眉毛区域,从而可以精确地定位到人眼,去除眉毛后的左右眼效果图如图4(b)所示.
Fig.4 图4
3 眼睛状态的检测算法设计及实现
3.1 眼睛状态的检测算法流程
由上述操作可以精确地定位到只包含人眼区域的二值图像,这样就能够很方便地对眼睛信息进行分析,然后对驾驶员的眼睛状态做出判别.实验过程中,将眼睛分为3 种状态,分别为睁开状态、闭合状态、半闭半睁状态.使用基于模糊数学里的模糊综合评价方法,对判断眼睛睁闭的评价因子进行分析,最终判断出眼睛的睁闭状态.其中,当眼睛处于半闭半睁状态时,分别计算出睁开评价值和闭合评价值进行比较,以剔除这种模棱两可的情况.判断流程图如图5 所示.
Fig.5 Flow chart of eye state judgment图5 眼睛状态判断流程图
3.2 评判眼睛状态的影响因子
通过前面的步骤获得了眼睛的精准位置,并分别提取出了左右两只眼睛的图像子窗口.接着便是对包含单只(左右)眼睛的图像窗口进行睁眼及闭眼的判断.在实验过程中,根据人眼睁闭时的一些特征变化,本文对眼睛状态的判断划分出以下3 个影响因子.
(1)人眼矩形长宽比R.根据Ostu 最大类间差法,得到了只包含人眼的二值图像,然后分别对人眼灰度图和二值图利用sobel 算子在整体方向进行边缘检测,得到了眼睛轮廓图像.考虑到实际应用中光照和抖动的影响,使用形态学开运算消除边缘周围干扰噪声点,使检测到的边缘连续.最后再根据轮廓数据计算出眼睛的外接矩形的宽度与高度,计算出长宽比如图6 所示.
Fig.6 Edge detection results and eye aspect ratio R=H/W,where R∈(0,+∞)图6 边缘检测结果及眼睛长宽比其中,R∈(0,+∞)
(2)拟合椭圆的面积S.观察发现,眼睛的轮廓区域接近一个椭圆形状,因此利用最小二乘法进行椭圆的曲线拟合操作,拟合结果如图7 所示.最小二乘法的主要任务就是寻找一组有效参数,从而使数据点与椭圆之间的距离度量最小化.在二维平面直角坐标系中,椭圆的一般方程如式(1)所示.
Fig.7 Ellipse fitting result图7 椭圆拟合结果
由于检测到边缘上的离散点不可能完全吻合,落在椭圆上,根据最小二乘法原理,将椭圆拟合的最优问题转换为代数距离平方和最小化问题,即求平方和L的最小值,见公式(2).再由二元函数极值原理可得公式(3),由此得到一个线性方程组,利用消元法并结合约束条件可求得方程系数A,B,C,D,E,F的值,从而得到了椭圆方程.
小李暗笑了几声,丁主任接住话:我的确有,而且营业部所有人里,就我和张大爷才有这仓库和大门的钥匙,所以我和张大爷好像给大家添麻烦了。
然后再根据椭圆的几何关系式(4)、关系式(5)便可得到椭圆的长短轴,单位像素为(px),最后由椭圆的面积公式(6)即可求得拟合椭圆的面积S.
实验中,取φ=2e-3,π=3.1416.
(3)眼睛矩形区域瞳孔黑色素点占总像素比例Φ.在眼睛睁开和闭合时,瞳孔的大小存在差异,所占比例也存在明显的变化,如图8 所示.对只包含左右两只眼睛的二值图像分别计算出该图像直方图在水平和垂直方向的投影,然后以垂直方向的投影结果在矩形宽度上进行遍历求和,统计出矩形区域黑色像素总个数,从而可以计算出眼睛矩形区域黑色素点所占的比例Φ.
Fig.8 Changes of pupil melanin in different states of the human eye图8 人眼在不同状态下瞳孔黑色素变化
3.3 人眼状态检测
模糊综合评价法是一种基于模糊数学里的综合评价方法.本文利用模糊综合评价算法对人眼矩形区域长宽比R、拟合椭圆的面积S、人眼瞳孔黑色素所占比例Φ这3 个评价因子进行分析.根据大量测试,我们将这3个评价因素各自的取值区间划分了相同的4 个级别,并赋予不同的权值,见表1.然后组合成一个综合评价函数,计算该函数值与设置的闭眼阈值进行比较,当综合评价值大于阈值时,可以认为眼睛处于睁开状态,否则,认为眼睛处于闭合状态.
Table 1 Fuzzy comprehensive evaluation table表1 模糊综合评价表
实验中,为了给各个评价因子分配最优的权重,在控制测试样本和运行环境不变的情况下进行单因素统计对比实验,从而找出各自最优的权重,如图9 所示,最佳闭眼阈值也是同理得到.
Fig.9 The relationship between the weight of each evaluation factor and the discriminant accuracy图9 各评价因素权值与判别准确度的关系
4 PERCLOS 疲劳驾驶检测
当人出现疲劳状态时,眼睛从睁开到闭合再到睁开这个过程需要消耗较长的时间,经过大量实验,结果表明,疲劳程度与眼睛闭合时间长短有着密切关系,闭合时间越长,其疲劳的程度越严重[19].PERCLOS 方法是对一定时间内人眼闭合时间占总时间的比例进行测量,相对于其他方法,PERCLOS 更能直观、准确地反映出驾驶员的疲劳程度,是目前公认的判定疲劳的最优方法.被美国公路安全局(NHTSA)推荐为车载的、非接触式的、实时的疲劳程度检测方法[20].通常,PERCLOS 常用标准有以下3 种.
P70,表示眼皮盖过瞳孔面积超过70%所占的时间比例.
P80,表示眼皮盖过瞳孔面积超过80%所占的时间比例.
EM,表示眼皮盖过瞳孔面积超过一半所占的时间比例.
其中,P80 是被公认的最能反映人的疲劳程度的指标,这也正与本文前面提出的眼睛睁闭状态的检测相一致.PERCLOS 值的计算公式如式(7)所示.
在实际实验过程中,系统处理每一帧图像大概消耗时间是33ms,即系统处理图像的速度为30fps.因此,我们只需知道每秒时间内眼睛的闭合频率f(close),就可以计算出每秒的PERCLOS 值,见公式(8).接着就可以计算出一段测试周期时间内的PERCLOS 值,计算公式见式(9),T表示一个计时周期的时间,取T=30s,当PERCLOS>0.2时,则认为驾驶员处于疲劳状态,发出报警.
5 实验结果与分析
本文的实验环境为一般的实验室环境,使用Visual Studio 2015 作为开发工具,opencv3.0 和C++开发语言进行.首先从摄像头捕获到的视频序列图像中利用Adaboost 分类器进行人脸检测,然后对检测到的人脸区域进行预处理,分割人眼并消除眉毛干扰,再使用模糊综合评价方法对眼睛矩形区域长宽比、拟合椭圆面积、瞳孔黑色素所占比例这3 个评价因子进行分析,对眼睛睁闭状态做出准确判断,最后根据PERCLOS 算法原理,统计出每个检测周期内驾驶员的闭眼频率,从而判断驾驶员是否处于疲劳驾驶状态.图10 所示为最后的疲劳检测结果图,图10(a)所示为夜晚在红外光线下的检测结果,图10(b)所示为白天正常光线下的检测结果.
Fig.10 Fatigue test result image图10 疲劳检测结果图
为了验证本文提出的基于模糊综合评价的疲劳驾驶检测算法的准确性和鲁棒性,本文分别从眼睛状态判别和疲劳程度检测两个方面进行实验以验证该算法.同时,本文又对该算法的各个模块的运行时间进行了统计,对算法的实时性进行了分析.
实验1:直接模拟驾驶环境采集几组测试视频进行实验,对本文检测人眼睁闭状态算法进行准确性测试,测试结果见表2,眼睛状态的判断准确率最高可达97%,但是由于采集的视频序列中存在测试者头部姿势过度偏移的情况,离开了相机捕获区域,造成了误判和漏测情况.另外,为了验证该算法的鲁棒性,我们又采样了800 帧不同环境下的驾驶员测试图集,分白天戴眼镜、白天不戴眼镜、夜晚戴眼镜、夜晚不戴眼镜4 种情况,测试结果见表3.同时,在此测试集的基础上,又分别与文献[12]及文献[14]中的只利用单因素的方法进行了对比,比较结果见表4,可以看出,本文提出的多因子综合评价方法具有一定的优势.从表2~表4 的测试结果来看,本文提出的算法对判别眼睛的睁闭状态具有较高的准确性和鲁棒性.
Table 2 Accuracy test of fuzzy comprehensive evaluation algorithm表2 模糊综合评价算法准确性测试
Table 3 Robustness evaluation of fuzzy comprehensive evaluation algorithm表3 模糊综合评价算法鲁棒性测试
Table 4 Comparison of eye state detection rate (%)表4 眼睛状态检测率对比(%)
实验2:选取实验室的4 名测试人员对正常和疲劳的驾驶状态进行模拟,分别统计出4 名测试人员在检测周期内的闭眼频率,图11 所示为4 名测试人员分别在一个周期内的闭眼频率变化图.从图中可以看出,B,C 的闭眼频率趋于稳定,为正常的眨眼过程,而A,D 的闭眼频率较高,处于长时间闭眼状态.最后,再根据上面的公式(6),计算出每名测试人员的PERCLOS值,检测出每名测试人员的疲劳状态并与实际模拟状态相比加以验证,其中,A,D的PERCLOS值大于0.2,可判定为疲劳状态,B,C 的PERCLOS值较小,且小于0.2,可判定为正常状态,检测结果见表5.结果表明,检测结果与实际模拟结果是相一致的.
Fig.11 Statistics on the frequency of eye closure in one cycle of 4 testers图11 4 名测试人员在一个周期内的闭眼频率统计
Table 5 Fatigue driving test table表5 疲劳驾驶检测示意表
实验3:实时性是疲劳驾驶检测的一个十分重要的性能指标,只有做到实时跟踪检测驾驶员的状态,才能及时避免因疲劳导致的交通事故的发生.在OpenCV 中,通过调用getTickCount 函数对本文算法各个模块的运行时间进行统计,分别测试了5 段视频,对各个模块所消耗的时间进行分析,见表6.其中,疲劳检测部分是基于连续时间段进行的,这里选取其均值作为参考.从表中可以看出,耗时最长的是眼睛状态分析模块,大约需要11ms,而处理一帧图像总的运行时间在33ms 左右,足以满足对疲劳的实时监控.
Table 6 Algorithm time consumption analysis table表6 算法各模块消耗时间分析表
6 结 论
在实验过程中,本文对图像进行了预处理操作,减少了冗余数据干扰,提高了运行效率.从人眼定位结果来看,我们使用积分投影成功地消除了由于眉毛所带来的干扰,有效地将眼睛从人脸区域分离出来,之后又采用模糊综合评价算法对眼睛的睁闭状态进行分析,并做出准确判断,提高了PERCLOS 计算的准确性与可靠性.本文基于机器视觉方法,对连续帧图像(video)进行处理,避免了与驾驶员的身体直接接触,更加趋于自然化,具有较高的实用性.而且每秒能处理30 帧图像,满足了系统的实时性要求,适用于各种驾驶情况下对驾驶员状态的监督与检测.
同时也可以看到,本文提出的算法面临着一个不可回避的问题,由于只使用了单一的眼睛状态特性作为疲劳的判断依据,当驾驶员配戴墨镜时,人眼的信息就完全捕获不到,此时算法就完全失效了.目前,我们正考虑将打哈欠、脑电信号和头部姿势等因素考虑进来,进行多疲劳特征综合判别.在基于机器视觉的疲劳驾驶检测方面,还有很长的路要走,还需要更多的优良算法来解决实际工程问题.