基于Adaboost和LBP算法的实时疲劳驾驶预警算法

2022-07-12 05:25赵如新宋春林
微型电脑应用 2022年5期
关键词:眼部准确率驾驶员

赵如新, 宋春林

(同济大学, 电子与信息工程学院, 上海 201804)

0 引言

随着人们生活水平的提高,中国机动车及机动车驾驶人员数量也随之增高,同时也伴随着更多的交通事故的发生。根据新闻报道,在交通事故中疲劳驾驶是最主要的原因之一。为了能够有效减少此类事故的发生,目前已经有很多方法将人脸识别技术应用于监测驾驶员面部表情判断其是否处于疲劳驾驶状态而提醒其注意休息。主要思路为从原始驾驶员面部图像中来识别疲劳面部表情。通常使用过滤响应,特征码直方图或字典原子分布等方法,如:2010年,Cao[1]等人提出一种基于学习的局部描述符和姿势自适应匹配的人脸识别技术,通过学习局部滤波器来获得更好的区别性,通过学习编码以获取更好的紧凑性。但由于针对于复杂的非线性面部外观,局部描述符仍有无法避免的局限性并且提高人脸识别的准确性缓慢。基于该研究,2013年,Chen[2]等人提出一种高维特征及其有效压缩技术(HD-LBP)用于人脸识别,对传统方法进行高维度映射。所提出的稀疏投影方法在不牺牲精度的前提下减少模型存储及计算量。但该方法在实际应用中却有诸多不足使其十分不稳定。随着机器学习及深度学习研究的不断深入,越来越多的研究通过采用深度学习模型的方法解决这一问题,并且期望能够得到精度上的高度提升。针对人脸识别,常规的流程包括四个阶段:检测、对齐、表示及分类。2014年,Taigman[3]等人通过对3D人脸建模来重新实现对齐和表示步骤,以便应用分段仿射变换,经过九层深度神经网络的特征点分析,对人脸特征点进行描述。该神经网络使用面部数据集进行了训练,其包含来自4000多个身份的400万张面部图片。经过实验验证,该模型可推广至任意环境下的面部图像。2009年,Balasubramanian等[4]提出一种使用径向基函数神经网络(RBFNN)的自动识别面部和嘴部方法。通过使用多尺度形态学进行面部和嘴部的特征提取。该方法利用运动信息对人脸区域进行定位,并通过对人脸区域的处理确定眼睛的位置。

根据以上基于人脸识别方法的描述,将人脸识别技术应用于驾驶员疲劳驾驶检测的方法应运而生。2015年,Zhang等[5]根据经验知识采用快速鲁棒性面部检测算法来描述和规范化面部表情图像,基于局部特征,对面部采用局部二进制模式算子(Local Binary Pattern, LBP)方式表示,并且发现LBP功能在疲劳面部图像内能稳定执行。2010年,Yang等[6]提出了一种基于动态贝叶斯网络的驾驶员疲劳估计推断方法,其中使用了多个特征,包括上下文特征,物理特征和非物理特征。主要思想将离散随机过程的当前模型扩展到连续随机过程以处理更多实际情况。实验表明,物理特征类别可以有效地检测出驾驶员疲劳驾驶的特征,具有更好的可靠性。2017年,Zhang等[7]提出一种基于眼睛状态识别的驾驶员疲劳检测方法。眼睛状态识别方法提供了很高的准确性。通过使用眼睛的状态计算PERCLOS和眨眼频率参数,判别驾驶员是否处于疲劳状态。该方法可以在戴眼镜的情况下工作。然而,由于疲劳驾驶一般出现在深夜凌晨等驾驶舱光照条件较弱的时段,基于局部特征的算法误差较大;同时由于车载设备性能的限制复杂度较高的算法,无法用于实时监测。

本文将基于驾驶舱实际环境,首先计算驾驶舱环境像素平均值判别当前状态为日间或夜间。其中,在地下车库等光线较差的地方统一认为为夜间状态。针对不同的环境,采用不同的面部识别算法。在日间状态下,本文基于AdaBoost算法,选取5个矩形特征组合作为模板进行特征训练,以此得到适合疲劳监测系统所需的眼部及嘴部特征,并依据此特征计算眼部PERCLOS值用于判断驾驶员疲劳状态。

判断夜间环境由于光照条件差,传统利用深度网络从图像帧中提取时空间特征来进行微表情识别的误差率较大。论文[8]中发现人的瞳孔反射光对于光变化较为敏感,而人脸的其他部分变化不大。依据此原理,本文采用相邻帧间差分的方法确定眼部的特征,同时使用局部二进制特征(local Binary Patterns, LBP)算法来处理眼部的开合状态。在已经定位眼睛的前提下,根据人脸部器官的分布来定位嘴部的位置。然后使用LBP算法进一步测试打哈欠行为,根据打哈欠的长度和频率确定驾驶员的疲劳程度。

同时,为了评估眼部状态信息和嘴部状态信息对驾驶员是否处于疲劳驾驶状态的比重,本文对其进行了实验比对。实验结果表明:当嘴部状态信息权重β为0.44,系统判别精度最高。在日间清醒场景下最高精度可达93.6%,平均识别准确率为92.1%。

1 疲劳驾驶检测算法

本文提出的基于AdaBoost及LBP算法的日间夜间疲劳驾驶检测算法总体框架,如图1所示。

该算法共分为两部分:日间状态和夜间状态。在识别出面部信息后,对眼部信息进行PERCLOS值计算,对嘴部信息采用LBP算法估测其开合程度及频率。最后根据眼部和嘴部的信息值加权判断驾驶员当前状态是否为疲劳驾驶。

1.1 图像预处理

为了能够准确判别出摄像机所检测到的图像帧中的人脸轮廓,本文采用Canny边缘检测算法[8]对图像帧进行轮廓检测。相比于Sobel算子和Prewitt算子,Canny边缘检测算法具有更低的错误率,即所有边缘都可以被找到;边缘点定位更准确。Canny算法的主要步骤如下。

(1) 为了尽可能降低噪声对图像处理的影响,首先对图像进行高斯平滑滤波,从而减少边缘检测器上的噪声影响。式1表示当卷积核大小为(2k+1)(2k+1)时,卷积核每位计算式为

1≤i;j≤(2k+1)

(1)

假设图像描述为大小为(2k+1)×(2k+1)的矩阵M,则经过高斯滤波后,其像素点m的亮度值为

m=H*M

(2)

其中,*表示卷积。

(2) 计算梯度强度和方向,图像的边缘可以指向各个方向,在Canny算法中,选取水平、垂直和对角边缘。首先通过Sobel等算子计算出水平Gx和垂直Gy方向的一阶导数,则可得到像素点处的梯度的值G和方向θ:

(3)

θ=arctan(Gy/Gx)

(4)

(3) 若x和y方向的Sobel算子分别为sx和sy,图像窗口为矩阵M,则在像素点m处的梯度值为

Gx=sx*M

(5)

Gy=sy*M

(6)

(4) 仅仅采用梯度值来提取边缘像素点的结果仍非常模糊,为了能够增强边缘点强度,采用非极大值抑制技术来增强边缘像素点。其主要思路为:将当前像素的梯度强度与沿正负梯度方向上的2个像素进行比较,若当前像素的梯度强度与另外2个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制;

(5) 使用双阈值检测进一步确定像素边缘点。

如图2所示,左侧为相机采集到的图像帧,右侧为通过图像预处理阶段得到的完成边缘检测的图片。人物的关键边缘点均被检测出,结果总能保证对人脸部边缘点的信息检测。

图2 采用Canny算法进行图像边缘检测

1.2 基于Adaboost脸部识别算法

Adaboost算法[9]是Boosting族算法中最具代表性的算法。Boosting族算法的主要工作机制为:首先在初始训练集中进行训练,得出初始学习器。对初始学习器所预测出的样本质量进行划分,重点关注训练错误的样本。基于训练错误的样本,进行下一轮学习器的训练,不断重复上述步骤,直至学习器数量达到期望阈值数S则停止学习。最后,对这S个学习器进行加权结合。其主要目的在于将弱学习器提升为强学习器。Adaboost算法步骤如下。

(1) 初始化第s个学习器样本权重,其中0≤s≤S,

(7)

(2) 根据学习器的样本权重分布Ds进行数据训练得到Gs(x):

Gs(x):χ→{-1,+1}

(8)

(3) 计算Gs(x)在加权训练数据集上的分类误差率:

(9)

其中,I(·)为指示函数,同时判断分类误差率是否满足基本条件,若不满足则停止学习。

(4) 计算Gs(x)在全部学习器中的权重:

(10)

(5) 更新训练样本权重:

Ds+1=(wm+1,1,wm+1,2,…,wm+1,N)

(11)

(12)

其中,Zs是规范化因子。

基于以上集成学习的优势,本文期望通过采用Adaboost算法中各个学习器的结合,使系统对于眼部及嘴部的位置识别结果更加精确。

1.3 基于帧间差分算法的瞳孔估计算法

夜间模式由于光照条件限制,传统的基于特征提取的人脸识别方法误差率较大。由于瞳孔对可见光反射相较于人脸其他部位变化明显得多,并且相邻帧间图像的间隔不大,只有瞳孔反射光的变化较为明显,由此采用帧间差分算法对瞳孔位置进行定位。具体步骤如下。

(1) 将当前帧灰度化,之后使用将当前帧图像与上一帧处理过的图像做差,最后利用取绝对值。

(2) 对差分图像进行局部二进制特征处理,使得眼部特征更显性地分离出来。具体做法是用双峰法将原灰度图转化为二值图。

驾驶舱图像主要由前景和背景两部分组成,在处理图像的灰度直方图上,前景及背景像素的灰度值分布会形成山峰状态,而在两峰之间的低谷就是图像分割的阈值所在。从而得出夜间模式下的瞳孔信息。

为了能够在夜间模式下获取到嘴部信息,根据帧间差分算法估计出瞳孔位置后,本文将采用“三庭五眼”的规律来定位嘴部位置,具体来说:人脸上鼻尖和下巴将整个脸部在竖直方向上三等分,俗称“三庭”。“五眼”是指左右眼的内外眼角将人脸从宽度上五等分。实际效果如图3所示。

图3 “三庭五眼”嘴部位置估计

1.4 眼部PERCLOS特征计算

在日间模式或夜间模式提取到脸部的眼部信息后,需要计算获得眼部的高宽比v用于判断当前眼部状态是否处于疲惫状态。具体公式如:

(13)

其中,we、le分别为读取到的眼部宽度和眼部长度。当眼部高宽比小于270时,可以视为闭合状态;当高宽比大于400时,视为打开状态。将高宽比用于计算PERCLOS(单位时间内眼睛闭合时间所占的百分率)来衡量驾驶员的疲劳程度。PERCLOS值计算式如下:

(14)

PERCLOS度量的是单位时间内驾驶员眼睛闭合程度超过某一阈值(本文所用为70%)的时间占总驾驶时间的百分比。在美国联邦道路局的研究中,PERCLOS被证明是九种现有与疲劳驾驶有关的指标中相关性最好的。

1.5 嘴部fyawn特征计算

在确定的嘴部的大致区域后,本文使用LBP算法来检测打哈欠的行为。首先将整个区域划分为16×16的cell,在每个cell中,对于每一个像素,将自己的灰度值作为阈值,周围8个相邻像素点的灰度值若大于该阈值,则标记为1,否则标记为0。这样,与中心像素相邻的8个点就产生了一个8位二进制数,即为该中心点的LBP值。如,该矩阵的纹理信息即为(11010011)10= 211。之后计算每个cell的LBP直方图(即统计LBP值出现的频率),对直方图进行归一化处理。最后将得到的每个cell的统计直方图连接成为特征向量,也就是整个图像的LBP特征向量。图4为经过LBP处理后的矩阵。

图4 LBP处理过程

在获得驾驶员嘴部特征后,根据嘴部高宽比o来判断当前嘴巴是否处于张开状态,具体计算式如下:

(15)

由实验结果发现,当o大于1 200时,嘴部处于闭合或正常说话装填;当o小于700时,嘴巴处于张大状态。为了将驾驶员因受惊而嘴巴张开和打哈欠的状态区分开来,如果最近的6帧图像中有超过5帧嘴部处于张大状态,则判断驾驶员在打哈欠。最终,采用如下等式计算fyawn:

(16)

1.6 基于眼部和嘴部信息融合的估计算法

基于前文,本文已针对摄像机采集到的图像帧经过处理并针对不同模式下的脸部及嘴部进行识别。但我们知道,在现实场景中,驾驶员可能会说话。在这种情况下,嘴部信息可能会导致结果的误判,为了考虑这一点,本文提出一种基于权重的嘴部和眼部信息融合估计算法,得出最终用于判别驾驶员疲劳状态的FV(Fatigue Value)。以提高算法的稳定性。主要计算式如下:

FV=PERCLOS+β×fyawn

(17)

在具体判别过程中,若FV大于1 500,则判断驾驶员当前为疲劳驾驶状态,同时给予驾驶员及周围车辆警告。若FV小于700,则表明驾驶员精神状态良好。

2 实验结果与分析

2.1 实验环境配置

实验环境:训练模型所用计算机配备I9-9900K CPU、RTX 2070 SUPER显卡。视频录制设备为罗技C270网络摄像头,视频分辨率为1 280×720,采样频率为60fps。实验平台为Win10操作系统下的MATLAB2020a。

本文模拟了不同人员在清醒以及疲劳状态下驾驶过程并录制成视频作为数据集。视频录制场景分为白天自然光环境以及夜晚弱灯光环境,并要求模拟人员晃动头部以模拟实际行车过程中观察路面的动作,所有录制均在室内完成。其中包含白天自然光环境与夜晚弱灯光环境各200段视频,每段视频长度为30 s。

2.2 嘴部特征权重分析

经验表明,人在疲劳时会伴随眼睛的打盹及打哈欠状态。为了能够更好的预测出驾驶员是否处于疲劳状态及嘴部行为权重β在判别驾驶员疲劳程度中发挥的作用,本文将β从0开始(0即为不考虑嘴部行为)以0.05的步长增加到1,同时在夜晚及白天数据集下测试算法总准确度。结果如图5所示。

图5 权重β对实验结果精度的影响

从图5的结果可以看出,算法准确率在β=0.44处达到最高值,在β小于0.2及β大于0.55区间内算法准确率均以较大程度下滑。本文将采用=0.44作为系统的权值 。

2.3 夜间环境算法准确率分析

夜晚场景如下表所示,为验证帧间差分算法的有效性,本文实现了经典AdaBoost与SVM算法,并与本文算法进行对比,结果如表1所示。

表1 夜间环境算法准确率比较

实验结果表明,帧间差分算法在夜晚疲劳状态及夜晚清醒状态下,识别准确率均高于经典AdaBoost算法及SVM算法。帧间差分算法比AdaBoost算法在两种数据集上分别高了2.8%和4.1%,比SVM算法在两种数据集上分别高了7.6%和11.1%。在整个夜晚场景数据上,帧间差分算法判别准确率比AdaBoost算法和SVM算法分别高了3.5%和9.4%。另外,3种算法均在疲劳数据集上有更好的表现。

2.4 算法准确率分析

为验证算法整体准确性,将本文算法在全部数据集上与当前主流的驾驶员疲劳识别方法相比较,包括SVM方法、经典AdaBoost算法以及EGG脑电图[10]、脉搏和HPM头位置测量法[11]等接触式判别方式,结果如表2所示。

图6 本文算法在各场景下实际运行结果

表2 整体算法准确率比较 单位:%

实验结果表明,本文算法在4个场景下均表现良好。具体来看,在夜晚清醒场景下,本文算法准确率为90.3%,相比于次高的HPM头位置测量法有一定程度的提高,但相较于对比的AdaBoost算法准确率有4.1%的上升,在有挑战性的夜晚环境中上升幅度明显。其余算法在夜晚-疲劳环境下表现不理想。在日间清醒场景下,本文算法较之前夜晚环境下有3.3%的提升,达到了4个场景中最高的93.6%。其余算法中准确率最高的是经典AdaBoost算法,达到了91.7%。因此,将嘴部开合动作加入到判断驾驶员疲劳模型中是有效的。在夜晚疲劳场景中,本文算法对比经典AdaBoost有2.8%的提升。HPM头测量法依旧在夜晚场景上表现良好,达到90.4%。在日间疲劳场景上,本文算法正确率达到93.4%,相对于日间清醒场景的93.6%下降了0.2%。经典AdaBoost和HPM头测量法对比本文算法分别下降了0.8%和1.7%。

整体上看,基于脉搏测量的判别方法在四个场景下表现均不理想,准确率保持在65%—70%范围内。基于脸部识别的本文算法、经典AdaBoost和SVM方法在日间和夜间场景上有较大性能差异,日间场景准确率比夜间场景平均有4.0%的提升。其中经典AdaBoost方法相差最大,达到4.9%;SVM次之,为4.3%;本文算法在两个场景之间相差最小,为2.8%。因此,帧间差分的识别方式增强了算法的鲁棒性。此外,基于接触式人体信号检测的EGG脑电图方法和脉搏测量法在日间和夜间场景上准确率变化分别为-0.6%和-1.7%,稳定性比基于人脸识别的方法好得多,说明夜间光照条件不佳仍是算法性能的主要瓶颈,之后的工作可以围绕接触式测量与人脸识别特征相结合的方向展开。

最后,本文所提出的算法可以在便携式计算机上实时运行,能够满足车载设备实时监测算法的复杂度要求。

3 总结

本文提出一种基于AdaBoost和LBP算法的实时疲劳驾驶预警监测系统,首先对摄像机采集到的视频进行视频关键帧提取,对视频关键帧进行图像预处理,采用Canny算法进行人脸边缘检测确定人脸位置。接下来主要用于识别眼睛和嘴巴,主要分为2种情况:在白天模式下,采用AdaBoost算法精确识别出脸部的眼睛和嘴巴;在夜间模式下,采用帧间差分算法获取瞳孔信息再通过人脸面部构造估计出嘴部位置。当对眼部和嘴部进行精准定位后,提取眼部信息并计算PERCLOS值,采用LBP算法检测嘴部开合程度及频率。为了进一步明确眼部和嘴部对疲劳驾驶结果精度的影响,本文添加β参数用于眼部和嘴部的权重平衡,最终对驾驶员是否处于驾驶状态进行预测并预警。相比于其他方法,本文所提出的方法在白天模式下可提高4%,在夜间模式下可提高3%,并且具有更好的稳定性。

猜你喜欢
眼部准确率驾驶员
基于高速公路的驾驶员换道意图识别
基于眼动的驾驶员危险认知
驾驶员安全带识别方法综述
乳腺超声检查诊断乳腺肿瘤的特异度及准确率分析
不同序列磁共振成像诊断脊柱损伤的临床准确率比较探讨
2015—2017 年宁夏各天气预报参考产品质量检验分析
颈椎病患者使用X线平片和CT影像诊断的临床准确率比照观察
窥见眼部瑜伽
基于matlab的纯电动客车驾驶员行为分析
美目莫忘眉