APP下载

基于驾驶员面部时序数据的疲劳驾驶检测算法

2022-03-25欧阳麟吴仲城

测控技术 2022年2期
关键词:准确率驾驶员状态

欧阳麟, 吴仲城, 张 俊, 李 芳

(1.中国科学院 强磁场科学中心,安徽 合肥 230031;2.中国科学技术大学,安徽 合肥 230026;3.强磁场安徽省实验室,安徽 合肥 230031)

世界卫生组织(WHO)指出,道路交通事故是对全球公众身体健康造成伤害的最重要原因之一。如《2018年世界道路安全状况报告》[1]中所述,交通事故是致死和致伤的重要原因,每年有接近140万人死于交通事故,还有数百万人因交通事故受伤或致残。图1显示了2004年—2016年间因道路交通事故死亡的人数,可知死亡人数每年以缓慢的趋势上升。

图1 2014年—2016年因道路交通事故死亡的人数[1]

2013年在摩洛哥进行的一项研究[2]表明,该国每年因疲劳驾驶而死亡的人数高达4000多人,同时造成经济损失高达14亿美元。轻度疲劳占到了事故比例的36.8%,重度疲劳占到了31.1%,如图2所示。研究还指出,有42.4%的驾驶员未能按照每500 km或2 h 休息15 min的标准进行驾驶。

图2 调查人群中各类人所占比例

同时,因个人体质不同,每个人所需休息时间和休息间隔不同,因此,单纯依靠遵守规则并不能完全避免驾驶员疲劳驾驶行为,需要一种能检测到疲劳驾驶行为的方法,并通过警报提醒驾驶员或上传控制中心,避免交通事故的发生或降低损失。

在早期的疲劳检测研究中,主要使用驾驶员的生理信号来进性检测,如眼电图[3]、心电图(ECG)[4]、脑电图、肌电图,通过附着在驾驶员身上的各类传感器,获取生理数据[5],分析正常状态和疲劳状态下生理数据的差异来判断疲劳与否,这种方法检测精度高,但是需要驾驶员的配合以及昂贵的信号采集设备,需要与驾驶员的身体进行接触,比较容易引起驾驶员的不适和反感。另一种是基于行驶中车辆本身的方法,如通过研究车速、车辆轨迹、车道偏离等,来判断疲劳驾驶状态。Ma等[6]通过小波分析和神经网络来计算目标车辆的横向距离来预测驾驶员疲劳状态,这种方法受限于车道、驾驶员驾驶习惯,以及路面状况等,通常很难应用于复杂的实际场景中。还有一种通过摄像头捕捉驾驶员面部信息的方法,通过分析眨眼频率、是否打哈欠、PERCLOS(Percentage of Eyelid Closure over the Pupil)[7]等疲劳特征来判断驾驶员的状态,Alioua等[8]通过Hough提取眼部和嘴部特征,利用SVM(Support Vector Machine,支持向量机)分类器来完成疲劳状态判断。这种基于计算机视觉的方法因其低侵入性、低成本的特点,受到了较广泛的应用。

近年来,以CNN(Convolutional Neural Networks,卷积神经网络)为代表的深度学习模型[9]在计算机视觉领域的一系列问题(如分类、目标检测、图像分割等)上取得了巨大的成功。如果将疲劳检测视为图像分类问题,则很容易应用深度网络模型。例如,Kurylyak等[10]提出的基于卷积神经网络的哈欠检测算法,直接将驾驶员面部图片输入神经网络,Softmax分类器用于判别驾驶员疲劳状态,疲劳(1)或非疲劳(0),在YawDD[11](Yawning Detection Dataset)上取得了95.81%的准确度。但是在实际应用中,疲劳状态往往是以序列的形式出现的,是一个动态的过程,很难通过单张图片来判断驾驶员是否疲劳。基于时序数据的方法大多通过加窗的方式,对窗口内的数据加以处理,并手动提取特征,例如钟奕辉[12]根据窗口内的视频帧计算眨眼间隔时间估计疲劳程度;Junaedi等[13]先判断视频帧中人眼部的状态,再计算PERCLOS值来判断疲劳状态,并使用P60[14]标准在YawDD上获得了最高83.66%的准确率。这种方法需要手动设置阈值,根据提取特征与阈值进行比较,当驾驶员脸部差异较大或个人习惯不同时,阈值不同,泛化性不强。另一种方法对手动提取的特征进行特征融合[15]或接入如SVM[16]、MLP(Multilayer Perceptron,多层感知机)等分类算法对疲劳状态进行识别,这两种方法都需要手动设计特征且只针对脸部部分区域(如眼部、嘴部特征),不能充分利用脸部疲劳特征。

基于以上研究,本文提出了一种基于CNN和长短期记忆(Long Short-Term Memory,LSTM)单元的端到端可训练网络,并利用MTCNN(Multi-Task Cascaded Neural Networks,多任务级联神经网络)检测人脸关键点,提取感兴趣区域(Region of Interest,ROI),将拼接后的融合了嘴部区域和眼部区域的ROI放入CNN中提取特征,多帧图片提取后的特征再经过LSTM单元学习序列特征,输出疲劳状态(疲劳、打哈欠、非疲劳)。模型通过逐帧处理而不是基于窗口预测,因此,它检测速度快,消耗的计算成本较低,并且能够实时工作。实验表明本文方法在疲劳检测数据集NTHU-DDD[17]中获得了98%以上的准确率并有较好的实时性。

1 疲劳检测算法流程

疲劳检测算法整体流程图如图3所示。

图3 疲劳检测算法流程图

具体流程如下:

① 图片经过一个MTCNN[18]提取ROI,将ROI调整成网络输入所需的比例后拼接成单张图片输入进CNN。

② CNN对连续视频帧中的ROI进行特征提取,提取后的序列特征进入LSTM单元学习时序特征。

③ LSTM提取的特征经过Softmax分类器对当前视频帧进行分类(正常、疲劳、打哈欠3种状态)。

2 数据准备

2.1 数据集

YawDD是由Abtahi等制作的视频数据集,用于哈欠检测模型的设计与测试,其中包含了多名驾驶员在驾驶位上的视频。视频分为两部分,一部分是摄像头位于车内后视镜下方,侧对着驾驶员录制得到的;另一部分是摄像头位于仪表盘上方,正对着驾驶员,采集到驾驶员的正面图像,每秒采集30帧。每个驾驶员录制3~4段视频。此数据集用于验证模型的泛化性。本文取正脸部分数据集,按照视频文件的分类将数据集分为打哈欠和正常两种状态。

疲劳驾驶检测数据集采用来自于台湾国立清华大学的NTHU-DDD[17](Driver Drowsiness Detection),包括正常驾驶和疲劳驾驶的视频数据集。在白天和黑夜两种场景下拍摄,包含了戴眼镜、不戴眼镜、打哈欠、低头等多种动作。图像帧像素格式为640像素×480像素,每段视频平均60 s左右,每秒取15帧(黑夜)或30帧(白天)。此数据集用于模型的训练与测试。由于数据集的标签只有0(正常)和1(疲劳)状态,而本文模型输出3种状态(正常、疲劳和打哈欠),于是对数据集重新制作标签,将本来类别为1(疲劳)的视频帧按照顺序分为1(疲劳)和2(打哈欠)。图4为从NTHU-DDD中的一段连续的视频均匀采样截得的视频帧。

图4 NTHU-DDD部分视频帧

NTHU-DDD分为训练集、验证集和测试集,其中训练集来自18位志愿者,共360段视频,包括723248个视频帧;验证集来自4位志愿者,共20段视频,包括173299个视频帧;测试集包括所有志愿者的70段视频,包括736132个视频帧。

YawDD采用的正脸部分数据集包括16段男性视频和13段女性视频,男性视频共有36126帧,女性视频共有28467帧。YawDD中的数据仅用于测试。

2.2 ROI提取

生物医学研究表明,疲劳状态是一个渐进的过程,初期表现为眨眼频率变高、打哈欠、哈欠持续时间变长,后期表现为眼睛闭合程度增大、眼睛闭合时间增长等。因此面部区域中能表现疲劳特征的是眼部和嘴部,为了去除无关信息,而将有用的ROI送入CNN中进行训练,首先应用MTCNN提取面部关键点,基于特征点截取出眼部和嘴部区域,再拼接成整个图片。

2.2.1 图片角度矫正

由于本文数据集中存在部分视频帧未能正脸面对摄像头,可能会出现头部向左或者向右偏转的情况。为了能够正确提取出ROI,对于这种图片,首先需要对其进行角度矫正,如图5所示。

图5 图片旋转过程

图5中,假设在图片经过MTCNN后输出的关键点中,左眼和右眼分别为A点(xA,yA)和B点(xB,yB),那么此时两眼连线与水平方向的夹角θ(即倾斜角度)为

(1)

将图片围绕中心点Z(x0,y0)旋转θ°,即可调整至水平状态。此时原图片中任意点的坐标P(xi,yi)将调整至P′(x′i,y′i)。计算规则如下:

yi=2y0-yi

(2)

2.2.2 提取眼部ROI

得到2.2.1节中输出的图片及关键点坐标后,提取眼部ROI,如图6所示。

图6 提取眼部ROI

图6中眼部矩形框即为提取的ROI区域,坐标点以及矩形框宽度w、高度h之间的关系如下:

(3)

式中:xC为C点x轴坐标;yC为C点y轴坐标;d为两眼之间横向距离。

同理,右眼区域与左眼区域经过相同处理。

2.2.3 提取嘴部ROI

嘴部区域ROI处理与眼部类似,将比例调整至合适范围内。如图7所示,嘴部矩形框左上角C点的坐标为

图7 提取嘴部ROI

(4)

式中:xC为C点x轴坐标;yC为C点y轴坐标;d为两眼之间横向距离。

将NTHU-DDD中所有视频帧在训练之前都进行上述ROI提取处理,将得到的结果拼接成为一张新的图片,正好可以得到一张长宽大小相同的图片。部分训练集图片如图8所示。将图片调整为227像素×227像素的格式,做好数据标签,以便下一步训练网络所用。

图8 经过ROI提取后的数据集

3 基于CNN和LSTM的疲劳检测网络

3.1 CNN

CNN因其在ImageNet上的出色表现,受到了大量的关注和研究,广泛应用于各类视觉任务。随着网络层数的加深,模型的表达能力也越强,然而当网络层数到达一定程度,由于梯度消失问题,导致在视觉任务中的准确率不升反降。ResNet使用跳连接[19],即残差块(Residual Block)来解决这类问题,使得在复杂的视觉任务中可以更好地应用深度网络。ResNet基本单元如图9所示。

图9 ResNet基本单元

笔者选用的用于提取面部特征的ResNet-18中使用了4组这样的单元,每组2个。

使用从ImageNet上迁移过来的网络,加载预训练权重,开放部分权重用于训练,加快收敛速度,防止过拟合。除了ResNet-18外,还使用了VGG-16[20],DenseNet[21]、AlexNet[22]这些在ImageNet上表现出色的网络用于对比特征提取器的效果。

3.2 LSTM

LSTM[23]是递归神经网络(Recurrent Neural Network,RNN)的改进网络。区别于CNN对单张图片的特征提取及分类,LSTM的模型输出与之前检测的视频帧结果是有关的。它将上一时序网络的隐层状态输出到下一时序网络中,与当前序列数据一同训练,因此,它更擅长于处理时序数据。RNN示意图如图10所示。

图10 RNN示意图

图10中,ht+1为当前序列的隐状态,它根据当前的训练样本xt+1以及上一序列的隐状态ht进行计算得出。LSTM在上述基本单元上又添加了3个控制门结构,即输入门、遗忘门和输出门,能够遗忘掉次要的特征信息而记住更明显的疲劳特征。

3.3 疲劳检测网络

笔者使用从ImageNet上迁移过来的ResNet-18提取特征,如图11所示。冻结部分层的权重,开放后n层进行fine-tune。连续的视频帧经过ROI提取后输入进ResNet-18,输出的线性特征再接入LSTM网络学习时序特征,最终输出的特征经过Softmax分类得到驾驶员疲劳状态。图11中的Basic Block为图9中的基本单元。

图11 疲劳检测网络结构图

4 实验与结果分析

4.1 网络训练

笔者采用随机裁剪、旋转和噪声处理进行数据增强,通过减去图片通道平均值实现归一化。优化器采用SGD(Stochastic Gradient Descent)算法。批次大小设为256,权重衰减系数设为0.0005,动量设为0.9,初始学习率设为0.01。并将LSTM单元的步长设为16,即选择连续的16帧作为检测窗口。权重采用预训练模型初始权重,开放后10层更新权重,防止过拟合,在NVIDIA GTX 1080Ti上训练的迭代次数为200。

4.2 算法在数据集上的性能比较

将ResNet-18与其他分类网络(AlexNet、VGG-16和DenseNet)用相同的配置进行训练,同时,用ResNet18在不经过ROI提取的原始数据集上进行训练以作为比较。实验中损失值以及验证集中准确率曲线如图12和图13所示。

图12 损失值变化曲线

由图可知,VGG网络在训练中的振动幅度较大,AlexNet-LSTM网络的检测效果最差,ResNet18和DenseNet提取面部特征的能力较为出色。经ROI提取后的ResNet18-LSTM网络性能最佳,在验证集上达到98.56%的准确率。在原始数据集上训练的ResNe18-LSTM达到了97.22%的准确率。相较于原始数据集,ROI提取明显抓住了反映疲劳特征的关键区域,提升了准确率。各网络在验证集上的最终识别准确率具体如表1所示。

表1 各网络在NTHU-DDD数据集上的准确率

各个主干网络在ImageNet上的精度与参数量大小信息如图14所示[24]。图14中圆形的中心为模型在图表中的位置,圆形的大小对应模型的参数量,横轴为计算量,纵轴为Top-1的准确率,越靠近左上角的模型计算复杂度越低、准确率越高,越小的模型参数越少。一般来说,网络参数量和计算量越大,表示模型容量越大,而精度越高代表网络提取特征的能力越强。由表1信息可知,主干网络提取特征能力越强,则迁移后的疲劳检测网络识别准确率越高,而模型参数量达到一定量级后,可能会出现过拟合而导致检测率不升反降。例如精度接近的VGG-16和ResNet-18,VGG-16由于模型过大而产生的过拟合(可通过表1中数据辅证,VGG-16在训练集上的精度很高,在验证集上却出现精度下降),导致疲劳检测网络中ResNet-18的精度要远高于VGG-16,且计算量更小。这说明在迁移学习任务中,选择适合的模型尤为重要。

图14 各主干网络精度与模型大小对比

接着将模型与其他同样在NTHU-DDD测试集上测试的基于时序数据的方法进行对比。不同方法使用相同的预处理方法,使用模型与最终准确率如表2所示。

由表2可知,基于LSTM网络的方法整体要优于视频帧中加窗分析的方法,而经过预处理后的数据集识别准确率也得到了提升,这说明本文预处理方法对于疲劳检测数据集是有效的。

表2 不同方法在NTHU-DDD测试集上的结果对比

4.3 参数讨论

下面讨论上文中提出的网络模型所涉及到的两个重要参数。通常驾驶员一次眨眼的过程需要约0.3 s,当出现疲劳驾驶时,司机眨眼变慢,一次眨眼过程持续时间更长。这对应于4.1节提到的LSTM中步长的选择。步长过大,则当前帧之前的视频帧对当前状态影响更大,LSTM可能会提取不重要的特征;反之,步长过小,则忽略掉的视频帧越多,可能会学习不到序列特征。因此,选择不同的步长进行实验,对比得出最佳步长为16。实验结果如图15所示,曲线代表准确率与步长的关系。

图15 步长对网络检测效果的影响

对于采用的ResNet-18预训练模型,开放层数也会影响模型精度,层数过多,可能导致在小样本数据集上不收敛,层数过低,可能学习不到数据集本身的特征,无法很好地迁移到目标任务中。通过实验得出当开放层数为10的时候,准确率达到峰值。开放层数与模型最终精度的关系如图16所示。

图16 开放层数与模型最终精确度的关系曲线

4.4 模型泛化能力

为了验证模型的泛化能力,将其应用于YawDD数据集,并与其他哈欠检测算法[13,26-27]进行比较,由于本文模型输出打哈欠、疲劳和正常3个状态,而数据集中只标注了打哈欠和正常2个状态,于是将输出为疲劳的数据归结于正常状态,测试结果如表3所示。

表3 不同算法在YawDD数据集上的检测结果

如表3所示,在基于PERCLOS的方法中,不同的标准(P60,P70,P80)下有不同的结果,表3中记录了方法在数据集多个部分中的最好结果。而本文方法在未经YawDD数据训练的情况下直接测试,达到了与主流哈欠检测算法近似的精度,由此说明模型泛化性较强。

4.5 算法实时性

为了测试模型在实际场景中的实时性,在NVIDIA GTX 1080Ti环境下检测连续的视频帧,将摄像头捕捉图片裁剪为200像素×150像素的大小,提取ROI后输入LSTM网络,测出检测速度为25 f/s,平均检测一帧的速度为40 ms,其中提取ROI所用时间与检测疲劳状态所用时间比例约为1∶1。在驾驶员疲劳检测任务中实时性较强。若将模型放于更高配置的GPU服务器上提供服务,则可以进一步提升检测效率。

5 结束语

本文首次提出了一种将LSTM应用于驾驶员面部时序数据中的方法,根据面部关键点提取疲劳特征ROI,通过迁移学习提取图像特征,并结合LSTM处理时序数据的能力,提出了一种能够检测疲劳驾驶的端到端可训练网络。在公开数据集中达到了较高的精度,同时具有较好的泛化能力,对于公共交通安全以及驾驶员人身安全保护具有很重要的意义。下一步研究可将模型放入云端,开发Restful API并提供HTTP服务,以此实时检测终端驾驶员的疲劳状态。

猜你喜欢

准确率驾驶员状态
基于高速公路的驾驶员换道意图识别
基于眼动的驾驶员危险认知
驾驶员安全带识别方法综述
乳腺超声检查诊断乳腺肿瘤的特异度及准确率分析
多层螺旋CT技术诊断急性阑尾炎的效果及准确率分析
不同序列磁共振成像诊断脊柱损伤的临床准确率比较探讨
颈椎病患者使用X线平片和CT影像诊断的临床准确率比照观察
智珠二则
生命的另一种状态
请你发明