基于深度学习的船舶驾驶员疲劳检测算法*

2022-03-20 14:42神和龙吕红光
交通信息与安全 2022年1期
关键词:嘴巴人脸驾驶员

王 鹏 神和龙 尹 勇 吕红光

(1.大连海事大学航海动态仿真和控制交通行业重点实验室 辽宁 大连 116026;2.大连海事大学航海学院 辽宁 大连 116026)

0 引 言

中国是1个航运大国,海上交通运输行业的发展非常迅速。随着现代科技和造船技术的快速发展,船舶逐渐向大型化、自动化和智能化发展,由此导致的海上安全事故也显著增加[1]。据统计,80%的海上安全事故与人为因素有关,其中由于疲劳驾驶导致的海上事故占了相当比例[2]。为了保证船舶航行安全,最大程度地降低海上安全事故发生的概率,提出1种实时性强、误警率低的船舶值班驾驶员疲劳检测算法就显得尤为重要。

目前,对于驾驶员疲劳检测的研究主要集中在机动车领域,主要有基于生理信号[3]的疲劳检测算法、基于车辆行为特征[4]的疲劳检测算法以及基于计算机视觉的疲劳检测算法。与其他方法相比,基于计算机视觉的疲劳检测方法具有易实现、成本低且不会在驾驶过程中干扰驾驶员等优点,是目前应用最为广泛的驾驶员疲劳检测算法。

基于计算机视觉的疲劳检测方法以摄像头等图像传感器获取到的驾驶员面部图像为基础,运用计算机视觉中人脸检测、面部特征点定位等算法,对驾驶员的脸部变化如眼睛睁闭、嘴巴张合以及头部姿态等特征进行提取和分析,从而实现对驾驶员疲劳状态的实时检测。刘梦佳等[5]利用Dlib库检测人脸区域并进行人脸特征点标注,计算眼睛宽高比获得眼睛睁闭状态,最后利用改进的PERCLOS来判断是否疲劳。王迪[6]使用Adaboost级联分类器检测人脸,精确定位人眼并提取人眼特征参数,提出了1种基于模糊综合评价的疲劳检测算法。黄玲等[7]采用传统图像HOG特征结合SVM分类器检测驾驶员人脸,利用级联回归器定位特征点、提取时间窗口内的疲劳指标识别疲劳状态。张博雅[8]采用Adaboost算法进行人脸检测,回归树算法定位8个人脸特征点,进而计算PERCLOS参数来识别疲劳状态。Liu等[9]利用多块局部二值算法(MB-LBP)和Adaboost分类器检测人脸关键点,提取眼部特征判断驾驶员是否疲劳。郭佳伟[10]对MobileNet-SSD模型采用剪枝和量化的策略进行优化,并将其应用到疲劳检测算法的人脸检测模块中,取得了较好的检测效果。Li等[11]使用1种改进的YOLO v3-tiny卷积神经网络来捕捉复杂驾驶条件下的面部区域,消除了人工特征提取带来的误差和影响。在模拟驾驶应用中,准确率为95.10%。陈军等[12]采用VGG模型进行特征提取,设计了1种级联卷积神经网络疲劳检测框架。

船舶驾驶台相较于车辆最大的不同在于空间大,背景复杂,拍摄的驾驶员多为半身,人脸区域较小。在此种环境下,传统疲劳检测算法采用人工提取疲劳特征,计算特征点间距的方式识别疲劳状态,容易受环境因素的干扰,单一指标判别也存在检测准确率低、鲁棒性差等问题。针对以上问题,提出了1种基于深度学习的疲劳检测算法,使用卷积神经网络对驾驶员的眼睛、嘴巴进行特征提取与状态识别,实现多特征融合的疲劳状态检测。

本文贡献主要有以下3个方面:①在网络结构方面,使用轻量级网络MobileNet替换RetinaFace的主干特征提取网络,显著降低了模型参数量,提升了检测速度;②在特征提取方面,舍弃了传统手动提取疲劳特征的方法,使用训练好的ShuffleNet V2网络自动识别睁眼、闭眼,打哈欠或正常,有效提高了算法的检测精度;③在疲劳判断方面,结合眼睛、嘴巴特征参数,综合判断船舶驾驶员是否疲劳,有效改善了单一指标判别造成检测准确率低、鲁棒性差等问题。

1 疲劳检测流程

笔者提出的基于深度学习的疲劳检测算法可分为人脸检测与关键点定位、特征状态识别和疲劳状态判定3大模块。算法流程图见图1。首先利用改进的人脸检测模型RetinaFace检测出实时捕获的画面中的驾驶员人脸图像,根据标注出的5个人脸关键点定位眼睛、嘴巴位置;然后裁剪出眼睛、嘴巴图像,进行眼睛、嘴巴开闭状态的识别;最后采用多特征融合的思想,根据眼睛、嘴巴的开闭状态进行疲劳判定,从而对船舶驾驶员的疲劳状态进行实时检测和预警。

图1 算法流程图Fig.1 Overall flow chart of algorithm

2 基于RetinaFace的人脸检测算法

人脸检测是本研究的关键性技术之一。与机动车驾驶室相比,船舶驾驶台空间大,拍摄的驾驶员多为半身,人脸区域小,且背景复杂,容易被干扰。综合考虑疲劳检测的精度和实时性,针对人脸检测能力出众的RetinaFace模型进行精简、优化,在保证检测精度的前提下尽可能降低模型的复杂程度,提高实时性。

2.1 RetinaFace人脸检测网络

RetinaFace是InsightFace团队2019年提出的1种鲁棒的单阶段人脸检测器[13],其检测流程见图2。它利用额外监督和自监督结合的多任务学习,对不同尺寸的人脸进行像素级定位,在WIDER FACE数据集上有着非常好的表现。

图2 RetinaFace人脸检测模型示意图Fig.2 Schematic diagram of RetinaFace model

2.2 人脸检测

为了满足疲劳检测的实时性要求,采取优化网络结构的思想,尽可能地减少参数量。使用轻量级的卷积神经网络MobileNet对RetinaFace的主干特征提取网络ResNet50进行替换。MobileNet[14]的核心思想是用深度可分离卷积(depthwise separable convolution)代替普通卷积,见图3。

图3 深度可分离卷积示意图Fig.3 Schematic diagram of depthwise separable convolution

使用深度可分离卷积代替普通卷积可显著减少模型的参数量。对于1个卷积点而言:假设有1个3×3大小的卷积层,其输入通道为16,输出通道为32。具体为32个3×3大小的卷积核会遍历16个通道中的每个数据,最后可得到所需的32个输出通道,所需参数为16×32×3×3=4 608个;应用深度可分离卷积,用16个3×3大小的卷积核分别遍历16通道的数据,得到了16个特征图谱。在融合操作之前,用32个1×1大小的卷积核遍历这16个特征图谱,所需参数为16×3×3+16×32×1×1=656个。

改进的RetinaFace人脸检测模型使用原作者标注好的人脸数据集WIDER FACE[15]进行训练,该数据集共有32 203张图像和393 703个人脸框。人脸在尺度、姿态、遮挡、表情、装扮、光照等方面都有很大差异,人脸特征具有多样性。训练模型时,通过在61个场景分类中随机采样,WIDER FACE数据集被分为3个子集,其中的40%用于模型训练,50%作为测试集,剩余的为验证集。训练模型正负样本的处理参考原始RetinaFace的训练方法。

使用多任务卷积神经网络(multi-task convolutional neural network,MTCNN)[16]、原版RetinaFace和改进后的RetinaFace进行对比实验。结果见图4,在密集人脸环境中,改进后的RetinaFace检测出51张人脸,远多于MTCNN的33张人脸,略少于原版网络的58张人脸;在检测速度方面,改进后RetinaFace网络的检测帧率为22.60帧/s,相比于原版网络和MTCNN提升近1倍。使用的深度学习框架为Pytorch,测试硬件环境为Nvidia GTX950M GPU,测试软件为Pycharm2020。

图4 RetinaFace改进效果示意图Fig.4 Improvement effect of RetinaFace model

3 基于卷积神经网络的疲劳检测

传统针对车辆驾驶员的疲劳检测算法大多采用计算特征点间距的方式提取疲劳特征,进而识别疲劳状态。由于船舶驾驶台空间大,背景复杂,人脸区域图像相对较小,检测密集人脸关键点存在易受干扰,鲁棒性不强等问题。因此提出了1种基于卷积神经网络的眼睛、嘴巴状态识别模型,自动提取图像特征,判断眼睛、嘴巴状态,进而识别船舶驾驶员的疲劳状态。

3.1 眼睛、嘴巴图片的裁剪

由于检测到的人脸大小不一,本文采用1种自适应方法进行眼睛、嘴巴图片的裁剪,即根据Retina-Face检测到的5个人脸关键点和人脸大小来确定眼睛、嘴巴图片的尺寸采用式(1)~(2)计算。

式中:Le是左右人眼关键点的距离,pixel;Lm是左右嘴角关键点的距离,pixel;W和H分别是眼睛、嘴巴图片的宽和高,pixel。

确定眼睛、嘴巴裁剪区域后的人脸图像见图5。

图5 眼睛、嘴巴裁剪区域示意图Fig.5 Cropped area of eyes and mouth

3.2 基于CNN的眼睛、嘴巴状态分类网络

针对传统眼睛、嘴巴状态识别算法需要人工提取特征,易受环境因素干扰鲁棒性不强的问题,提出了1种基于卷积神经网络的眼睛、嘴巴状态识别模型。利用channel split和channel shuffle思想[17]搭建改进的ShuffleNet V2卷积神经网络,在网络的特征提取部分,Channel Split运算将输入特征按通道数分为2组进入左右2条支路,在分组卷积之后进行通道拼接,同时使用Channel Shuffle操作将组间的特征进行打乱,从而提高图像特征的信息重用;在每次卷积之后使用批量归一化[18]对数据流进行优化,使每1层神经网络的输入保持相同的分布,避免产生梯度消失问题。在网络的分类部分,使用全局平均池化层(global average pooling)代替全连接层,可以更好地将类别与最后1个卷积层的特征图对应起来;加入Dropout层防止网络过拟合。

图6所示是网络常用的2个模块:当卷积步长等于1的时候,采用左边的模块,由于残差边没有卷积,因此宽高不变,主要用于加深网络层数。当卷积步长等于2的时候,采用右边的模块,由于残差边有卷积,因此宽高可变,主要用于压缩特征层的宽高,进行下采样。

图6 ShuffleNet V2常用卷积块Fig.6 Convolution blocks of ShuffleNet V2

实验使用的数据集均来自现有的相关数据集和自行拍摄的视频图像。其中,眼睛数据集中包含闭眼样本10 000个,睁眼样本10 000个;嘴巴数据集中包含打哈欠样本12 500个,正常样本12 500个。2个数据集均按照7∶2∶1的比例划分训练集、验证集和测试集。部分眼睛、嘴巴样本见图7。

图7 部分眼睛、嘴巴样本Fig.7 Partial samples of eyes and mouth

实验中采用迁移学习的思想分2个步骤进行训练,采用数据增强技术对图片进行一定比例的缩放、随机位置的截取、随机水平翻转等,扩充了训练的数据集,减少了过拟合的问题。

1)预训练。加载ShuffleNet V2网络的预训练模型,该模型由ImageNet训练而来,可以实现1 000种图像的分类任务,具有较强的特征提取能力。重新初始化其分类部分的模型权重,使之适合本文搭建的眼睛、嘴巴状态分类网络。冻结网络特征提取部分的权重,只训练分类部分。设置网络batch_size为16,学习率为0.001,Dropout为0.5,采用随机梯度下降(stochastic gradient descent,SGD)的优化方法训练30个epoch。由于冻结了大部分的模型权重,整个训练过程仅花费不到30 min时间。

2)联合训练。解冻网络所有权重,联合训练网络的特征提取部分和分类部分。保持超参数不变,采用适应性矩阵估计(adaptive moment estimation,adam)的优化方法训练30个epoch,使网络模型提取的图像特征更契合于本文的分类任务。

最终眼睛、嘴巴分类网络的训练曲线见图8~9。其中图8(a)和图9(a)表示预训练阶段损失和准确率的变化曲线,图8(b)和图9(b)表示联合训练阶段损失和准确率的变化曲线。在预训练阶段,得益于预训练模型较强的特征提取能力,网络的训练损失和验证损失迅速下降,并收敛到0.30和0.10以内;在联合训练阶段,网络的训练损失和验证损失进一步下降并收敛至0.060和0.025以内。在测试集上眼睛状态的识别准确率为99.71%,嘴巴状态的识别准确率为99.59%。

图8 眼睛分类网络的训练曲线Fig.8 Training curve of eyes classification network

图9 嘴巴分类网络的训练曲线Fig.9 Training curve of mouth classification network

其他几种常见的卷积神经网络在自建眼睛数据测试集上的分类准确率及速率见表1。相对于经典的卷积神经网络,笔者提出的基于迁移学习思想改进的ShuffleNet V2网络有着更加强大的特征提取能力,使用channel split运算减少了模型计算量,无论在检测精度还是检测速率上都有了明显提升,同时还能通过迁移学习的方式节省训练时间。

表1 不同模型在自建眼睛数据集上的分类对比Tab.1 Classification comparison of different models on self-built eye dataset

使用改进的ShuffleNet V2网络识别眼睛、嘴巴状态,并将网络Stage2/3/4的输出特征图进行可视化,结果见图10。较浅层特征图Stage1具有更多的图像纹理,细节丰富且分辨率较高,随着网络的加深,输出特征图包含了更多的全局语义信息,分辨率较低。从热力图可以看出,改进的ShuffleNet V2网络在进行分类时聚焦于图像的正确位置,并输出正确的分类结果,解释了本文模型有着较高的分类准确率。

图10 眼睛、嘴巴状态识别结果Fig.10 Recognition results of eye and mouth status

3.3 基于眼睛、嘴巴特征融合的疲劳检测

当驾驶员疲劳时面部会出现疲劳特征,如长时间持续闭眼、缓慢眨眼、打哈欠等现象,因此可以通过获取驾驶员眼睛、嘴巴的状态信息来判断驾驶员的疲劳程度。闭眼百分率(percentage of eyelid closure over the pupil over time,PERCLOS)是1种度量驾驶员精神状态的物理参数[19]。其定义为单位时间内闭眼时长所占的比例,有P70,P80,EM这3种标准。P80标准认为眼睛开度低于20%为闭合状态,高于80%为睁开状态,与疲劳发展程度的相关性较好。当该参数超过一定的阈值时就可以认为驾驶员产生了疲劳。由于打哈欠的频率也可以有效地反映驾驶员疲劳状态,所以本文将PERCLOS参数也应用到打哈欠频率的检测当中。2种参数的计算见式(3)。

式中:Pe和Pm分别为眼睛和嘴巴PERCLOS参数;Te和Tm分别表示单位时间T内眼睛闭合及嘴巴张开角度超过正常状态的累计时间;N为的是单位时间T内采集到的视频总帧数,Ne和Nm分别为单位时间T内眼睛闭合以及嘴巴张开角度超过正常状态累计帧数。通过对眼睛和嘴巴的PERCLOS参数设定合适的阈值,当计算出的Pe或Pm超过设定的阈值,就可以认为驾驶员此时处于疲劳状态。

为了确定合适的PERCLOS阈值,从公开用于设计和测试疲劳检测算法的YawDD视频数据集[20]中随机截取100个视频序列,其中50个疲劳状态,50个正常状态,每个视频10 s。经过检测得知,疲劳状态下眼睛的PERCLOS参数Pe在0.30~0.70之间,嘴巴的PERCLOS参数Pm在0.35~0.80之间。为此,以0.05为间隔,针对不同的PERCLOS参数阈值做了对比实验,结果见图11。当Pe=0.35,Pm=0.4时,误检、漏检最少,检测的准确率最高。

图11 对比实验结果Fig.11 Compare experimental results

4 实验设计与结果分析

由于目前还没有针对船舶驾驶员疲劳检测的公开数据集,故本文使用在航海模拟器中自行拍摄的视频数据集进行算法验证。自建数据集共有100段视频,50段正常,50段疲劳,每段30 s左右,包含不同驾驶员在不同光照环境下拍摄的模拟驾驶视频。每段视频包含不同的眼睛、嘴巴状态。自建数据集可以较好地模拟船舶驾驶台值班环境的复杂性,比如空间范围大、容易遮挡、环境光线差异大、背景复杂等,更能够体现算法的实用性。

将算法各部分模块进行整合,使用PyQt结合QtDesigner对系统界面进行设计与开发。系统可以接入摄像头进行实时检测,也可以读取本地的视频文件进行检测,支持MP4和AVI等主流视频格式。右侧可以调节疲劳参数阈值和检测周期,控制检测的开始与结束,显示检测结果。在航海模拟器中的检测效果见图12。

图12 部分疲劳检测结果Fig.12 Partial results of fatigue detection

由图12不难看出,本文提出的基于深度学习的疲劳检测算法可以较为准确地检测出驾驶员的疲劳状态,对不同环境光照、是否戴眼镜、侧脸等干扰因素具有较强的鲁棒性。

为了进一步验证算法的有效性,在自建数据集中随机选取24段视频,以每100帧为1个检测周期统计这24个视频中真实疲劳次数Nt,算法检测疲劳次数Nd,以及算法检测正确的疲劳次数Np。计算算法的精确率和召回率见式(4)。

实验中还加入了2种常见的疲劳检测方法作对比,实验数据见表2。可以看出,本文提出的疲劳检测方法无论在精确率还是召回率方面,均优于传统Haar-like+Adaboost的疲劳检测方法[4]以及目前比较流行的MTCNN+CNN的疲劳检测方法[12]。经过分析,出现漏检和误检的情况主要是因为环境光较暗以及眼镜反光等因素的影响,相对来说正常光照下的检测效果会更好。

表2 不同疲劳检测算法结果对比Tab.2 Comparison of different fatigue detection algorithms

以上实验结果表明,与传统的疲劳驾驶检测算法相比,基于深度学习的疲劳检测算法可以自动对输入的图像进行特征提取,挖掘目标图像的深层信息且不依赖人工的参与。与其他深度学习模型相比,基于迁移学习的训练策略显著节省了训练的时间;使用的全局平均池化、批量归一化以及Dropout等技术,有效改善了模型对疲劳表情的识别能力,提高了疲劳检测的准确率,对船舶驾驶台的复杂环境具有较强的鲁棒性。一般情况下,驾驶员的眨眼频率为15~20次/min,平均每次眨眼持续0.2~0.4 s。本文提出的疲劳检测算法在Nvidia GTX950MGPU上运行时检测每张图片只需要0.083 s。使用本文算法基本可以实现对驾驶员疲劳状态的实时检测。

5 结束语

本文提出了1种基于深度学习的疲劳检测算法。在人脸检测方面,对检测能力更强的RetinaFace网络加以改进,提高了网络的检测速率;在特征识别方面,舍弃了传统的手工提取特征的方法,使用改进的ShuffleNet V2网络自动提取图像的深层信息,进而识别眼睛、嘴巴的开闭状态,在识别精度和速率上均有所提升;在疲劳检测方面,基于PERCLOS准则,融合眼睛、嘴巴特征综合判定驾驶员是否疲劳。实验结果表明,本文算法的精确率和召回率均高于传统疲劳检测方法,使用PyQt开发的图像界面程序在模拟驾驶环境中能够准确检测出驾驶员的疲劳状态,对不同环境光照、是否戴眼镜、侧脸等因素的干扰具有较强的鲁棒性,能够较好地适应船舶驾驶台的复杂环境,同时可以满足实时检测的要求。在后续工作中,尝试改进算法以提高复杂环境下疲劳检测算法的可靠性。

猜你喜欢
嘴巴人脸驾驶员
基于高速公路的驾驶员换道意图识别
基于眼动的驾驶员危险认知
驾驶员安全带识别方法综述
有特点的人脸
一起学画人脸
嘴巴嘟嘟
嘴巴不见了
如何提高汽车驾驶员预防事故的能力
好好的嘴巴
三国漫——人脸解锁