时间:2024-05-22
金 梅 薛静芳 张立国 刘 强
(燕山大学电气工程学院 秦皇岛066000)
随着社会与科技的发展,汽车越来越普及,成为了社会生产力发展的强劲动力,为人们出行提供了便捷。但随着汽车普及,安全问题也随之而来。据国家统计局统计,2019 年,全国共发生247 646 起交通事故,导致62 763 人死亡,造成直接财产损失134 618万元,而由疲劳驾驶引发的事故则占20%~40%。因此,针对驾驶员疲劳度检测系统的研究能产生巨大的经济效益和社会效益。但用于疲劳驾驶检测的传统顺序式算法对硬件性能要求高,导致设备成本高昂。如文献[1]提出一种基于MTCNNPFLD-LSTM 深度学习模型的疲劳驾驶检测算法。文献[2]采用计算机视觉的方法利用Dlib 提取面部特征点的坐标,通过计算眼睛纵横比来实现瞌睡检测。文献[3]提出通过从用户端摄像头提取面部特征,计算人眼睛的开合程度、嘴部开合度、头部偏移程度判断疲劳的融合算法。上述文献及文献[4-8]所述的方法均采用顺序式算法,对处理器的性能及工作频率要求高,且若要达到较高的处理帧率,需要采用较高端的图形处理器(graphic processing unit,GPU)或者中央处理器(central processing unit,CPU),导致成本高昂。
现场可编程门阵列(field programmable gate array,FPGA)得益于其低成本及并发计算的特点,在信号处理和图像处理等领域发挥了重要的作用。本文通过FPGA 开发板、摄像头搭建驾驶员疲劳监测系统,将传统顺序式算法改进为流水线算法,多个处理步骤并行执行,充分利用FPGA 并发特点实现实时人脸图像处理及眼部特征提取,并利用单位时间内人眼闭合时间所占的比例(percentage of eyelid closure over the pupil over time,PERCLOS)判据判断驾驶员疲劳状态。FPGA 并发计算的特性及本文对算法的流水线改进,使得系统延时大幅降低,处理速度大幅提高。并且本系统可运行在低端FPGA 上而准确度和性能几乎不受影响,从而大幅降低设备成本。
本文基于PERCLOS 判据的疲劳监测流程图如图1 所示。
图1 基于PERCLOS 判据的疲劳监测流程图
摄像头输出的数据为16 位RGB565 格式,数据同时流经2 个二值化模块,通过设定不同的阈值,配合形态学模块,一幅图像保留脸部细节,用于后续人眼检测及跟踪。另一个输出抹去脸部细节的图像,用于后续人脸检测。经二值化模块后,输出的数据长度变为8 位。完成形态学处理后,保留细节的图像存入同步动态随机存储器(synchronous dynamic random-access memory,SDRAM),与此同时,不保留细节的图像进入人脸定位模块,在存储完成时,人脸定位也完成。紧接着读取SDRAM 中的图像,在人脸范围寻找眼睛,并运用PERCLOS 判据判断驾驶员是否疲劳。
流水线算法将一个算法拆分成多级算法步骤,每级占用一定的时钟周期。每级流水线并行运行,但由于后一级的输入是前一级的输出,所需的处理时间为第一个数据进入第一级流水线、到第一个处理结果输出所需的时钟周期。
FPGA 使用流水线算法能获得非常快的处理速度,且所需处理的数据越多,算法步骤越多,流水线程序的优势也越大。
摄像头输出16 位RGB565 格式数据,因此先将RGB565 格式数据通过高位补低位的方式转换为RGB888 格式[9],再利用RGB888 格式数据计算灰度值。RGB 转灰度常用公式为
为了进一步提高算法的处理速度,将式(1)算法中的除法改进为移位算法。移位比除法快,所以可以将系数缩放成2 的整数幂。
所以RGB 转灰度公式可分解为三级流水线,即提取并扩展颜色分量、计算括号内乘法、计算加法并移位除法。每级流水线消耗一个时钟周期。
流水线算法只能处理一维数据,因此,腐蚀/膨胀操作需分解为行方向(1 ×3)与列方向(3 ×1)2个一维操作。
1.4.1 一维行形态学操作
摄像头输出的数据经二值化后,数据依然是连续地从二值化模块输出,而进行1 ×3 的行腐蚀须同时获取3 个像素数据。由于同一时刻只能收到1 个数据,并且需要保证每个流经形态学操作模块的数据一个不漏全部被处理,因此不能用暂存数据再处理的方法。在此提出让数据流经一个3 bit 移位寄存器,并且每个时钟周期将寄存器后两位数据前移一位,将新读取的二值化数据放入寄存器末位,以实现数据在寄存器内流动。从二值数据进入一维形态学模块以后的第2 个时钟周期即可开始判断腐蚀/膨胀结果,输出结果落后判断一个时钟周期,即第3个时钟周期开始输出第1 个结果,意味着此种方法对一幅图像进行行一维腐蚀/膨胀操作只相当于把图像数据延时了2 个时钟周期,但经过这2 个时钟周期的延时后,输出的图像已经是经过行形态学操作的图像[10]。
1.4.2 一维列形态学操作
在行方向进行形态学的基础上对列方向进行形态学操作,原理和行形态学类似。但由于列形态学需要同时获取位于相邻3 行的像素,因此至少需要缓存2 行加第3 行的第1 个像素,即需要一个1281位的寄存器。与行形态学类似,列形态学也是当像素处于中间位置时判断该像素,即第641 个数据,意味着此模块只需要784 个时钟周期(一行图像持续784 个时钟周期,其中640 个位像素时钟周期)便可开始输出结果,即完成一幅图像的列形态学操作相当于把图像数据延时了784 个时钟周期。
通过结合行与列方向2 个一维形态学操作,实现了对图像的二维形态学操作。
由于摄像头输出的数据会同时进行2 个阈值不同的二值化及形态学操作,分别输出保留脸部细节和不保留脸部细节的图像。为了节省资源,提高效率,本文优化了算法流程,实现了实时判断、投影结束立即得出人脸边界,并且只占用少量寄存器资源。人脸定位模块状态转移图如图2 所示。
图2 人脸检测模块状态转移图
与人脸定位类似,人眼定位也利用投影法,但在投影之前需要确定眼睛的大致区域。根据“三庭五眼”比例关系[11],以及人脸的最宽处一般位于眼睛与鼻子之间的区域这一规律,只需要找到人脸最宽处,就可以在人脸上边界与最宽处之间利用投影法寻找眼睛,也能较好地避免“三庭”规律的缺陷。区域分割及人眼定位结果如图3 所示。
图3 人眼定位
本文系统采用的摄像头输出帧率为60 fps,即相邻两帧间隔约0.016 s,而人眼在这段时间内的位移属于微位移。因此检测到眼睛后,后续处理将在上一帧眼睛边界的基础上扩展边界大小,并将扩展的边界作为下一帧检测眼睛的边界,如此反复迭代,实现跟踪。
PERCLOS 判据[12]的P80 标准定义眼睛从最大闭合到闭合80%大小所用时间为t1,从闭合80%到20%所用时间为t2,从闭合到20%到睁开到20%所用时间为t3,从睁开20%到睁开80%所用时间为t4。则PERCLOS 指数f定义如下。
当f超过一定范围则认为驾驶员疲劳。虽然此方法理论上能达到非常高的准确度,但在实际操作时并不常用,主要有以下2 个原因。
(1) 因为当驾驶员距离摄像头较远时,眼睛的最大变化量不够大,导致无法区分这4 个阶段。
(2) 此法对系统速度要求极高,人眨眼一次只需要0.2~0.4 s,以本文为例,处理速度为60 fps,则每次眨眼只持续了10 帧左右,闭眼过程和睁眼过程平均只持续了5 帧左右,用如此少的帧数去描述闭眼与睁眼过程,精度较低。
因此,在实际应用时,常用一段时间内闭眼的时间占统计时间的百分比判断驾驶员的疲劳程度。即
其中tc为闭眼持续的帧数,T为总统计时间所持续的帧数。睁闭眼状态由眼睛长宽比判断。
根据实际测试效果,确定当眼睛的长宽比大于4 时,认为眼睛处于闭合状态,并在此基础上进行PERCLOS 值标定。
对10 名测试者每人随机记录5 个周期的闭眼帧数数据,实验统计数据如表1 所示。
表1 清醒时闭眼帧数结果
根据表1 所测结果可知,在5400 帧里,清醒时眼睛闭合帧数在1200 帧以下,疲劳时在1200 帧以上,即得出的对应关系如下。(1)f<0.2,驾驶员清醒;(2)f>0.2,驾驶员疲劳;(3)驾驶员长时间闭眼报警时间设为2 s,持续闭眼超过2 s 则认为驾驶员极度疲劳。
测试时设定的采样周期为30 s,摄像头采集900帧图像,系统读取1800 次,按照标定结果,疲劳时f>0.2,即闭眼帧数计数器计数值应大于360。
根据表2 所示测试结果,可知本系统的准确度约为96%(大于360 的次数除以50)。
表2 疲劳时测试结果
实验使用verilog 语言编写疲劳监测系统的逻辑电路,并在AltraEPCE0F7C FPGA 芯片上部署,电路驱动时钟频率为50 MHz,摄像头捕获画面的分辨率为640 ×480 像素。
以文献[13]采用的关键点特征融合的方式作为对比组,与本文所叙述的PERCLOS 疲劳计量方法进行对比。实验前预先统计测试视频序列中出现的疲劳次数,与实际检测出的疲劳次数对比,算法对比的实验结果如表3 所示。
表3 检测算法对比实验结果
实验表明,PERCLOS 疲劳计量方法采用单一因素进行检测,故误检发生不频繁且正确率较高。面部关键点融合特征算法能够检测出较多的疲劳情况,但由于该算法涉及多个疲劳因素与判定方式,在定值判定的情况下容易发生误检测的情况。
将文献[14]提出的基于转向盘转角的疲劳驾驶检测方法,与本文提出的基于PERCLOS 判据的驾驶员疲劳监测方法进行对比,利用实际道路条件下的车辆行驶数据对所建立的模型进行验证。实验对比结果见表4。
表4 判别模型实验结果对比
实验表明,本文的驾驶员疲劳检测方案不仅在正确率上较基于转向盘转角的疲劳驾驶检测方案高,在速度上也更快。基于转向盘转角的疲劳检测方法导致误判的原因主要是,在少数路况简单的直线路段无论是在清醒状态还是疲劳状态,短时间内转向盘转角变化的幅度和频率都较小,使得提取的静止百分比和角度标准差失效,从而导致误判的发生。
针对常规疲劳监测算法处理速度慢、实时性低、硬件成本高等问题,本文提出了一种基于PERCLOS判据的驾驶员疲劳监测系统。通过对常规算法进行流水线改造,保证了系统的高速处理,达到了实时性的要求;并且通过改进算法,使得本系统所占用的资源处于较低水平,这也意味着本系统能运行在低端FPGA 上,从而节省硬件成本。在人脸定位方案中实现了以较低的资源占用完成人脸定位,且实现了每帧图像结束时即可得出人脸定位结果。此外,在人脸定位的基础上利用人脸比例关系,将眼睛区域缩小到人脸上边界与人脸最宽处之间的部分,从而缩小了检测人眼的范围,简化了程序,并利用系统处理速度快这一优势,使用迭代法实现了人眼跟踪。最后进行实验测试以及对比实验,测试结果表明本系统在保证实时性的情况下达到了95%以上的准确度。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!