汽车智能驾舱驾驶疲劳检测系统设计
2024-01-04柏俊波周涛琪柏俊杰
柏俊波,周涛琪,柏俊杰
(1.上海易咖智车科技有限公司,上海 嘉定 201800;2.重庆科技学院电气工程学院,重庆 400010)
0 引 言
司机在疲劳状态下驾驶汽车将极大增加发生交通事故的风险。统计显示,2020 年全年中国交通事故发生数量为1 313 606起,事故造成61 703死亡,250 723人受伤,带来的经济损失[1]超过244 000 万元人民币。由疲劳驾驶导致的交通事故数量占事故总量[2]的25%以上,事故死亡率达到83%。因此,出于对驾驶员及行人安全、社会和谐稳定、国家经济发展等一系列问题的考虑,准确有效的疲劳驾驶检测系统的研发已经成为当前交通安全领域的研究重点。当前针对疲劳驾驶的检测方法主要包含三类:基于司机生理参数的检测方法、基于车辆行为的检测方法和基于司机面部特征的检测方法[3]。
基于司机生理参数的疲劳驾驶检测方法主要通过脑电、心电等信号对疲劳状态进行评价,此类方法对生理信号的分类效果较好,疲劳检测精度较高,但是信号采集和分析设备体积过大,需要司机全程佩戴,容易影响司机正常驾车行为[4-5]。
为了克服基于生理参数的疲劳驾驶检测方法具有侵入性的问题,一部分学者通过车辆行为判断司机疲劳状态。此类方法通过方向盘数据、车道偏移量等特征对司机疲劳状态做出间接评价。基于车辆行为的疲劳驾驶检测方法对司机干扰较小,但不能直接反映司机的真实状态,检测精度不高,同时,此类方法具有滞后性,实时性不好[6-7]。
相比于以上两类方法,基于司机面部特征的疲劳驾驶检测方法具备非接触、效果好等优势,通过相机实时采集司机面部特征,可以对司机状态进行直接的客观评价。传统的基于驾驶员面部特征的检测方法检测效果较好,但需要借助大量图像处理算法和机器学习算法,大量且复杂的算法会影响检测系统的实时性,导致大多数此类方法需要借助PC 机才能完成疲劳状态的判断及预警,不利于在驾驶室环境大量部署和推广[8-10]。
算法复杂、设备庞大制约着机器视觉算法在疲劳驾驶检测领域的发展,为了解决这一问题,部分学者尝试基于嵌入式设备实现司机状态的实时监测。文献[11]在汽车仪表盘内安装微型红外摄像机,将拍摄到的驾驶员面部特征利用包含FPGA 的嵌入式设备进行处理,用以对驾驶员的精神状态进行评估,系统能够在720.576 ms 的时间内处理16×7 帧实时检测画面,检测效率大大提升。文献[12]基于FPGA 平台,开发出基于Sobel 边缘检测算子和差分法相结合的疲劳驾驶检测系统,系统通过识别人眼轮廓,计算眨眼频率对驾驶员疲劳状态进行检测,系统结构采用流水线设计,大幅提升了疲劳驾驶检测速度。
综上所述,为了提高疲劳驾驶检测系统的集成度和实时性,同时面向狭小、复杂的驾驶环境,本文基于FPGA硬件平台,设计了一种通过司机眨眼频率判断其是否疲劳的检测方法,该方法具有响应速度快、检测精度高、体积小等特点,满足昏暗、颠簸等复杂情形下的检测要求。
1 算法设计方案
眨眼率常被作为评价司机疲劳驾驶的重要指标之一,因此,在复杂的驾驶环境正确计算司机眨眼频率是本文的研究重点。本文首先改进YCbCr 人脸检测算法,提高人脸区域分割精确度;再在人脸范围之内跟踪司机双眼位置;最后利用帧差法检测眨眼动作并计算眨眼频率。算法设计流程如图1 所示。
图1 算法设计流程图
1.1 人脸分割算法设计
在FPGA 平台上开发设计疲劳驾驶检测系统,首先要分割人脸区域,在人脸区域范围内进行眼部区域分割和眨眼动作检测可以减小系统计算量,节省开发板资源。本文首先采用区域长宽比改进YCbCr 算法,框选出准确、完整的人脸后,提取每一帧图像中人脸框对应的4 个像素点的像素坐标值,为人眼跟踪奠定基础。
1.1.1 基于区域长宽比的YCbCr 人脸区域分割算法
YCbCr 颜色空间将图像分解为亮度信息(Y)和色度信息(Cb、Cr),根据人体肤色的色度分布规律实现人脸分割[13]。不同年龄和性别人群,即使人种不同,其肤色的色度分量都会集中在特定范围之内,因此,只需要根据肤色的Cb、Cr 分量值,而不用考虑背景和环境就能很好地分割人脸区域。此外,YCbCr 算法逻辑简单,易于实现,能够提高FPGA 芯片对图像的采样率,因此,本文探究基于YCbCr 颜色空间的人脸区域分割算法,算法基本原理如式(1)所示:
式中将Y 分量的常数置0 可削弱图像亮度的影响。统计人体肤色Cb、Cr 的分布规律后,将人脸的色度分量定义在式(2)和式(3)的范围内。
YCbCr 算法是对肤色区域的简单分割,当图像中出现非人脸肤色区域时,该算法会产生误检。为了提高系统检测精度,本文采用区域长宽比对YCbCr 算法进行改进,改进的原理是计算检测出的肤色区域最大长宽比,将满足比例要求的区域判定为人脸区域,反之,则为非人脸区域。计算100 张驾驶场景中人脸最大长宽比(Ratio)后,本文将人脸长宽比判定阈值设定为:
驾驶环境下司机面部画面相对稳定,通过公式(4)计算后可排除非人脸肤色区域的干扰,算法的优化过程如图2 所示。
图2 YCbCr 算法优化过程
1.1.2 人脸区域分割效果
经过图2 所示的处理后,人脸区域像素值为1,非人脸区域像素值为0,达到了人脸分割的目的。在此基础上,通过搜索画面中灰度为1 的像素坐标点极值就可框选出人脸。优化后的YCbCr 算法在实车环境下检测人脸区域的效果如图3 所示。
图3 优化后YCbCr 算法人脸检测效果
1.2 人眼跟踪算法设计
图4 头部位移和双眼中心点位移
图5 人眼中心位移与头部位移的关系
数据拟合后得到以及之间的关系如式(5)和式(6)所示:
式中:Δxe表示待测眼睛横向位移;Δye表示待测眼睛纵向位移;Δxh表示利用帧差法计算得到的相邻两帧图像的头部横向位移;Δyh表示利用帧差法计算得到的相邻两帧图像的头部纵向位移。通过式(5)和式(6)的运算,检测范围进一步压缩到人眼区域,过滤了肤色区域内的运动噪声,提高了检测精度。然而,眼睛周围的镜框、眉毛等微小变化会使图像出现空洞,因此,在对两张差分图像进行与操作时,还需要对图像进行腐蚀膨胀操作,去除图像中的尖锐空白点。
1.3 眨眼动作检测算法设计
在人眼区域范围内通过帧差法检测运动目标的像素变化即可检测眨眼动作[15]。帧差法检测眨眼动作的优势在于:选取前一帧或前几帧图像作为标准背景图像,将当前帧图像与前一帧图像做差分运算可以解决标准背景图像实时更新和重建的难题。为了避免系统检测过灵敏,本文采用三帧差算法,算法原理如图6所示。
图6 三帧差法流程
假设第k- 2、k- 1、k张图片的图像函数分别为Fk-2(x,y)、Fk-1(x,y)、Fk(x,y),则计算得到的差分图函数如式(7)和式(8)所示:
式中:Dk(x,y)、Dk-1(x,y)分别为两张差分图像的图像函数,将两张差分图进行与运算后得到的运动目标图像函数如式(9)所示:
眨眼动作检测效果如图7 所示,本文采用的眨眼动作检测算法将运动目标的检测区域集中在人眼周围,不统计非眨眼动作带来的像素变化,同时过滤了头发、眉毛等噪声干扰,提高检测精度的同时,降低了误检率。
图7 眨眼动作检测
1.4 基于眨眼率的疲劳驾驶状态检测标准
华盛顿大学John A. Stren 等人在其研究中指出,正常情况下,司机眨眼频率在12~17 之间,随着驾驶时长增加和疲劳程度的增长,眨眼率[16]最高达到了每分钟40 次。本文结合文献和台湾国立中央大学NTHUDDD 疲劳数据集实测数据,将眨眼频率fe与司机状态之间的关系用公式(10)表示:
2 硬件设计方案
系统硬件设计遵循从顶层到底层再到顶层的设计思路[17]:首先根据系统设计要求确定顶层设计方案,然后将顶层方案分解为PLL、ov5640_cfg、processor 等多个功能子模块,各个子模块功能实现后联合调试运行,最终达到设计要求。
2.1 顶层模块设计
硬件部分主要包含摄像头配置和驱动模块、数据存储模块、疲劳驾驶检测模块以及VGA 显示模块,PLL 时钟模块产生4 路时钟信号分别为各个功能模块供电。疲劳驾驶检测系统顶层设计如图8 所示。
图8 疲劳驾驶检测系统顶层模块设计
各个功能模块描述如表1 所示。
图8 中:processor 模块是本项目的核心模块,其主要功能是进行人脸分割、图像预处理、人眼跟踪、眨眼动作检测等。其中:YCbCr 和pretreatment 模块功能为图像预处理和人脸分割;binarization 模块功能为图像二值化;Erosion 和Dilation 模块是图像形态学处理模块,主要功能是图像腐蚀和膨胀;Frame Difference 为帧差模块,主要功能是检测眨眼动作。processor 检测到眨眼动作后,发送img_current/post 信号到数据存储驱动单元,完成眨眼次数的统计和眨眼的计算。
2.2 基于FPGA 的人脸区域分割模块设计
由于capture 输出图像为16 位RGB565 格式,而用于图像处理的输入图像为24 位RGB888 格式,因此,需要先将RGB565 转化为RGB888。将公式(1)中每个分量前的小数系数乘以256,然后向右位移8 位,完成乘法运算;然后将计算得到的数据进行相加,分别得到Y、Cb、Cr 分量数值,完成图像由RGB888 格式到YCbCr 格式的转换。
统计符合人体肤色的色度分量并计算区域长宽比Ratio1…Ration,将符合1.20 ≤Ratio ≤1.70 的肤色部分置1,其余部分置0,完成人脸区域分割。
2.3 基于FPGA的眨眼动作检测和眨眼率统计模块设计
对实时采集的图像在(Xmin,Ymin)、(Xmin,Ymax)、(Xmax,Ymin)范围内做差分运算,滤除非人脸的运动目标。基于FPGA 的改进三帧差法眨眼动作检测流程如图9 所示。
图9 基于FPGA 的改进三帧差法眨眼动作
基于FPGA 的帧差眨眼动作检测主要步骤为:
1)将当前帧二值图像缓存一个时钟周期,选取人脸范围内有效部分,读取下一帧图像二值图,选取人脸有效部分;
2)利用式(5)和式(6)定位运动状态下的人眼区域;
3)将两帧二值图做差分运算,得到第一个差分图;
4)重复步骤1)和步骤2),得到第二张差分图;
5)将两张差分图进行与运算,最终判定是否有眨眼动作。
3 疲劳状态检测实验
本文以算法加速和提高检测系统集成度为目的,采用30 s 为一个计数周期,对眨眼频率进行统计并判断司机是否存在疲劳风险。检测结果通过VGA 驱动器实时打印到显示器输出,实现检测系统的可视化。
3.1 疲劳状态检测实验
如图10 和图11 所示,疲劳驾驶检测实验分为佩戴眼镜和不佩戴眼镜两种情形,系统实时统计30 s 内的眨眼次数,将“正常”情况用白色字体进行显示,将“疲劳”和“睡眠”用白色斜体字突出显示。
图10 不戴眼镜条件下的疲劳驾驶检测效果
图11 佩戴眼镜条件下的疲劳驾驶检测效果
图10 a)在30 s 内眨眼次数为0,显示数字为0,对应疲劳状态为“睡眠”;图10b)显示在30 s眨眼7次,对应眨眼频率为14次/min,检测状态为“正常”;图10c)显示30 s内眨眼13 次,对应眨眼频率为26 次/min,检测状态为“疲劳”。
图11中为戴眼镜状态下的疲劳驾驶检测效果,可以看出,戴眼镜情况下依然能够准确检测疲劳状态。
4 结 语
本文采用硬件描述语言,通过Quartus Prime 开发平台,在Cyclone ⅣFPGA 芯片上完成算法的部署和疲劳驾驶状态的判断。硬件设计顶层模块包含了视频采集与存储、人脸区域分割、人眼位置跟踪、眨眼频率统计和疲劳驾驶判定多个功能子模块,充分发挥了FPGA 优势,满足疲劳驾驶检测实时性要求。本文通过眨眼频率将疲劳状态分为正常、疲劳、睡眠三个等级进行预警。实验表明,系统对眨眼动作的检测灵敏度高,系统在不佩戴眼镜和佩戴眼镜两种场景下均可有效检测疲劳驾驶状态,满足疲劳驾驶预警的检测要求,可有效降低驾驶员疲劳驾驶风险。