陈瑜 李锦涛 徐军莉
摘 要:疲劳驾驶是导致交通事故的重要原因之一。为检测识别驾驶员疲劳状态,根据人的眼动行为存在随机性及模糊性特点,采用不确定性的云模型对眼动特征进行数据处理,构建二维多规则推理生成器检测驾驶员疲劳状况,以此疲劳检测模型为基础构建基于安卓的疲劳预警系统。系统通过手机摄像头实时采集驾驶员面部数据,通过人脸人眼定位后,计算出per-clos和眨眼时间均值。将数据输入疲劳检测模块,一旦检测到驾驶员疲劳,系统即进行文字和语音提醒。该系统成本较低,实时性较好,在模拟驾驶环境下检测率可达到73.98%。
关键词:眼动特征;疲劳驾驶;预警系统;定性推理器;云模型
DOI:10. 11907/rjdk. 191848 开放科学(资源服务)标识码(OSID):
中图分类号:TP319文献标识码:A 文章编号:1672-7800(2020)005-0116-04
0 引言
2017年底,我國民用汽车保有量达到21 473万辆,比上年增长了11.8%,全国高速公路通车里程达到13.6万km。随着公路建设和车辆的增加,交通事故也呈现不断上升趋势[1]。据统计,在高速公路发生的重特大交通事故中,因疲劳驾驶造成的事故所占比例达40%以上[2]。由于疲劳驾驶引发的交通事故往往是在驾驶人毫无预见、且未采取主动避险措施的情况下发生的,经常导致车毁人亡,后果十分惨重。因此,实时检测驾驶员是否处于疲劳驾驶状态,并在出现疲劳状态时给出有效预警有着十分重要的现实意义。
目前,疲劳检测预警系统研究较多[3-9]:张志文等基于perclos人眼疲劳判定算法设计一个嵌入式疲劳预警系统;李建平等以驾驶员人眼图像为处理对象,建立了离散单位时间内非正常状态时间所占百分比的疲劳判断模型,实现对驾驶员疲劳状态预警;李超等基于ADS1299脑波芯片,结合应用层对数据进行处理得到频域数据,得出人脑疲劳程度特征的脑电波信号能量级,从而进行疲劳驾驶预警。疲劳检测方法有基于驾驶行为的疲劳检测和基于人体生理信号的疲劳检测。其中基于驾驶人眼动特征的非接触式检测方法[10-14]逐渐被广泛采用,如刘志强等以perclos眼睛焦点的位置等眼部特征为参数,采用支持向量机的疲劳检测模型;旷文腾等采用眼白面积和perclos作为疲劳特征指标。但由于人的眼动行为本质上存在随机性和模糊性,导致无法对眼部行为指标数据进行准确描述。因此,本文在将眼部行为作为疲劳检测指标时,采用不确定性的云模型对眼动特征进行数据处理,构建二维多规则推理生成器对驾驶员进行疲劳检测。该推理生成器在模拟驾驶器上进行检测,平均识别率可以达到73.98%[15]。本文以此推理生成器为基础构建包括数据采集模块、特征提取模块、疲劳检测模块和疲劳预警模块的基于安卓的疲劳预警系统。
1 基于眼动特征的驾驶员疲劳预警系统
1.1 疲劳预警系统模块设计
基于眼动特征的驾驶员疲劳预警系统模块结构如图1所示。
系统首先通过手机摄像头拍摄驾驶员的面部图像,然后采用AdaBoost算法进行人脸检测,对人眼进行粗率和精确定位,随后计算眼睑闭合时间百分比 (percentage of eyelid closure time,per-clos)和眨眼时间均值两个眼动特征参数,将计算出的眼动特征数据输入到疲劳检测模块进行疲劳分类识别。如果检测结果为疲劳,则通过疲劳报警模块进行文字和语音报警,如图1所示。
1.1.1 特征提取模块
在该模块中主要进行人脸检测、人眼定位和眼动参数计算。
(1)人脸检测。本文采用AdaBoost算法[16]进行人脸检测。目前常用的AdaBoost算法有Discrete Adaboost算法、Real Adaboost算法和Gentel Adaboost算法,它们的原理是相同的,都是基于弱分类器融合思想,主要对同一个训练数据集先训练出不同的弱分类器。在训练样本时,每次在进入下一轮分类器训练之前权值都会自动调整。在训练中,若样本被准确分类,那么它在下一次训练过程中就会被降低权值。而未被正确分类的样本在下次选取训练样本时,此样本的权值将被加重。有研究表明[17],在人脸检测上,Gentel Adaboost算法的效果优于其它两类算法。因此,本文采用Gentel Adaboost算法进行人脸检测。
(2)人眼定位。人脸检测完成后需要进行人眼定位。人眼定位分为粗定位和精确定位。粗定位主要是根据人脸的“三庭五眼”特征定位。按垂直方向将人脸划分为“上庭”、“中庭”和“下庭”3个部分;按水平方向将人脸划分为5个部分,称为“五眼”。本系统只对左眼处理。为了更精确获取人眼区域,在“三庭五眼”特征上将人脸进一步划分,在垂直方向上将“中庭”再等分为3部分,如图2所示。
这样可以粗略定位到人眼,但定位的人眼中还有眉毛或眼框,因此需要对人眼再次进行精确定位,此处仍采用 Adaboost 算法。
(3)眼动特征计算。 在精确定位到人眼后,就可计算眼动疲劳特征参数。本文采用per-clos和眨眼时间作为眼动特征参数。per-clos是眼睛在单位时间内闭合的百分比[18]。常用的per-clos 标准有EM、P70 和 P80。EM 指当瞳孔面积的 50%被眼睑遮挡就认定眼睛是闭合状态;P70 指当瞳孔面积的 70%被眼睑遮挡就认定眼睛是闭合状态;P80 指当瞳孔面积的 80%被眼睑遮挡就认定眼睛是闭合状态。相关研究表明[19],在这3种 per-clos 标准中,P80 标准能更好地体现疲劳状态,因此本文采用P80。计算公式为[20]:
1.1.2 疲劳检测模块
该模块的主要任务是建立疲劳分类模型。在虚拟实验环境下采集驾驶员疲劳和清醒状态下的相关眼动数据,然后计算出对应的眼睛闭合时间比per-clos和眨眼时间均值,构建基于Per-clos 和眨眼时间均值的二维多规则定性推理生成器,然后以该生成器作为疲劳分类模型。定性推理生成器如图3所示。
如图3所示,将一组输入值(per-clos, 眨眼时间均值)输入生成器,生成器输出期望值的平均值Ex,如果Ex值大于1.5,则判断这组输入值为疲劳状态,否则为清醒状态。该定性推理生成器在模拟驾驶环境下的平均识别率可达到73.98%。
1.1.3 疲劳报警模块
当疲劳检测模块输出结果为疲劳状态时,系统将调用疲劳报警模块,该模块同时向系统使用者显示文字提醒和语音提醒。
1.2 疲劳预警系统界面设计
疲劳预警系统界面如图4所示,主要包括人脸检测区、操作按钮区、实时显示眼动特征数据区和检测结果区。用户单击“开始检测”按钮,摄像头就开始进行拍摄,并进行人脸人眼实时定位,同时在界面右上角显示计算的perclos和眨眼时间均值数据。每隔5分钟就在右下角更新检测结果。
2 系统实现
本系统以Android 为开发平台,使用 Android Studio 开发工具,以 Java\C\C++作为开发语言,利用开源的计算机视觉函数库 OpenCV 进行开发。各模块功能如下:
(1)图像采集模块实现。OpenCV 提供了一个抽象类 CameraBridgeViewBase与 Android 的Camera连接,其中 JavaCameraView 类对 CameraBridgeViewBase 抽象类进行实现,此处通过 JavaCameraView 类设置和修改摄像头默认参数。Opencv 上有两个监听器CvCameraViewListener2 和 CvCameraViewListener,在摄像头输入流启动、每帧图像采集和停止时,这两个监听器都提供相应的回调方法。本文在 Android 应用程序中继承CvCameraViewListener监听器,并将相应的回调方法重写,对图像进行处理。
(2)人脸检测模块实现。把摄像头获取到的图像用 JNI的方法传给底层 C/C++处理。底层通过使用 OpenCV 的分类器 CascadeClassifier 对人脸进行检测,然后在Java層创建DetectionBasedTracker类,通过该类的nativeDetect()方法将图像地址传给 C/C++层。在进行人脸检测前,先把训练好的分类器haarcascade_frontalface_alt_tree 文件和人脸最小值传给 C/C++层。
(3)人眼定位模块实现。人眼定位包括粗定位和精确定位,粗定位主要是排除人脸外部干扰信息,只处理人眼区域,根据人脸”三庭五眼”这一特征获取人眼粗略的区域。眼睛的精确定位与人脸检测一样使用Adaboost 算法,具体过程为:获取人眼粗略的左眼区域;读取人眼检测分类器文件 haarcascade_eye_tree_eyeglasses;创建一个人眼检测分类器 CascadeClassifier 类和存储人眼信息eyes;调用detectMuiliScale()方法进行人眼检测。
(4)疲劳判定模块。建立基于per-clos和眨眼时间均值的二维云模型,根据这2个眼动参数的云模型特征构建定性规则。依据二维单规则生成器,构造二维多规则定性推理生成器。
(5)疲劳报警模块。疲劳报警模块将文字显示在系统界面右下角并给出语音提醒。在Android 开发中MediaPlayer 类和 SoundPool 类都可以实现音频播放,但由于MediaPlayer 播放音频文件时会出现延迟时间长、不支持实时播放多个音频和资源占用量相对较高等缺点,因此本文采用 SoundPool类实现语音播放。文字信息的提醒通过 OpenCV 图像处理库中 Core 类实现。系统通过图像处理库 OpenCV的Core类中的putText()方法实现文字显示。
3 结语
在我国机动车保有量不断提高的情况下,每年因疲劳发生的事故越来越多。因此,在行车过程中加强疲劳预警有着非常重要的现实意义。目前,疲劳驾驶预警领域取得了一定的研究成果,但基于车载的低成本疲劳驾驶检测系统还不是很多,为此本文提出一款基于眼动特征的疲劳检测系统APP。该系统鉴于人的眼动行为存在随机性及模糊性特点,采用云模型理论生成定性推理生成器作为疲劳分类模型,在一定程度上提高了疲劳检测的准确性。本系统采集数据方便,成本较低,实时性较好。但由于在疲劳检测模型中采用的训练样本数目较少,疲劳检测模型的检测率还有待提高,后续研究将增加训练样本数,提高疲劳检测准确率。
参考文献:
[1] 张琪,刘玉麒. 我国民用汽车保有量突破二千万辆[J]. 中国统计,2003(8):1-2.
[2] 蒋新明,邢贵. 疲劳驾驶与行车安全[J]. 现代农机,2007(3):39-39.
[3] 张志文,张沛晨. 基于人眼运动检测的疲劳预警系统研究[J]. 电子设计工程, 2015(6):172-175.
[4] 郭慧利,王恁, 郭浩. 基于面部多特征的疲劳驾驶预警系统的研究[J]. 通信学报, 2018, 39(S1):28-35.
[5] 李建平, 牛燕雄, 杨露,等. 基于人眼状态信息的非接触式疲劳驾驶监测与预警系统[J]. 激光与光电子学进展, 2015, 52(4):83-88.
[6] 蔡馥鸿, 张正华, 刘金龙,等. 基于TGAM脑波模块的疲劳驾驶预警系统设计[J]. 信息化研究, 2016(4):76-78.
[7] 李照, 舒志兵. 基于DSP的驾驶员疲劳实时预警系统设计[J]. 控制工程, 2019, 26(1):94-100.
[8] 李超, 石向荣, 黄剑华. 基于脑电信号处理的疲劳驾驶预警系统的设计与实现[J]. 科学技术创新, 2018(2):75-76.
[9] FORSMAN P M, VILA B J, SHORT R A, et al. Efficient driver drowsiness detection at moderate levels of drowsiness[J]. Accid Anal Prev, 2013, 50(1):341-350.
[10] 刘志强,宋雪松,汪彭,等. 基于眼部特征的疲劳驾驶辨识方法研究[J]. 重庆理工大学学报(自然科学), 2016, 30(10):11-15.
[11] 旷文腾,毛宽诚,黄家才,等. 基于高斯眼白模型的疲劳驾驶检测[J]. 中国图象图形学报,2018, 21(11):1515-1522.
[12] 蒋建国,王雷,齐美彬,等. 基于眼睛状态检测的驾驶员疲劳驾驶分析[J]. 合肥工业大学学报(自然科学版),2015(2):175-180.
[13] MANDAL B,LI L,WANG G S,et al. Towards detection of bus driver fatigue based on robust visual analysis of eye state[J]. IEEE Transactions on Intelligent Transportation Systems, 2016(6):1-13.
[14] ZHANG F, SU J, GENG L, et al. Driver fatigue detection based on eye state recognition[C]. 2017 International Conference on Machine Vision and Information Technology (CMVIT). IEEE, 2017.
[15] 徐军莉, 闵建亮, 胡剑锋,等. 定性推理生成器在驾驶疲劳检测中的应用[J]. 汽车安全与节能学报, 2018,9(1):32-40.
[16] 王琳琳, 聶财香. 基于AdaBoost算法和Cascade算法的人脸检测系统的实现[J]. 电子制作, 2013(11):66-67.
[17] 蔡灿辉, 朱建清. 采用Gentle AdaBoost和嵌套级联结构的实时人脸检测[J]. 信号处理, 2013, 29(8):123-128.
[18] 巩晓倩, 蒲亦非, 杨智勇,等. 基于有限状态自动机的人眼开度PERCLOS实现算法[J]. 计算机应用研究,2014,31(1):307-310.
[19] 董占勋, 孙守迁, 吴群. 心率变异性与驾驶疲劳相关性研究[J]. 浙江大学学报:工学版,2010,44(1):46-50.
(责任编辑:杜能钢)