苏起扬,娄 震
(南京理工大学 计算机科学与工程学院 江苏 南京 210094)
国内外研究表明,驾驶员在疲劳的状态下,对周围环境的感知能力、危险的判断能力和车辆的操控能力都会较正常情况有不同程度的下降,从而导致交通事故[1]。因此,疲劳驾驶检测具有极为重要的意义。
当前疲劳检测系统主要采用基于图像处理技术的非接触检测方法,这种疲劳驾驶系统主要是检测与分析驾驶员眼睛的状态。在疲劳驾驶发生时,驾驶员眨眼频率会上升,闭眼时间增加,基于眼睛状态的疲劳驾驶标准 PERCLOS(Percentage of Eyelid Closure Over the Pu⁃pil Over Time)是目前最为准确同时也是被广泛接受的标准[2⁃3]。
目前基于图像处理技术的疲劳驾驶检测系统的算法主要采用基于Haar特征的AdaBoost算法,该方法首先采用级联分类器确定人脸区域,再用同样的方法确定人眼位置,通过分析人眼状态结合PERCLOS标准来判断疲劳驾驶行为是否发生。而在实际运用环境中,由于摄像头与人脸所成角度的改变、驾驶员头部的晃动、车辆抖动等因素,AdaBoost算法表现出较差的鲁棒性,拒真率高导致识别率较低[4];搜索人眼的过程中也有采用模板匹配的方法,模板匹配计算规模较大,而且在人眼睁闭时,由于目标形状的变化,采用固定单一模板会丢失目标,如果采取多种模板匹配则计算量过大,无法达到实时性要求[5];也有通过主动形状模型(Active Shape Model,ASM)、动态轮廓模(Active Appreance Model,AAM)获取人眼精确的特征点坐标,再通过这些特征点计算上下眼眶距离完成眨眼判断,这种方法结果精确,但是计算量庞大无法部署于实际操作环境中,并且算法对光照敏感[6]。国内也有学者使用改进的Mean⁃shift算法,根据像素值分布特征以及梯度方向特征追踪人眼,这种方法同样面临实时性的问题[7]。
综上所述,若要在疲劳驾驶系统中人眼检测必须具备如下要素:
(1)实时性;
(2)人眼检测精确;
(3)鲁棒性强。
疲劳驾驶检测系统通常分为人脸检测与人眼检测两部分,本文采用检测与跟踪相结合的方法完成这两部分检测;第一节讨论了AdaBoost与差分跟踪相结合的人脸检测步骤;第二节讨论了AdaBoost与变模板匹配相结合的人眼检测步骤;第三节讨论了传统“人脸⁃人眼”模型的缺点,并提出了一种改进方法,提高了人脸检测和人眼检测两部分整体的运行效率。
人眼检测目标相对于整体图像较小,直接检测人眼运算量较大,并且会产生较多非目标结果,通常在检测人眼之前首先进行人脸区域定位。Paul Viola和Mi⁃chael Jones于 2001提出的基于Haar⁃like特征的 Ada⁃Boost算法可以精确快速地识别人脸区域。
AdaBoost算法给予每个训练样本不同的权重,每个权重表示相应样本被错分的概率。算法进行N次迭代,产生N个弱分类器,在每一次迭代时,样本权重产生变化,在上次迭代中被错误分类的样本获得更大的权重,进入下一次迭代时,根据更新后样本的权重选取部分样本训练下一个弱分类器,最后将这N个弱分类器加权得到一个级联的强分类器[8]。训练方法如下:
(1)根据样本分布Dj,对训练集S进行有放回的抽样产生训练集Sj。
(2)在训练集Sj上使用学习算法训练弱分类器cj。
(3)用训练所得的分类器cj分类原训练集S中所有样本,得到误差:
式中Zj是一个正规因子用来确保cj为本轮迭代所得弱分类器;αj为cj对应的权重。
(5)得到强分类器C,由上述所产生的所有弱分类器加权求和得到:
上述算法在弱分类器训练中采用Haar⁃like特征,利用AdaBoost算法训练人脸分类器定位人脸。
人脸检测是粗定位,是为了确定下一步骤人眼检测的搜索区域,对精确度要求不高。为了尽可能快速得到人脸区域,在前几帧检测到人脸的情况下,本文采用差分方法进人脸跟踪,根据之前帧中人脸位置确定当前人脸位置。
在视频序列中 fk(x ,y),fk-3(x ,y)分别为第k帧和第k-3帧图像中人脸矩形框向外各扩大10像素以后的区域,width,height为其长宽。对 fk(x ,y),fk-3(x ,y)进行差值运算,并二值化得到g(x ,y)。统计g(x ,y)中所有像素点I(x ,y)>0的个数,记为N1。若N1小于某阈值即 N1<Threshold×(w idth×height),则认为区域中人脸没有产生明显移动,将k-3帧中人脸区域作为第k帧结果,否则进行更新,更新方法如下:
(1)计算g(x ,y),水平方向和垂直方向的灰度投影pojH(y),pojV(x);
(2)求解OffsetX,OffsetY使得:
式中OffsetX,OffsetY为跟踪结果相对于上一帧人脸区域的偏移量。
(3)根据OffsetX,OffsetY更新人脸矩形区域。人脸粗定位效果如图1所示。
图1 连续10帧人脸检测与差分跟踪结果
由上述步骤得到人脸区域后FROI(Face Region On Interest),在区域内进行人眼检测。人眼检测是整个系统的关键步骤,直接影响到后续人眼状态分析,要求检测到的人眼保证精确。由于人眼区域较小,采用Ad⁃aBoost等算法经常会将鼻孔嘴巴等器官误识别,所以在检测前,首先根据人脸三庭五眼的特征,取人脸区域上部分区域进行人眼检测,同时缩小一半计算量。
人眼检测中使用的AdaBoost算法与人脸检测中基本相同,在实际环境中,由于行车晃动,司机张望等客观因素,AdaBoost很难达到较高的识别率,通常低于60%,而人类眨眼只需要0.2~0.6 s就可以完成,单一采用Ad⁃aBoost算法会严重影响系统的准确度。
虽然AdaBoost识别率较低,但是其检测出的结果误识率极低,即结果准确。结合AdaBoost算法所得结果准确的特点,本文设计了一种采用改进的LBP特征的快速模板匹配方法,该方法在AdaBoost算法失效时,采用前一帧已检测到的人眼作为新的模板进行匹配,解决了模板匹配中单一模板无法应对眨眼时结果不精确的问题,同时LBP特征对于旋转和晃动不敏感,有效的提高了人眼检测的效果。
LBP特征是一种用来描述图像局部纹理的特征算子,它在1994年由T.Ojala,D.Harwood等人提出。算子描述如下:
对于图片中一个像素Ii=F(xi,yi),其中F为图像,x,y分别为对应像素横纵坐标:
式中P表示像素xi周围像素点集合,LBP的计算采用二进制。一个像素点产生一个8位的二进制的字符串,一种字符串排列表示一种模式。本文采用Uniform LBP,即将二进制字符串排列根据旋转不变性从原来的256种模式压缩成59种模式[9]。
由于目标人眼图像中人的眼睛位于图片中央,上下部分大多为皮肤,在匹配过程中,人眼部分的特征会被皮肤掩盖,本文使用y轴方向一维高斯模板,给予人眼部分y轴方向较高的权重,皮肤部分较低权重,并且减少了眉毛部分对结果的影响,实验表明新特征LBPG得到了较好的效果,新算子表达如下:
式中G为高斯函数:
式中 μ为H 2,H为图像高度。
取上一帧检测到人眼位置上下左右各扩展10%人脸区域长度个像素所得区域作为搜索区域,将上一帧检测到的人眼作为模板进行模板匹配搜索新的人眼位置。效果如图2所示。
上述两节人脸检测与人眼检测的部分。在传统“人脸⁃人眼”方法中,先进行人脸检测找出人脸区域FROI,再对FROI进行人眼检测找出人眼。这种方法对于每一帧都进行以上两个步骤,依次进行,每一次检测人脸区域都保证了下一步人眼检测中待检测区域的可靠性,但由于人脸检测花费时间巨大,牺牲了运行速度。
图2 人眼检测效果
完成人眼检测得到人眼结果后,可以发现,在结果准确的情况下,人眼位于图片中央位置,而实际环境中,下一帧图像中人眼位置发生的偏移并不大,检测结果周围区域可以直接作为下一帧新的FROI,直接进行人眼检测,跳过人脸检测步骤。这样可以省去人脸检测的计算量,同时由于使用人眼结果周围区域作为新的FROI,该区域通常小于人脸,从而减少了人眼检测搜索面积也间接提高了人眼搜索算法的计算效率。
上述分析可知,跳过人脸检测步骤的前提是需要保证本帧人眼检测是准确的,即确保本帧检测结果周围区域作为新的FROI在下一帧对应位置中包含人眼目标。
本文设计了一种基于logistic分类器用来检验本帧检测结果的准确度,其输入为本帧检测结果和上一次AdaBoost成功检测结果,分类器从多个角度判断两张图片是否相似,由于AdaBoost人眼检测误识率极低,得到的人眼准确度高,新检测得到人眼如果与其相似,则认为结果准确,否则认为本帧检测结果不准确。
改进后的流程在检测完人眼以后,使用多特征分类器对结果进行分析,判断是否和上一帧人眼结果差异大小。一旦差异较小,则认为人眼被检测到,将人眼周围区域作为下一帧的FROI跳过人脸检测,否则算法依旧执行人脸检测部分,具体步骤如表1所示。
表1 改进后人眼检测方法
表中Step4具体步骤如下:
对本帧图像newEyeImg和上一次AdaBoost人眼检测结果图像AdaEyeImg,分别抽取特征向量v1,v2。本文从纹理特征,边缘特征,灰度特征,以及彩色信息等角度来构造特征向量v1,v2。
接着分别计算v1,v2各特征分量之间的欧式距离得到差异特征向量D。采用logistic分类器对D进行分类。特征分量具体如表2所示。
表2 特征分量描述
本文从17车次行车视频中收集了1 217对正样本,并在人眼检测结果周围选择非人眼结果组成了1 537对负样本,进行训练,将1 389对样本作为测试集,得到Logistic分类器准确率为93.6%。
实验采用DM642芯片,主频为720 MHz。实验对18位司机在其工作时进行实际环境行车视频采样,共20段视频。每段视频各分析998帧行车视频,图像大小为352×288,得到人眼结果大小为20×20像素,首先验证了整体算法流程的识别率和效率,每段视频平均检测成功率为90.7%,具体如表3所示;接着比较传统“人脸⁃人眼”模型和改进过后方法各自每个步骤的执行速度,如表4、表5所示所示;实验表明,两种方法识别率接近,但是在计算时间上改进后的方法明显优于传统“人脸⁃人眼”模型,如表6所示。
表3 总体算法检测效果
表4 “人脸⁃人眼模型”各步骤花费时间
表5 改进后方法各步骤花费时间
表6 两种方法识别率和运算时间对比
本文讨论了传统的“人脸⁃人眼”模型方式,总结了基于Haar⁃like特征的AdaBoost算法进行人脸人眼检测的优缺点,采用差分运算快速跟踪人脸以及变模板匹配提高人眼检测成功率,并改进了传统的“人脸⁃人眼”模型,使用多特征的分类器跳过人脸部分,提高了整个系统的效率。实验表明,该方法在DSP开发板上可以以40 f/s左右的速度完成人眼的实时检测,同时正确率在90%以上。该算法应用于基于嵌入式芯片的疲劳驾驶检测系统具有较高的实用性和商业价值。
[1]李都厚,刘群,袁伟,等.疲劳驾驶与交通事故关系[J].交通运输工程学报,2010,10(2):104⁃109.
[2]刘秀,王长君,何庆.疲劳驾驶交通事的特点分析与预防[J].中国安全生产科学技术,2008(1):129⁃131.
[3]夏芹,宋义伟,朱学峰.基于PERCLOS的驾驶疲劳监控方法进展[J].自动化技术与应用,2008(6):43⁃46.
[4]严超,王元庆,张兆扬.基于AdaBoost和Kalman算法的人眼检测与跟踪[J].南京大学学报:自然科学版,2010,46(6):681⁃687.
[5]王江波,李绍文.基于AdaBoost算法和模板匹配的人眼定位[J].计算机测量与控制,2012,20(5):1347⁃1349.
[6]程如中,赵勇,戴勇,等.基于AdaBoost方法的车载嵌入式疲劳驾驶预警系统[J].北京大学学报:自然科学版,2012,48(5):719⁃726.
[7]彭召意,周玉,朱文球.用于疲劳驾驶检测的人眼快速跟踪方法[J].计算机工程,2010,36(15):191⁃193.
[8]李维维,胡桂明,何龙玲,等.基于AdaBoost算法的人脸疲劳检测[J].自动化技术与应用,2014,33(2):46⁃48.
[9]郑永斌,黄新生,丰松江.SIFT和旋转不变LBP相结合的图像匹配算法[J].计算机辅助设计与图形学学报,2010,22(2):286⁃292.