齐伟 张来刚 刘朝阳
摘 要:本文通过对人脸追踪和疲劳特征分析的研究设计了一个疲劳驾驶预警系统,通过特征人脸识别器来进行驾驶人身份的验证;通过坐标解算来获取驾驶人的头部姿态。电脑端将驾驶人的眨眼频率、PERCLOS值、哈欠频率、困意点头频率和连续驾驶时长通过一定的评判标准形成疲劳驾驶预警信号,并将最终结果通过socket与树莓派端进行数据通信,由树莓派端执行预警操作。
关键词:嵌入式系统 人脸追踪 特征分析 疲劳驾驶预警
1 基础人脸识别及关键算法
1.1 基于特征脸的人脸识别算法
特征人脸识别算法是一种在主成分分析(PCA)中进行人脸辨识的技术。
a.采集驾驶人图像作为训练样本
令驾驶人保持常用的驾驶坐姿,采集期间目视前方,将采集到的图像作为训练样本数据。
b.处理训练数据
假设采集到M张人脸图像信息,把每张图像拉成一列(假设图片像素个数是N),将这些向量放在一个矩阵S中作为训练样本:
将待检测的人脸图像输入后做主成分分析后,求和的欧氏距离得到:
其中Ω表示待检测人脸图像的权重,Ωk表示训练集中某个人脸的权重,当εk小于设定阈值时,则判断待检测人脸与训练样本中第k个人脸是同一人的。
1.2 基于Dlib的人脸特征点提取算法
本设计基于OpenCV-Python中Dlib训练好的人脸68特征点数据库进行人脸眼部、嘴部关键的提取和分析计算。该算法是基于ERT(ensemble of regression trees)级联回归算法,即梯度提高学习的回归树方法。其中人脸检测的方法是对正负样本提取Hog描述因子后,利用支持向量机(SVM)算法进行分类训练,过程与2.1节中Haar级联分类器的训练类似。
检测到人脸后,利用训练好的人脸68特征关键点数据库(shape_predictor_68_face_landmarks.dat)和Python中的dlib.shape_predictor函数对驾驶人的脸部进行特征关键点标记。
从这68个特征关键点中提取出眼部、嘴部特征点的位置坐标,来为接下来EAR(眼部纵横比)和MAR(嘴部纵横比)提供计算数据。
1.3 头部姿态获取算法
首先通过Dlib库得到2D人脸68个特征关键点),再通过3D Morphable Model等模型匹配算法拟合3D人脸特征点。
由世界坐标系0w-XwYwZw到像素坐标系uv的转换公式由得到:
其中相机的内参只由相机本身决定,由张正友标定法等标定出来;相机的外参会随着世界坐标系中物体的位置而变化,当计算出相机畸变后,把3D参考点、2D关键点、相机内参和相机畸变输入到OpenCV的solvePnP函数中求解出旋转矩阵R和平移矩阵T,最后通过欧拉角的计算出头部运动姿态,得到驾驶人的头部pitch(俯仰角)、yaw(偏航角)和roll(翻滚角)。
2 基于人脸特征分析的疲劳驾驶检测方法
2.1 基于眼部特征分析的疲劳检测方法
2.1.1 基于眼部特征分析的疲劳指标
(1)眨眼频率指标
本设计采用EAR(Eye Aspect Ratio,眼睛纵横比)值来作为眨眼频率检测的方法。EAR的表示图片如下,其中P1-P6代表人眼6个特征点在图像中的坐标位置,EAR的本质就是求距离之比。
EAR实时判断眨眼的验证图片:
由图2可以看出用EAR=0.2來检测睁眼、闭眼的实现效果非常好。由文献[11]知,人在清醒的状态下眨眼频率约为10~20次/min,当处于疲劳状态时眨眼的频率将提高约64%,故设置当每分钟眨眼次数大于20时则认为驾驶人处于疲劳驾驶状态。
2.1.2 眼部特征分析检测的实现
a.眨眼频率检测实现
在每次程序循环过程中检测驾驶人的EAR值,如果EAR小于0.2则眨眼计数器blink_counter自加1,若某次循环中检测到EAR大于0.2则清零blink_counter。当连续3次循环中EAR都小于0.2则判断为眨眼一次且清零眨眼计数标志blink_counter。若在每60秒内眨眼次数达到20次及以上则发出相应的疲劳驾驶预警信号。
b.PERCLOS实现
本设计的操作方法为先通过遍历文件夹中采集好的每张驾驶人的图像,计算出每个驾驶人眼睛的闭眼时最小EAR值I1和睁眼时平均EAR值I2,由此得出得出眼睛闭合20%时的EAR值为T1=I1+(I2-I1)*0.2,眼睛闭合80%时的EAR值为T2=I1+(I2-I1)*0.8。如对本人采集的T1=0.151,T2=0.192。
实时采集的EAR计算图像为:
根据PERCLOS的计算公式先初始化计数标志P80_count1和闭眼标志位P80_flag1为零,闭眼标志位P80_flag1=0的作用是控制程序仅在从睁眼到闭眼时刻开启计时。在每次程序循环中检测驾驶人的EAR值,当EAR小于T1、驾驶人目视前方时且P80_flag1为0时,计数标志P80_counter1自加1,否则清空P80_count1。当连续3次检测到EAR2.2 基于嘴部特征分析的疲劳检测方法
2.2.1 基于嘴部特征分析的疲劳指标
嘴部疲劳特征即为在一定时间内打哈欠的次数,其判断依据是根据嘴部特征点的距离运算。与眼部开闭特征EAR类似,嘴部特征点采用MAR(Mouth Aspect Ratio,嘴部纵横比)算法。
MAR判断哈欠的验证图片:
从上图可以看出哈欠检测的实现效果非常好。由于目前没有统一的嘴巴开度阈值检测实验,故根据文献]取MAR的阈值为0.75,当MAR>0.75时即认为打哈欠一次,当每分钟内打哈欠次数达到3次即判断为疲劳驾驶状态。
2.2.2 嘴部特征分析检测的实现
首先初始化哈欠标志位yawn_flag和哈欠计数器yawn_counter为0,当检测到嘴巴张开(MAR>0.75)时,yawn_counter自加1,当连续3次检测到MAR>0.75即认为驾驶人正在张嘴,开始计时并将yawn_counter置1。当检测到驾驶人嘴巴闭合时,若张嘴持续时间大于等于2秒,则认为打了一次哈欠,哈欠次数yawns自加1。每60秒统计一次哈欠次数,当达到规定的3次/min时触发警报。
2.3 基于头部姿态特征分析的疲劳检测方法
2.3.1 基于头部姿态特征分析的疲劳指标
在长时间驾车出现较大的疲劳困意后,驾驶人会出现困意点头的行为。下图为计算出的pitch(俯仰角)、yaw(偏航角)和roll(翻滚角)在头部转动时的变化情况:
根据文献[15]为防止把驾驶人低头看仪表盘、寻物等误认为困意点头,所以设置当pitch低于阈值持续3秒时判定为困意点头一次,每分钟内困意点头次数大于3次则认为驾驶人处于疲劳驾驶状态。
3 总结与展望
本设计用特征人脸识别器进行驾驶人的身份识别,该方法要求必须是驾驶人的正面图像,因此在转头的过程中可能出现误判,且待识别人脸图像的尺寸应该接近训练集的图像尺寸,因此在缩放的过程中可能会丢失一些信息造成误判。用EAR来模拟PERCLOS的P80标准,该方法稍微背离了PERCLOS的眼睑遮住瞳孔面积的定义,可能造成对前人实验复现的准确率下降。针对该问题未来可以采用神经网络等算法进行优化改进,提高鲁棒性和准确率。
参考文献:
[1]国家统计局.2019年国民经济和社会发展统计公报[DB/OL].http://www.stats.gov.cn/tjsj/zxfb/202002/t20200228_1728913.html,2020.2.28.
[2]王畅.驾驶员疲劳行为研究综述[C].中国科学技术协会、中华人民共和国交通运输部、中国工程院:中国公路学会,2019:1039-1044.
[3]张琦. 机动车驾驶人疲劳程度时变特性及规律研究[D].武汉理工大学,2018.
[4]陈军. 车载嵌入式平台疲劳驾驶检测系统研究与设计[D].西南科技大学,2016.
[5]DINGES D F,GRACE R.PERCLOS:A Valid Psycho physiological Measure of Alertness as Assessed by Psychomotor vigilance[R].Washington:Federal Highway Administration,Office of Motor Carriers,1998.
[6]江水郎.基于视觉的驾驶员疲劳检测研究[D].上海交通大学,2008.
[7]郑培,宋正河,周一鸣.基于PERCLOS的机动车驾驶员驾驶疲劳的识别算法[J].中国农业大学学报,2002(02):104-109.
[8]史瑞鹏,钱屹,蒋丹妮.基于卷积神经网络的疲劳驾駛检测方法[J/OL].计算机应用研究:1-7[2020-04-21].