(广东工业大学自动化学院 广东 广州 510000)
驾驶疲劳是造成交通事故的主要原因之一。有调查表明,疲劳驾驶引发的交通事故就占百分之四十。驾驶员需要长时间的保持高度的注意力,随时准备应付各种各样的突发情况,然而由于长期缺少锻炼,长时间的开车和作息不规律都导致司机的注意力和反应能力都严重下降。在交通领域中,如何对疲劳的检测和判断,从而减少交通事故的发生,是一直阻碍我国的成为交通强国的绊脚石。
疲劳驾驶是当今的热门话题之一,很多专家和学者就疲劳驾驶这个问题提出了许多方法的研究。主要分两大块:
第一:外部硬件受控表现,通过传感器获得外部小车驾驶过程中的参数(速度的变化,车辆间距的变化,道路线检测方法,车辆偏移量),但是其中有一些弊端难于避免。如车辆偏移量检测法来进行判断,当偏移阈值设定过小的时候,系统灵敏度过高,稍微的一点偏移都会导致小车的警报装置,容易引起驾驶员的不满;当偏移量设置过大的话,失去其效果,很难通过小车来判断驾驶员是否疲劳驾驶,等发生事故又后悔莫及。
第二,直接对驾驶人员进行生理特征的众多指标进行分析,通过心、脑、眼电图的数据变化来判断驾驶员是否疲劳,最后确认了一个最可靠的指标脑电波,采用的是外加无线式可穿戴脑电波检测装置。测量的结果也能够很精确的检测驾驶员的疲劳值,但是这些装载在驾驶员身上的设备,都容易对驾驶员的舒适程度造成影响。
本文是基于机器视觉非接触性技术对疲劳驾驶检测的研究,主要是对驾驶员面部眼睛的变化进行监控,通过眼睛的睁闭的超出阈值的次数来检测出驾驶员的疲劳值,超过设定范围将进行警报。
疲劳检测算法是基于机器视觉的技术来设计的,通过对驾驶员面部眼睛关键点的定位,通过眼睛来呈现他的精神状态是良好或者是疲劳做出判断。设计方案有如下几步:
1)获取视频流:打开笔记本摄像头,检测是否将驾驶员的图像传入;2)获取每帧的图像;3)通过AdaBoost的级联将人脸从图像中检测出来,没检测出人脸则继续第一步获取视频流图片;4)在检测的人脸中使用Dlib库来人脸68个关键点定位;5)提取眼睛关键点ROI分割;6)疲劳PERCLOS分析,若检测不是疲劳驾驶则回到第一步获取视频流;7)警报声和警告。
Haar特征能够快速人脸检测为ADaboost创建弱分类器,五类Haar特征中,对于一张N*N的灰度图片I,其Feature的计算公式为:
由白色区域像素和减去黑色区域像素和。
为了快速计算出弱分类Haar特征,可采取积分图来加速计算。Haar特征的计算所需要的数据是由从起点左上方到所处位置包含的区域像素和。计算公式为:∑x' 对于Haar特征的计算可以得到很大数量的特征集合,接下来是使用AdaBoost算法来进行弱分类器和特征权值的训练。AdaBoost算法的基本思想是通过Haar特征构建大量的弱分类器,然后根据样本空间中的正确分类和错误分类来调节分类器参数从而选择最优的弱分类器,最终级联多个弱分类器,给更好的分类器一个大点的权值,差的给一个小权值,从而整体将分类器构建成一个强分类器,最终可以实现人脸检测的结果。 Dlib库包含机器学习算法的C++开源工具库,可以通过这个库来快速实现复杂机器学习中的一些问题,支持深度学习算法的计算,可从图片检测出感兴趣的物体目标,其中包括目标姿态估计和正面人脸定位。Dlib提供了68位人脸关键点的定位,通过这68个点可以做到人脸的对齐等功能。人脸68关键点的标记如图1,由Dlib库可确定人眼的关键点,提取出37-48点,来进行疲劳检测操作。 图1 68位人脸关键点 在Dlib人脸分割定位68位关键点的结果中,重点关注眼睛部分的视觉特征参数。左眼处的关键点位为P37-P42,右眼处的关键点位为P43-P48,疲劳值的计算是以一定时间内眼睛的眨眼频率来判定。 已知,眼睛的睁开和闭合训练时,眼部竖直方向上的关键点会会随着眼睛的睁开到闭合,距离会逐渐变小,其距离可以通过特征点的坐标数值来动态计算。可以选上眼睑和下眼睑的之间的欧式距离为: (1) 上式(1)中的 为点a的x轴方向上的坐标;为点a的y轴方向上的坐标。 则左眼睑键点位置高宽比为眼睑竖直方向上的距离的均值除去眼睑的宽度,此算法的表达式为: (2) 式子(2)中Ratio(L_Eye)为左眼的高宽比。在实际测量中,眼睛闭合状态以Ratio(Eye)小于0.2的时候作为闭眼。 在WierwiIIe驾驶模拟器上的实验数据结果表明,一段时间内眼睛闭合的频率能够很好的反应出驾驶员的疲劳值。而美国国家公路交通安全管理局(NHTSA)和美国联邦公路管理局(FHWA)在实验中模拟疲劳驾驶驾驶,经过9种疲劳驾驶指标的比较。结果表明,这些方法都能够很好的表示疲劳驾驶的标准评判,其中PERCLOS与驾驶疲劳的相关性最好。 选取PERCLOS的标准为P80:指眼睑遮挡超过瞳孔的面积80%就计为眼睛闭合,统计在限制时间内眼睛闭合的时间所占的比列。 PERCLOS 的定义可知,其定义为单位时间(一般为30秒或者1分钟)。眼睛闭合比例(70%或者80%)所占的时间,实验证明,采用P80%能够得到更好的精确度,所以将超过80%的定为闭眼,同时门限设置为在一定时间内眼睛闭眼的时间比列超过40%,则就当作疲劳驾驶。 PERCLOS的计算公式如下: 也可以表达为: PERCLOS要实现该算法,需应用多线程工作的问题,因为运行程序的同时需要打开一个定时器,达到定时的功能。 本方案的实现流程:1)首先打开一个定时(默认30s)将图片的人眼检测状态送入PERCLOS保存;2)当未检测到人脸的时候,用上一帧的状态值代替此帧的;3)如果连续2s都没检测到人眼的状态,则发出无法定位的警告,提醒驾驶员摆正其脑袋,这段时间PERCLOS不变;4)当定时器达到30s,计算当前的PERCLOS,若大于40%,则发出警报声,通知驾驶员疲劳驾驶注意休息,若小于40%则复位定时器重新进入下一次定时。 实验程序采用了python,Opencv4.1.1和Dlib 19.19.0框架进行编程,操作系统为windows,CPU为 Intel(R)Core(TM)i5-8300H CPU @ 2.30GHz处理器,内存8G。测试视频分辨率800 x 460。 如图2结果表明:(1)正常状态下通过AdaBoost算法定位到脸(2)再根据Dlib库的68位关键点可以定位到眼睛,如图所示的绿色眼眶;(3)再在根据PERCLOS算法可以检测出驾驶员疲劳驾驶,则发出警告并且伴有警报声。 图2 不同姿态下的检测结果 本文提出了一个基于人脸68位关键点定位人眼的疲劳驾驶检测方法。通过人眼的关键点定位,再应用PERCLOS算法来确定驾驶员是否处在疲劳驾驶的情况,从而大大减少交通事故的发生,该检测方法可以以不同姿态,如脸偏转一定角度或者有无佩戴眼镜都可以检测出驾驶员的精神状态。四、基于人脸关键点的眼部状态检测
(一)人脸的68位关键点提取
(二)关键区域的参数计算
五、疲劳检测的疲劳值判定方法
(一)度量疲劳的标准PERCLOS算法
(二)PERCLOS的实现流程
六、实验
(一)实验环境
(二)试验验证和结果分析
七、结语