APP下载

基于AdaBoost算法的疲劳驾驶检测系统研究*

2019-05-28徐柱何锋华星淇李家林

汽车技术 2019年5期
关键词:人眼分类器轮廓

徐柱 何锋 华星淇 李家林

(1.贵州大学,贵阳 550025;2.广东工业大学,广州 510006)

主题词:疲劳检测 人眼检测 AdaBoost 眼睛闭合时间占比

1 前言

我国的汽车保有量逐年增加,交通安全形势愈发严峻[1]。在各类道路交通事故中,疲劳驾驶、酒后驾驶以及超速驾驶是引发交通事故的主要原因,相关数据表明,疲劳驾驶造成的事故约占交通事故总数的7%,约占特大交通事故总数的40%[2]。因此,开展驾驶员疲劳检测技术的研究对于保障驾乘人员生命及财产安全具有重要的现实意义。

目前,疲劳驾驶检测方法主要分为3类:基于脑电信号(Electroencephalography,EEG)特征的检测[3-4]、基于眼动特征的检测[5-6]和基于驾驶行为特征的检测[7]。其中,基于眼动特征检测的方法因其检测的直接性、非接触性、与驾驶员的生理信息具有一致性、可接受性强等特点,成为目前国内普遍采用的研究方法。Dong[8]等根据驾驶员眼睛状态进行疲劳驾驶判断,提出了一种利用眼睑之间的距离判断疲劳程度的方法,当眼睛开度小于设定阈值时,判定为闭合状态。Seifoory[9]针对虹膜进行眼睛状态分析,检测不到虹膜时,认为眼睛闭合。Wu[10]等采用模板匹配的方法进行人眼状态的分类检测,从而得到驾驶员的疲劳状态信息。上述文献在疲劳驾驶检测中只针对正常状态下的人眼完成训练和测试,没有考虑佩戴眼镜情况下镜片反射及镜框对检测算法的干扰。

本文选用自动对焦彩色摄像头作为图像采集模块,首先利用Haar特征设计AdaBoost算法实现人脸及人眼的检测及定位,再根据Canny算子实现人眼轮廓检测与提取,最后利用离散的眼睛闭合时间占比(Percentage of Eyelid Closure over the Pupil over Time,PERCLOS)疲劳判断算法实现驾驶员疲劳状态的检测与警告,借助开源计算图像库OpenCV编程实现疲劳检测,并对系统的实时性和稳定性进行了测试。

2 系统结构与原理

本文驾驶员疲劳驾驶检测系统可分为图像采集模块、图像处理模块和疲劳预警模块,系统总体框架如图1所示,工作流程如图2所示。

图1 系统总体结构框图

图2 系统工作流程

图像采集模块由自动对焦的彩色摄像头组成,可实现驾驶员面部图像的实时获取。由于车辆行驶过程中驾驶员头部与摄像头的距离在一定的有限范围内变动,经实车测试后选择广角为90°视野,500万像素,帧频为15帧/s的摄像头。该摄像头完全满足系统的实时性需求,通过视频转换传输技术将采集到的图像信息传输至图像处理模块。

图像处理模块主要由数字信号处理器(Digital Signal Processor,DSP)、同步动态随机存储器(Synchronous Dynamic Random Access Memory,SDRAM)和Flash存储器组成,对采集的图像进行预处理,以及人脸、人眼定位和人眼开度计算。DSP具有多个独立计算的功能单元、较快的计算速度以及高度的可编程性,可满足系统的整体需求。但系统断电后DSP中的数据会丢失,所以使用SDRAM和Flash存储器来存储数字信号、算法以及后处理数据。

疲劳预警模块采用LED灯闪烁和蜂鸣器音频同时报警,根据驾驶员的疲劳程度实现分级预警:一级预警时,LED指示灯为黄色,间断闪烁,蜂鸣器间断报警;二级预警时,指示灯变为橙色,闪烁频率增加,蜂鸣器报警占空比增加;三级预警时,指示灯变为红色,蜂鸣器长鸣,直至疲劳状态清除。系统不断重复上述流程,从而实现实时疲劳检测并预警。

3 图像处理及算法设计

3.1 人脸、人眼定位

AdaBoos(tAdaptive Boosting)算法[11]精度高、分类速度快,能大幅提高泛化能力且不易引起过拟合现象。基于AdaBoost算法,使用Haar-like作为人脸和人眼分类器进行检测定位。AdaBoost算法主要包括弱分类器的选取和由弱分类器确定强分类器两部分。

以人脸检测为例,AdaBoost算法步骤如下:

给出一组训练集(x1,y1),…,(xn,yn),其中xi为样本描述,yi∈(0,1)为样本标识(0、1分别表示正例和反例)。在疲劳检测中,可以定义0为非人脸,1为人脸。

初始化:初始化样本权重,对于非人脸样本,t次循环中第i个样本的误差权重Dt(i)=1/2m,对于人脸样本,Dt(i)=1/2(l人脸样本和非人脸样本初始化为不同的值,m为非人脸样本总数,l为人脸样本总数)。对t=1,2,…,T(T为循环次数),循环执行下面的步骤:

a.权重归一化:

式中,qi为归一化值。

b.对每个特征f,训练一个弱分类器h(x,f,p,θ),计算所有特征的弱分类器的加权错误率εf为:

式中,θ、p分别为弱分类器的阈值和偏差参数。

c.按最小错误率选取最佳弱分类器ht(x):

式中,ft、pt、θt分别为最佳弱分类器下的特征值、偏差值和阈值。

d.按最佳弱分类器调整权重:

式中,βt=εt/(1-εt)为更新因子;ei为分类检测变量,当样本xi被正确分类时,ei=0,当样本xi被错误分类时,ei=1。

e.最后的强分类器为:

AdaBoost算法是一系列强分类器的组合,将强分类器按照强弱依次串联起来,成为级联分类器,如图3所示,能够排除大量的非人脸图像,进而提高检测速度[12]。

图3 强分类器筛选过程[11]

通过收集不同光照强度下的正样本和负样本,训练得到人脸和人眼分类器的层数为8层,每级最小检测率为0.95。调用训练好的人脸、人眼级联分类器进行测试,检测结果如图4所示。

图4 人脸、人眼检测结果

3.2 人眼动态直方拉伸

仅通过在AdaBoost算法训练过程中加入不同光照强度下的人脸图片进行训练来提高检测性能无法满足要求。为了更好地提升检测系统不同光照下的稳定性,本文在AdaBoost算法基础上采用动态直方拉伸对眼部较暗或较亮图像进行处理,增强眼部图像显示效果,更便于AdaBoost算法实现人眼检测以及轮廓提取。

灰度直方图是灰度级的函数,描述图像中该灰度级的像素数量(或该灰度级像素出现的频率)。一维直方图的结构表示为:

式中,H(rk)为直方图离散函数;rk为图像的第k级灰度;nk为图像中具有灰度值rk的像素数量;n为图像像素总数量;L为图像的灰度级数量;P(rk)是灰度级rk出现的频数。

图像增强处理时,为了突出感兴趣的目标或灰度区间,可采用分段线性变换。将整个灰度区间划分成几个灰度区间,拉伸需增强目标对应的灰度区间,抑制不感兴趣的灰度级,从而达到增强的目的,图5所示为三段直方拉伸变换原理。其数学表达式为:

式中,f(x,y)为像素点(x,y)拉伸变换处理前图像灰度值;g(x,y)为空间运算函数;M=255为图像最大灰度值;a、b、c、d分别为拉伸灰度段点值。

图5 直方图拉伸三段线性图

直方图拉伸的段点值a、b一般是固定的。当图像整体偏暗时,特征像素的直方图向左平移,反之向右平移,导致特征像素与背景像素对比度被拉伸到更小,使特征更加难以区分。为解决这一问题,本文采用动态a、b值进行直方拉伸。拉伸前先计算图像的平均灰度G,利用其变化动态设置段点a、b的值。经过实际测试分析,为突显眼部的轮廓,设a、b的取值分别为:

3.3 眼部轮廓提取

基于John Canny[13]提出的边缘检测算法,采用Canny算子轮廓提取算法对预处理后的二值化图像进行轮廓提取,处理过程如图6所示。

图6 轮廓处理过程[13]

Canny算法的目标是找到一个最优的边缘检测[14],其含义主要包括:算法尽可能多地标识出图像中的实际边缘;标识出的边缘尽可能与实际边缘接近;图像中的边缘只能标识一次,且可能存在的图像噪声不应标识为边缘。在OpenCV中调用Canny边缘检测算法,即可实现眼部轮廓检测,如图7所示。

通过边缘检测,获得具有较好边缘梯度的黑白二值图像,在此基础上进行轮廓提取与绘制,目的是获得眼部图像的外部轮廓特征,为判断人眼状态和求取面积做准备。若图中有一点为黑色,且其相邻的8个像素点均为黑色,该点为内部点。将所有内部点置为背景点,完成轮廓的提取。

OpenCV中轮廓提取应用程序编程接口(Application Programming Interface,API)函 数 为 find Contours,轮廓绘制函数为Draw Contours。轮廓提取时找到的轮廓存放在RETR_LIST参数中,以备轮廓绘制使用。轮廓提取测试效果如图8所示。

图7 边缘检测

图8 眼部轮廓提取

3.4 疲劳状态判断

PERCLOS是Walt Wierwille提出的一种疲劳状态评定方法,指人眼完全闭合的时间占规定时间的比例。目前,PERCLOS是公认的最有效的疲劳状态评价标准。本文以P80准则为测试标准,其原理如图9所示[15]。图9显示了眼睛从完全睁开到完全闭合再完全睁开的整个过程。

图9 PERCLOS P80准则原理

结合图9所示原理,通过摄像头实时捕获驾驶员每一帧图像,计算出一段时间内眼睛闭合80%以上状态的帧数为m,总帧数为N,用图像帧数百分比替换时间百分比来表达PERCLOS的值fp:

首先由上述所提取的人眼轮廓以及OpenCV中提供的Contour Area()轮廓面积计算函数,可得到轮廓中的像素数量X,带入式(11)得到人眼开度:

此外,眨眼频率是指单位时间内完成完整的眨眼过程的次数。一般情况下,人每分钟眨眼10~15次。如果眨眼频率偏离正常值较远,可能的原因主要有:驾驶员处于疲劳状态,长时间闭眼;驾驶员眼睛睁开,但是目光呆滞,注意力涣散。前者可以通过PERCLOS方法计算单位时间内闭眼帧数来检测,当fp>40%,眼睛持续闭合时间大于3 s时,判定驾驶员处于疲劳驾驶状态;后者fp较小,PERCLOS方法无法判断驾驶员状态是否异常,此时可用眨眼频率判断,眨眼频率过低,则说明驾驶员眼睛状态异常,需要给予预警。

4 试验测试

为进一步验证所设计的算法及疲劳检测系统的有效性和抗干扰性,开展实车验证。选择有午睡习惯的驾驶员在午餐后晴朗天气下进行测试。测试时间段为13:00~15:00,以某SUV作为测试车辆,测试路段为广州大学城内环中心湖附近车道。配置的摄像头型号为罗技C930e,带CMOS彩色传感器;采集图像分辨率为640像素×480像素,图像帧频为15帧/s。

基于Haar-like特征的人脸、人眼级联分类器的验证如图10所示,正常驾车过程中,对于不同姿态的人脸,在不同光照条件下,均获得了很好的检测效果,检测准确率可达94.1%。提取图10强光和弱光环境下图像进行眼部直方拉伸分析,对比测试结果如图11所示。

图10 人脸、人眼检测验证

图11 强、弱光照下直方拉伸测试

由图11可知,动态直方拉伸算法通过图片的明暗信息实时地调整段点值,优化了眼部图像的灰度区间,有效抑制了噪声,提高了图像的对比度。图像显示效果较静态直方拉伸更好,使得后续过程的眼部轮廓提取更加精确,也反映了经动态直方拉伸处理后AdaBoost算法在不同光照下均具有较强的抗干扰能力。

为验证改进算法的检测准确性,从动态行车驾驶过程中提取20 s图像视频,与OpenCV库自带AdaBoost算法比较进行人眼定位数据统计分析,结果如表1所示。

表1 光照因素对算法人眼定位对比分析 帧

由表1可知,在行车方向变化以及树阴间断造成的光源强度变化工况下,改进AdaBoost能很好地克服光照因素的影响,检测准确率得到提高。

驾驶一段时间后驾驶员出现了短时轻度疲劳驾驶,使fp达到阈值触发报警蜂鸣器。驾驶员不同状态下测试结果如图12所示,测试过程中驾驶员的人眼开度信息及驾驶状态实时显示。

图12 实时驾驶状态

5 结束语

本文以不同光照强度下眼睛开度信息的检测分析为切入点,提出基于AdaBoost算法的光照自适应疲劳驾驶检测系统的总体方案设计,加入大量不同光照和佩戴眼镜条件下的驾驶图像进行分类器训练,并引入了动态直方拉伸进一步增强不同光照下的眼部图像显示效果,辅助提高AdaBoost算法的抗光照干扰能力。结果表明,所设计的检测系统能够很好地实现光照自适应环境下的疲劳检测,较OpenCV库检测自带AdaBoost算法人眼检测精度提高3.96个百分点。此外,本文提出的三级疲劳预警方案实施简单、成本低,能根据疲劳驾驶状态实现不同级别预警,具有较强的可实施性。

猜你喜欢

人眼分类器轮廓
少样本条件下基于K-最近邻及多分类器协同的样本扩增分类
田志强
学贯中西(6):阐述ML分类器的工作流程
基于朴素Bayes组合的简易集成分类器①
跟踪导练(三)
基于AdaBoost算法的在线连续极限学习机集成算法
闪瞎人眼的,还有唇
看人,星光璀璨缭人眼
人眼的视力为何达不到3.0?
儿童筒笔画