贾高祥,刘宇,祁蓁倬,陈紫涵,刘维红
(西安邮电大学电子工程学院,陕西西安 710121)
随着我国经济实力的不断增强,我国汽车保有量飞速增加,交通安全问题已经成为了我国的社会热点问题[1]。经过大量的研究表明,在导致交通事故的原因中,占比最大的是疲劳驾驶[2]。因此,当前驾驶行业亟需一种疲劳驾驶检测技术,当驾驶员出现疲劳驾驶状况时可以有效地向驾驶人员预警并提供一定的辅助驾驶功能,应用该技术将会大大减少交通事故发生的次数[3]。
目前实现算法优化和加速的主流硬件平台有三种:1)专用集成电路(Application-Specific Integrated Circuit,ASIC),虽然其具有高性能的特点,但其制造成本高且只支持设计时设想的功能集,不能进行现场升级;2)图形处理器(Graphics Processing Unit,GPU),其灵活且易于设计,但因为时钟频率难以提升,并且因为其显著的功耗使其难以集成到功耗受限的嵌入式平台;3)现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA),具有高性能低功耗和高灵活性的特点,其设计周期短,成本相对ASIC较低,近年来在高速图像处理领域得到了广泛的应用。基于以上分析,该设计采用基于FPGA 的硬件加速器方案来实现疲劳检测技术,通过并行处理优势,使得疲劳检测及预警更快更稳定[4]。
系统方案设计框图如图1 所示,由豪威7725(OmniVision7725,OV7725)配置模块、视频流处理模块、红绿蓝(Red Green Blue,RGB)转亮蓝红(Luminance Chrominance Blue Chrominance Red,YCbCr)模块、人脸识别算法模块、疲劳检测算法模块组成。
图1 系统方案设计框图
各模块的功能介绍如下。OV7725 配置模块:将OV7725 摄像头所需的参数通过集成电路总线(Inter-Integrated Circuit,IIC)配置进OV7725 摄像头内部的寄存器,以驱动OV7725 摄像头实时采集视频流数据;视频流处理模块:先把RGB565 格式转成视频图形阵列(Video Graphics Array,VGA)显示所需的RGB444 格式,再将一帧图像放进块随机存取存储器(Block Random Access Memory,BRAM)中缓存,然后将取出的RGB 数据转成四位的R、G、B 数据;RGB 转YCbCr 模块:把RGB 色彩数据格式转为YCbCr 色彩数据格式,以便进行肤色判断;人脸识别算法模块:在人脸识别模块中完成二值化、滤波、人脸边界搜索和人脸特征标识,把肤色阈值内的部分变为白色,并进行三次滤波以消除噪声,搜索人脸区域边界,进行人脸特征的标识;疲劳检测算法模块:通过人脸特征值触发门限阈值的累计时长来判断疲劳的级别,以及控制疲劳检测模式的进入及退出。根据疲劳级别给出三级辅助驾驶策略,最终完成疲劳检测硬件加速器的设计。
OV7725 的工作模式需要通过IIC 总线完成其内部寄存器的配置[5]。在配置过程中,关键的两个寄存器包括时钟寄存器和用于设置RGB565 传输格式的寄存器,它们的地址分别为0x3100 和0x3206[6]。
一旦OV7725 成功配置为RGB565 模式,它将以该颜色格式工作,并将RGB565 格式的像素数据按照选定的VGA帧率发送[7]。
为了将OV7725输出的RGB565格式像素数据转换为VGA 显示器所需的RGB444格式,首先需要将一帧图像的像素数据连续存储到BRAM 中进行缓存。然后从BRAM 中取出缓存的数据,并将其转换为3 个通道,每个通道包含4位的R、G、B 数据。同时需要产生适用于640×480分辨率的场同步和行同步信号[8]。
具体到同步信号的生成,本设计使用行计数器和场计数器来控制。行计数器的模设置为800,意味着每当行计数器值达到799 时,它将清零,并触发场计数器开始计数。场计数器则在其计数值达到524时清零[9]。按照VGA 的时序标准,在行计数器和场计数器对应的范围内产生行同步和场同步信号。这样就可以确保从BRAM 中正确地取出640×480 分辨率的数据[10],以供VGA 显示器使用。
把RGB 色彩数据格式转为YCbCr 色彩数据格式,以便进行肤色的判断[11]。
该设计的人脸识别是通过肤色来判断的,YCbCr 这种数据格式容易判断肤色的范围,来区分肤色区域[12]。
YCbCr 中Y 是指亮度分量,Cb 指蓝色色度分量,而Cr 指红色色度分量[13]。RGB 转YCbCr 的公式:
式中:R为红色;G为绿色;B为蓝色;Y 为亮度;Cb 为蓝色色度;Cr 为红色色度。
RGB 转YCbCr模块框图如图2 所示,为提高电路性能,采用三级流水线电路完成乘法加法运算。根据流水线的设计,为了确保数据同步,其他相关信号也需要经过相同的流水线阶段,即在每个流水线级之间进行同步采样三次。这样可以保持数据的同步性,并提高整个转换过程的效率。
图2 RGB转YCbCr模块框图
人脸识别算法模块框图如图3 所示。由二值化、滤波、人脸边界搜索和人脸特征标识组成。此算法完成了把肤色阈值内的部分变为白色。进行三次滤波充分降噪后,搜索人脸区域边界,并将人脸特征标识出来,以达到视频流实时动态标识人脸。
图3 人脸识别算法模块框图
二值化:在Cb、Cr 分量满足肤色阈值范围时,将RGB数据置为16位全1,此时对应的像素显示为白色。
滤波:为了滤除图像中的噪声,特别是人脸区域外的偶尔出现的白色噪点,该设计采用了一种简单的滤波方法。由于人脸区域被赋值为16 位全1,表示白色,而背景区域为16 位全0,表示黑色,可以通过连续像素之间的与运算来实现滤波。具体来说,对连续的7 组像素数据执行与运算,只有当连续7 组像素中某一位同时为1 时,滤波结果中的这一位才为1。这种方法可以有效地消除孤立的白点噪声。为了进一步提高滤波效果,这种滤波步骤被连续应用了3 次,以确保图像中的噪声得到充分抑制。
人脸边界搜索:采用8 帧检测法。对于连续的8帧图像数据,首先在第1 帧中通过迭代找到满足人脸区域条件的最值。再采用隔帧检测,在第7 帧和第4 帧中分别检测最值,并在第5 帧检测中锁定最终的人脸区域最值。为了提高准确性,在第6 帧计算这些最值的平均值。通过这种分帧处理和迭代方法,能够更精确地确定人脸区域的边界。
人脸特征标识:在第0、1、2、3、6 帧时,按搜索到的人脸边界来标识人脸特征。
人脸边界搜索及人脸特征标识框图如图4所示。
图4 人脸边界搜索及人脸特征标识框图
begin_x、begin_y、end_x 和end_y 分别为第7 帧人脸区域的左边框、上边框、右边框和下边框的最值坐标,begin_x_1、begin_y_1、end_x_1 和end_y_1 分别为第4 帧人脸区域的左边框、上边框、右边框和下边框的最值坐标。
人脸识别及特征标记算法的仿真如图5 所示。在第7 帧begin_x、begin_y、end_x 和end_y 变化,在第4 帧begin_x_1、begin_y_1、end_x_1 和end_y_1 变化,在第5 帧时比较第7 帧和第4 帧的最值大小来决定最终的最值,在第6 帧计算平均值,在第0、1、2、3、6 帧时,标识人脸特征。
图5 人脸识别算法及特征标记算法仿真
疲劳检测算法模块框图如图6 所示。实时检测一段时间内人脸特征在阈值内的累计时长来判断疲劳检测的级别和疲劳检测的进入或退出状态。三种疲劳级别接入不同级别的预警处理。
图6 疲劳检测算法模块框图
先进行人脸特征是否在阈值内的判断,若在阈值内才计数,同时设定一个1 s 计数器,将上述结合起来,得到人脸特征在阈值内的累计时长秒数。同理可得人脸特征消失的累计时长秒数。在工作时间达到阶段性复位清零时间门限时,进行所有信号的清零重置,以避免某一段工作过程的故障。
在其累计时长达到进入检测模式时间门限时,进入检测模式,达到各疲劳级别时间门限时,产生不同的疲劳级别指示。若人脸特征消失累计时长达到退出检测模式时间门限时,退出检测模式。
该设计的硬件验证平台为Zynq 评估开发板(Zynq Evaluation &Development Board,ZedBoard),软件平台为Vivado 2018.3。用Vivado 自带的综合布线工具进行综合布线。综合布线后得出RTL 级原理图,观察寄存器传输级(Register Transfer Level,RTL)总原理图查看各模块的连接关系和资源使用情况来了解各项资源占用率。
用Vivado 自带的综合布线工具进行综合布线后,资源使用情况如图7 所示。查找表有3 393 个,约占7%;触发器FF 有4 321 个,约占5%;BRAM 缓存109.50,约占80%;输入输出口38 个,占19%;缓冲器7 个,约占22%;锁相环(Phase Locked Loop,PLL)1 个,约占25%。该设计主要使用了片内BRAM 资源,算法电路所占资源比例较小。
图7 资源使用情况
基于ZedBoard 搭建了测试系统。为便于观察,采用VGA 显示器实时显示各个阶段处理效果。通过人脸特征标识变化情况和开发板上LED 灯的亮灭情况来测试系统功能及性能。测试效果如图8 所示。
图8 测试效果
从图8 中可知,第1 张图为视频流原样显示;第2 张图为二值化后的效果,将肤色区域变为白色;第3 张图为滤波后的效果,将背景的大部分噪点滤掉,使背景变得干净;第4 张图为人脸特征标识后的效果,可实时标识出人脸特征;第5 张图为人低头后的效果,能实时跟踪标识人脸;第6 张图为开发板上LED 指示灯亮,即疲劳检测预警灯亮,证明功能有效可行。
该文完成了基于FPGA 的人脸识别算法和疲劳驾驶检测的硬件加速器设计,并对原型进行了验证。通过进一步优化算法,完成驾驶员眼睛及嘴巴的特征识别,使得疲劳特征更加准确。所设计的人脸识别算法和疲劳驾驶检测的硬件加速器已经完成产品化和市场化[14]。
并行处理的纯硬件开发比串行处理的软件开发具有开发速度更快的优势,使其进行疲劳检测和预警更高效[15]。该加速器可以同时处理不同任务,工作效率更高。系统尺寸小,成本低,实时性良好。可移植性高,可作为IP 使用,不受FPGA 开发平台的限制[16]。