基于Yolov5s 和Dlib 的面部遮挡驾驶员疲劳检测*
2024-01-12申家冰
申家冰 许 锋
(中国刑事警察学院公安信息技术与情报学院,辽宁 沈阳 110854)
引言
目前,国内外驾驶员疲劳检测方法分为基于车辆行为特征、驾驶员生理特征、驾驶员面部特征三种方法[1]。基于车辆行为特征的方法所用仪器价格昂贵,市场规模小,难以推广,且随着使用时间的增长,设备会因老化造成疲劳检测准确度下降[2]。基于驾驶员生理特征的方法可以实时检测且精度高,但因特征信号的侵入性采集,驾驶员会产生一定程度的不适感[3]。基于驾驶员面部特征的方法只需采集驾驶员的面部信息,精度高且成本低,不会使驾驶员产生不适感。综合上述分析,基于人脸面部特征的疲劳检测方法在精确度、实时性、成本方面有着更为明显的优势,值得进一步深入研究。
目前基于人脸面部特征的疲劳检测方法仍存在许多不足,许多情况下驾驶员开车需佩戴口罩,因面部遮挡造成收集的驾驶员面部特征减少,增添了驾驶员疲劳检测的难度。通过查阅文献及分析研究,发现国内外对驾驶员疲劳检测研究虽多,但对驾驶员面部遮挡情况下进行疲劳检测的方法较少,也缺乏针对性的总结。本文基于此设计了一套基于Yolov5s 和Dlib 的面部遮挡驾驶员疲劳检测预警系统,对驾驶员疲劳程度进行实时监测并及时给予提醒。
1 相关方法
1.1 Yolov5s 介绍
Yolov5s 模型作为Yolo 系列的最新版本,具有更优的检测精度和更快的推理速度。其中Yolov5s 的网络最小,虽然精度略低于其他三种,但检测速度最高[4]。因此,使用Yolov5s 符合本文的设计理念。Yolov5s 网络结构图,如图1所示。
图1 YOLOv5s 网络结构图
Yolov5s 模型由输入(Input)、特征提取网络(Backbone)、特征融合网络(Neck)、检测网络(Prediction)四部分组成[5]。Input 层负责控制输入图片的大小,Backbone 部分对目标的特征进行提取,Neck 部分主要负责增强主干网络所提取的特征,Prediction 部分使用GIoU Loss 函数对真实框和预测框之间的差距程度进行预测[6]。
1.2 人脸面部特征点定位
Dlib 库是一个机器学习的开源库,包含了机器学习的很多算法,使用方便且不依赖于其他库[7]。本文利用其中的shape_predictor_68_face_landmarks.dat 模型标注人脸的68 个面部特征点,获取人脸框架以及人脸特征点坐标,如图2 所示。根据获得的信息可以更好地判断驾驶员面部状态的变化,根据变化幅度大小进行眼部、头部、嘴部疲劳参数的计算。
图2 人脸68 个面部特征点
2 本文方法
2.1 综合检测流程
具体综合检测流程如图3 所示。首先读取摄像头中的画面,通过训练好的Yolov5s 模型判断驾驶员是否佩戴口罩,如果检测到佩戴口罩,通过计算EAR、HPE 数值以及设定的条件阈值来检测每分钟驾驶员眨眼次数、点头次数;如果检测到未佩戴口罩,在检测每分钟驾驶员眨眼、点头次数的基础上,计算MAR 数值以及设定的条件阈值,检测每分钟驾驶员打哈欠次数进行判断,其他判断条件与驾驶员佩戴口罩时疲劳检测一致。
图3 综合检测流程图
2.2 人脸疲劳特征分析
相关研究显示,当人们处于疲劳状态时面部会出现以下明显特征:眼睛眨眼频率降低、开合度变小,嘴巴张大打哈欠,头部开始点头打瞌睡。因此利用单位时间内眼睛眨眼次数、嘴巴打哈欠次数以及头部瞌睡点头次数,可以判断驾驶员的疲劳程度。此外,当人们疲劳时他们的眼睛会很难睁开,并且会比平时闭上更长的时间,这是人们在疲劳时出现的共性特征,所以利用人眼的疲劳特征进行驾驶员疲劳检测具有很强的通用性和可靠性。相比之下,人们疲劳时打哈欠嘴巴的开合程度和点头打瞌睡姿态变化的特征存在较大的个体差异,这会影响疲劳检测的准确性,因此本文将其作为辅助条件来判断驾驶员的疲劳状态。
2.3 眼部疲劳检测算法
本文使用人眼纵横比EAR 参数来计算单位时间内的眨眼次数,使用Dlib 库可以提取到左右眼的12 个特征点(37 ~42 为左眼,43 ~48 为右眼)。以左眼为例,利用眼部特征点的横、纵坐标计算EAR 值,EAR 值计算公式如下:
当人眼正常睁开时,EAR 值在短时间内变化幅度较小,在0.2 附近波动。当人眼闭合时,EAR 值迅速下降,完全闭合时EAR 值接近于零,为此国内外许多眼部疲劳检测算法将初始阈值设定为0.2,然后通过计算单位时间内眨眼次数来检测疲劳程度,没有将正常状态与疲劳状态的眨眼动作区分开。本文通过多次仿真实验对比,发现将初始阈值设置为0.18 可以满足实验要求,为此对于摄像头捕捉到的每一帧EAR 值,将其与阈值0.18 进行比较。当EAR 由某个值迅速下降至小于0.18,再迅速上升至大于0.18,则判断为一次眨眼。当驾驶员在正常状态下开车时,每分钟眨眼次数在15 ~30 次之间,而当驾驶员处于疲劳状态时,眼睛会长时间闭合,单位时间内的眨眼次数减少,通过计算单位时间内驾驶员的眨眼次数可以很好地判断驾驶员疲劳与否。
2.4 嘴部疲劳检测算法
本文使用嘴巴的长宽比 MAR 值来计算单位时间内的打哈欠次数,首先从Dlib 库中提取嘴部的6 个特征点(纵向62、68、64、66 四个坐标、横向61、65 两个坐标),通过这6 个特征点的坐标差值变化来判断打哈欠时嘴巴的张开程度。MAR 值计算公式如下:
通过计算MAR 值来判断是否打哈欠,当人们打哈欠时张口幅度明显大于人们平时说话时,但由于打哈欠时嘴部的开合程度存在很大的个体差异,因此本文将该特征作为疲劳特征的次要检测点。由于打哈欠的特征与正常说话、吃东西有明显不同,通过多次实验对比分析,发现将MAR 的阈值设定为0.8 能与之相区分。因此本文设定检测到MAR 值大于阈值0.8 且1min内超过10 次判定为疲劳,仿真结果准确率较高。
2.5 头部疲劳检测算法
现实生活中,驾驶员在疲劳状态下头部姿态变化主要体现为点头,摇头和晃头出现频率较少,因此本文通过检测单位时间内的点头次数来判断疲劳程度。HPE 算法是通过检测2D人脸的关键点,利用三维形变模型拟合不同人对应的3D 人脸模型,接着求解3D 点和对应2D 点之间的转换关系,然后使用Open CV 中的函数solvePnP(),根据旋转矩阵求解欧拉角,根据得到的低头欧拉角数据以及面部特征点的位置综合判断头部状态[8]。但由于点头时头部的变化幅度存在很大的个体差异,因此本文将该特征作为疲劳特征的次要检测点。为了将瞌睡点头与正常头部转动相区分,通过多次实验对比分析发现,将低头欧拉角| Pitch |≥25°作为头部疲劳特征能够与正常头部转动相区分。因此本文设定检测到低头欧拉角| Pitch|≥25°且1min 内超过15 次判定为疲劳,准确率较高。
3 设计实验
3.1 实验环境及数据集
本文实验电脑操作系统为Windows10,16G内存,显卡型号为NVIDIA GeForce GTX 1080,CPU 型号为Intel Core i7 - 6700 CPU @ 3.40GHz处理器,使用pytorch1.10.0 作为深度学习框架。
本实验从网络上爬取到2800 张各种未佩戴口罩和佩戴口罩的人脸图片作为数据集。使用Labelimg 对人脸图片进行分类标注,数据集中佩戴口罩的人脸照片标注为mask,未佩戴口罩的人脸照片标注为face。按照 6: 1 的比例划分为训练集、验证集,其中训练集包含2400 张图片,验证集包含400 张图片。
3.2 训练设置
本文模型训练过程中设置参数如表1所示。
表1 模型训练参数
4 实验结果与分析
利用 Yolov5s 模型在口罩佩戴识别训练100个epochs 后,按照上述模型评估指标对该模型进行评估,评估结果如图4 所示。从图4 中可以看出,模型在训练中其准确率和召回率稳定提升。当达到饱和状态后,精准率可以稳定在80%以上;召回率可以稳定在80%左右;平均精度均值也保持在较高水平,可以稳定在0.8左右;模型在实际应用中的识别速度较快,基本满足实时检测的要求。
图4 YOLOV5s 模型的评估结果
5 应用
本文采集了6 位志愿者分别在上午、夜晚两个时间段,以及是否佩戴口罩和眼镜4 种不同状态模拟驾驶汽车的视频,共采集到60 段视频。每段视频各测试2 次,每次测试时间都是60 s。基于对所有实验数据的分析,代码运算判断结果基本准确。
目前,国内外面部疲劳检测常用的方法是结合眼部眨眼和嘴部打哈欠进行判定,设置单位时间内眨眼或打哈欠次数超过一定数值即判定为疲劳,阈值设定没有充分考虑到和正常人体活动区分开,导致疲劳检测准确率不高,在驾驶员佩戴口罩情况下会因嘴部特征点缺失极易导致误判。表2 为佩戴口罩情况下传统疲劳检测方法与本文提出的面部遮挡疲劳检测方法对比结果;表3 为未佩戴口罩情况下传统疲劳检测方法与本文提出的面部遮挡疲劳检测方法对比结果。
表2 驾驶员佩戴口罩情况下两种方法对比结果
表3 驾驶员未佩戴口罩情况下两种方法对比结果
表2、表3 判定结果表明,本文提出的面部遮挡驾驶员疲劳检测方法比传统疲劳驾驶检测方法疲劳检测准确性更高,更贴近实际,实用性更强。
6 结论与展望
针对驾驶员佩戴口罩导致疲劳检测困难的问题,本文利用深度学习训练好的Yolov5s 模型判断驾驶员是否佩戴口罩,如果检测到佩戴口罩,以眼部疲劳特征为主,头部疲劳特征为辅进行检测;如果检测到未佩戴口罩,在眼部、头部疲劳特征的基础上加上嘴部疲劳特征进行检测。通过计算EAR、MAR、HPE 数值以及设定的条件阈值来检测每分钟驾驶员眨眼次数、打哈欠次数、点头次数,最终综合判断驾驶员疲劳状态。结果显示此系统疲劳检测准确率较高,可以在驾驶员疲劳时给予及时的提醒。但由于夜晚光线较暗且驾驶员面部被遮挡可能会导致误判,如果增强摄像头的夜间拍摄性能或者车辆内部增加照明设施,可以更好地提高面部遮挡驾驶员疲劳检测的准确率。