闫保中,王晨宇,王帅帅
哈尔滨工程大学 自动化学院,黑龙江 哈尔滨 150001
疲劳驾驶造成的影响是恶劣的,因此通过研究一种实时精准的疲劳驾驶预警系统,以便及时对驾驶员预警使其重新获得对车辆的控制权,这对社会安全具有重大的意义。当今疲劳检测方式主要分为基于生理指标、操作行为、车辆状态和视觉特征这4种方式[1]。其中最后一种方式利用人体可视化特征在清醒状态下和疲劳状态下的不同表现来检测疲劳,并且无须穿戴任何设备,有着很好的研究空间[2]。所以该方法变成疲劳驾驶检测领域的研究重点。
目前,国内外技术学者针对视觉特征已经开展了更深入的研究。张长隆[3]使用多传感器采集眼部、嘴部以及方向盘特征,使用Fisher线性判别分类来检测疲劳。而Devi[4]在提取眼部和嘴部信息后,采用了模糊逻辑算法来确定疲劳程度。柳龙飞[5]使用基于梯度提高学习的回归树(ensemble of regression trees, ERT)定位人脸特征点后判断驾驶员是否疲劳。
但是在实际应用中基于视觉特征的方法还需进一步完善,因为这些方法在准确性和实时性2个方面无法做到很好的平衡。有的方法注重准确性,但是忽略了实时性要求;有的方法能够做到快速检测,但是又面临精度较差的问题。本文针对上述问题,通过改进人脸特征点定位算法提升运算速度,利用多特征检测来提高运算精度。并且通过求解驾驶员视线方向辨别注意力是否分散,以便在驾驶员陷入深度疲劳前就对其预警,更加保证安全性。
本文在驾驶员面前架设摄像头得到人脸图像,为验证训练与测试结果的真实性,自建一个小型数据集。其中共有驾驶员8位,每个人在清醒的时候收集10 min视频,在疲劳的时候收集5 min视频。它的采样帧率是15 f/s,大小是640×480像素。除此之外,本文还使用了如下公开的数据集:人脸姿态数据集CAS-PEAL的POSE组[6],该组数据集包含1 042个人的21种不同角度的人脸姿态图像,用于后续人脸朝向估计算法。人脸特征点数据集helen和lfpw集,包含3 721幅人脸图像及其特征点位置。
系统运行的第一步是对图像进行预处理。首先在RGB颜色空间使用2g-r-b算子对驾驶员图像灰度化[7],使用自适应中值滤波减少噪声[8]。之后使用haar-like特征进行人脸识别[9]。因为摄像头位置固定,而且驾驶员所在位置一旦上电之后基本不变,所以前后两次人脸识别框的位置偏移较小。所以在第一次识别到人脸后,下一次只在这次的识别位置附近判断即可,以加快算法运行,提高实时性。
在上电之后的5 min内,本文认为驾驶员是清醒的。此时需要记录系统运行各个阶段的检测结果,将它们作为驾驶员清醒状态下的指标。其中包括该驾驶员的眼睛宽高比、PERCLOS值和眼睛注视区域分布,以便在之后的系统检测过程中发现上述值出现异常时更准确地判断其疲劳程度。
在疲劳驾驶检测过程中,往往影响系统运行快慢的是人脸特征点定位的速度,这也是制约算法实时性的一大难点。由于在检测过程当中,驾驶员图像会由于光照、遮挡等复杂情况而降低定位的精度。所以本文使用精确度较高、速度很快的基于回归的局部二值特征法(local binary features,LBF)来进行人脸特征点定位[10]。
LBF算法需要在开始时输入一个人脸特征点初始化模型,然后通过不断地回归使得该模型越来越逼近真实位置[11]。因此如图1中虚线框所示,为提高检测精度与速度,对LBF算法优化,采用不同的初始化策略。不再简单地使用标准平均人脸来进行初始化,而是首先判断人脸朝向,从而使用不同的人脸特征点初始化模型。
图1 LBF算法改进策略示意
本文需要为驾驶员人脸朝向角度训练一个分类器。选取HOG特征作为参数[12],之后使用SVM进行分类[13]。
HOG特征提取参数设置如表1所示,本文使用人脸姿态数据集CAS-PEAL中的POSE组作为输入图片,图片大小均为360像素×480像素。所以HOG特征提取时的窗口有10×10=100 个,HOG的每个窗口里block有36/12×48/16=9 个。1个block有4个cell,其特征描述子长度是9维,所以最终得到的 HOG 特征向量维数是 100×9×9×4=32 400维。提取HOG特征如图2所示。
表1 HOG参数选择
图2 HOG特征可视化
因为CAS-PEAL数据集的POSE组中包含1 042个人的21种不同角度的人脸图像,但是本文只选取其中5种角度,分别是无偏转正向人脸、向左偏转22°人脸、向左偏转45°人脸、向右偏转22°人脸以及向右偏转45°人脸。所以在训练数据集文件夹中新建5个文件夹,分别命名为0、-1、-2、1、2,并将对应的图片存入其中。在SVM训练时将图片所在文件夹的名称作为分类标签,提取HOG特征向量作为SVM输入参数,得到人脸朝向粗估计分类器。本文为验证算法精确度,使用了含有500 张图片的测试样本集来计算该分类器的识别率,其中包含CAS-PEAL数据集中的320 张图片和自建数据集中的180张图片,经计算识别率为95.38%。如图3所示的部分样本分类结果图,最后2 张是自建数据集中的样本。
图3 部分测试样本SVM分类结果
我们取公开数据集300-W和自建数据集作为训练样本,根据人脸朝向粗估计之后得到的分类结果采取不同的人脸特征点初始化模型,如图4所示的5种人脸特征点初始化模型分别对应分类结果为-2、-1、0、1、2的人脸图像。
图4 5个初始化人脸模型
LBF算法需要建立随机森林[14],将训练样本拆分成多个小样本,每个小样本中的图片均有68个特征点。在以每一个特征点为圆心的圆内,生成500个像素点,计算二者之间的差值。由这些差值作为特征,选择阈值将当前小样本中所有图片分成左右子树两大类,并计算分类前后的方差衰减。统计使该值最大的那个阈值就是本次分类的最终阈值,此时的特征就是本次最终特征。不断分裂直到该树的最大深度。一个特征点的决策树建立完毕,然后取下一个小样本集重复上述步骤,通过这种方法,每个特征点构建多个子树组成一个随机森林。本文脸部有68个点,便是68个随机森林。
本文为提升分类效果,不再简单地使用像素差值作为特征,而是使用归一化值,如式(1)所示。x和y是两个像素值,使用NOL(x,y)作为特征来分类,这种归一化处理之后使得特征对光照更敏感。同时这样处理之后在计算量上甚至没有改变,然而分类效果明显提升。
然后利用训练好的随机森林提取局部二值特征。对于每一张图片的每一个特征点来说,该图片必然会被分类到某个叶节点中,此时将该叶节点编码为1,否则将其编码为0。就可得到一棵树的二进制编码,将该特征点的随机森林中所有二进制编码组合起来就是LBF特征。最后把所有LBF组合以形成特征映射Φt。
回归时把位置增量当成学习目标,训练线性回归器Wt。如式(2)、(3)所示,LBF 算法在每一层级的回归中将线性回归矩阵Wt和特征映射函数Φt相乘,根据人脸特征点初始化模型和当前特征点位置信息得到一个位置变量ΔS,从而修正本层级的位置信息St,然后继续回归与迭代。
通过最小化式(4)的目标函数来学习Wt:
随着层级的不断深入,回归产生的特征点越来越逼近真实位置。LBF算法参数设置如表2所示。
使用300-W数据集测试结果如图5,使用自建数据集测试结果如图6,可见效果明显。
表2 LBF算法参数设置
图5 300-W数据集测试结果
图6 自建数据集测试结果
利用LBF改进算法定位到特征点后,通过眼睛位置的先验知识[15],截取出眼部图像,供下一步判断人眼闭合程度以及求解视线方向,如图7
所示。
图7 截取待检测人眼区域
本文基于人眼部特征点的形状和边缘检测来计算眼睛宽度W和高度H之比,如式(5)所示:
由于眼睛存在着个体差异性,而且同一个人在不同自然条件下以及复杂背景中的眼睛情况也不一样,所以直接使用R值来判断闭合程度会增加算法的误检率。而本文在系统初始化之后已经得到了驾驶员处于清醒状态下的眼睛闭合
程度Rinit,使用该值重新计算宽高比R,如式(6):
利用优化后的R能有效降低个体差异和外界环境的影响,提升算法鲁棒性。为了检测疲劳程度,引入PERCLOS P80标准[16]。所以本文将人眼闭合程度为80%时的R取作阈值,用 T hreshP80表示,那么当驾驶员疲劳时,R值会有:
基于500张眼睛图像的训练统计可得:当眼睛闭合程度大于80%时,优化后R的值大于3。由此把阈值 T hreshP80赋值为3,即人眼宽高比大于3时的人眼是闭着的。计算这段时间在单位时间的比例,示意图如图8,并且计算公式见式(8)。
图8 PERCLOS值测量原理
而实际检测驾驶员疲劳程度时,式(8)中闭眼时间占据总时间的百分比需要变换为闭眼的帧数和总帧数的比[17]。
本文到目前为止已经完成了人脸特征点定位、眼部区域提取和人眼闭合程度判断的工作。使用5段驾驶员分别处于不同疲劳状态下的视频,通过上述算法求解PERCLOS值,绘制曲线如图9所示。可见正常情况下驾驶员的PERCLOS值都比较小,即使受到自然环境下异常光照的问题或者存在部分误检的情况,该值幅度也只是略微变大,但都很少会有超过0.2的情况。当驾驶员轻度疲劳时该值会呈现出波动趋势,即在某些帧数内PERCLOS值会变得比较大,之后又恢复到正常水平。为减少误检,把轻度疲劳阈值定成0.3,把重度阈值定成0.5。即当PERCLOS值比0.5大时,判定其为重度疲劳。
图9 PERCLOS测量结果
由于本文采用红外摄像头采集图像,因此驾驶员的瞳孔与虹膜的灰度值具有明显不同。根据位于驾驶员面前的4个红外LED灯在眼睛反射得到的普尔钦光斑[18]与瞳孔中心[19]关系求解注视方向。
我们知道瞳孔与虹膜的灰度值明显不同,并且瞳孔类似于一个圆,所以边界上的点的梯度向量一定是通过圆心的。也就是说,瞳孔中心C和边界上任意像素点xi组成的位移向量 di应该和该像素点的梯度 gi方向一样,所以只要找到二者内积最大值所对应的中心坐标即为所求。如图10所示。
图10 瞳孔梯度向量与位移向量示意
其中 gi见 式(9), di见式(10)。式中 i、j表示图像像素点位置;I为该位置上的像素值。瞳孔中心 C*的求解见式(11)。
但是使用上述方式得到的瞳孔中心往往会由于眉毛、头发等干扰区域产生强图像梯度而影响定位精度,所以本文从如下方面优化瞳孔定位算法:
1)因为本文在前面已经使用LBF改进算法得到了精确的人眼特征点,我们基于这些特征点来提取人眼可以减少眉毛等干扰区域的影响。
2)本文基于瞳孔与虹膜之间产生高梯度来定位,但巩膜和虹膜间灰度值差异也很明显,二者之间也会产生高梯度,严重影响准确度。由于瞳孔颜色比其它区域都要深,所以在计算C*时进行反色处理,添加权重WC,这样操作使得深色的中心点比浅色的中心点被认定为瞳孔中心点的可能性更大。
3)为了提高算法准确度,在选择某些中心点计算内积和时,首先判断该点是否满足中心点要求。如图11所示的中心点C明显不满足,因为di和 gi方向不同,而且夹角是钝角,此时 (但是求解C*时可能会很大,所以这种中心点的内积也会累加,从而增加定位误差,因此需要将该情况的内积筛选出去。
图11 可以忽略的中心点示意
综上,式(11)优化后如式(12)所示。
本文通过使用一段视频进行瞳孔定位,截取到的一帧图片和定位结果如图12所示。可见即使驾驶员配戴眼镜也能比较精确地定位瞳孔位置。
图12 瞳孔定位结果
为定量分析该算法的准确度,本文使用BioID数据集来测试。一共有1 520 张人脸图像,并且每张图片均给出了人眼中心点像素坐标。本文随机选取其中500 张,部分图片测试效果如图13所示。红点是实际位置,白点是测试位置。可见前3 张算法定位的效果较好,但是最后一张出现误检的情况,因为该张图片反光较为严重,瞳孔区域内低灰度值像素点较少,影响了算法准确度。经过人工审查,本文误检图片数量为29张,准确率为94.2%。
图13 BioID数据集的部分测试结果
由于普尔钦光斑是个小的连通区域,因此求得瞳孔中心之后,在附近搜索连通域,筛选得到光斑位置,如图14,为下一步确定视线方向做准备。
图14 瞳孔中心与普尔钦光斑
本文求解注视区域频率使用的是投影空间法。如图15所示,一方面,有4个红外LED位于驾驶员正前方的平面里,按照矩形排布。它们在驾驶员眼睛角膜的正切平面中的投影为(v1,v2,v3,v4)。由人眼构成的先验知识可知,点p是瞳孔中心,那么就有视线方向与驾驶员前方平面相交,记作点g。另一方面,摄像头采集人眼图像,则(v1,v2,v3,v4)投 影到成像平面产生 (Uv1,Uv2,Uv3,Uv4)。经上述两方面可知一共有2次空间映射,所以利用投影空间性质,求解摄像头成像平面里UP相对于(Uv1,Uv2,Uv3,Uv4)的坐标,就可得到人眼注视点g在红外LED灯平面的位置。统计该落点在一段时间内的分布情况,得到注视区域频率,从而判断驾驶员注意力是否分散。
本文将人眼视线方向应用于疲劳驾驶检测领域,它和传统意义上的视线追踪技术的着重点与应用性不同[20]。应用于人机互动和智能控制的追踪技术要求解出人眼注视点落在人机交互界面中准确的坐标,所以必须保证有足够的算法精度。但是应用于本文疲劳驾驶检测技术的视线方向算法,对注视点坐标的准确度要求不是很高。如果多帧驾驶员图像的视线方向一直位于某个不正常区域内,说明该驾驶员注意力已经分散,此时应该对其预警。如图16所示,将由4个红外LED灯光源组成的矩形分成9个区域。统计注视点在这9个区域的落点频率,即可判断疲劳程度。
图15 视线注视点平面与摄像头图像平面映射关系
图16 驾驶员注视区域划分示意图
本文用长约10 min的驾驶员自然状态下和轻度疲劳状态下的2段行驶视频进行分析,如表3和图17所示,从表3中可以看出正常状态下驾驶员在大部分时间注视区域都是4,其次是1、5两个区域。而在轻度疲劳状态下,区域7的频率严重上升,区域4频率明显下降,且注视区域较为集中在4、7两个区域。因此如果驾驶员在一定帧数内也出现上述现象,即可判断其处于轻度疲劳或者注意力不集中。
为验证本文系统的检测速度,使用摄像头采集3个人的样本视频进行测试,每一段包含1 800帧的图像序列,各算法的检测速度如表4所示。可见改进的LBF算法是主要耗时模块,因为本文牺牲了该算法的速度而提高了准确度,而且检测速度也可以接受。整体算法平均耗时69.1 ms,达到 15 f·s-1。
表3 注视区域频率 %
图17 注视区域频率直方图
表4 疲劳驾驶检测算法各模块检测速率 ms
本文将疲劳等级分成正常、轻度和重度3级。其中轻度疲劳是指驾驶员PERCLOS值在0.3~0.5,而且注视点连续70帧处于区域7和区域8的比例达到40%以上。重度疲劳是PERCLOS值大于0.5,或者注视点的比例达到了60%以上。本文使用3个人时长为10 min的视频进行检测,每个人截取9 000 f图片,为计算算法准确度,让这3个人在疲劳和清醒状态下频繁切换,统计结果如表5。
表5 疲劳驾驶检测算法检测精度
可见,系统的平均准确度达到了93.9%,运行速率15 f·s-1,成功解决二者的平衡问题。
本文提出了一种基于人眼特征的疲劳驾驶检测方法。主要研究工作有:
1)在对驾驶员图像进行预处理和人脸识别之后, 改进了LBF 算法的初始化策略,提高了人脸特征点定位精度。使用归一化特征提高了随机森林的分类效果。
2)建立了一套以人眼闭合程度这一眼部特征作为基础的PERCLOS 疲劳检测模型。
3)提出了将驾驶员注视区域频率和PERCLOS检测法相结合的算法。实验证明,该算法提高了疲劳驾驶检测在实时性与准确性2 个方面的平衡性能。在后续的研究中,考虑将驾驶员头部姿态角度加入到检测参数中,以适应更复杂的测试环境。