陈支鹏,张 霞,白 鹏,李 超
(西安邮电大学电子工程学院,陕西西安 710121)
运动目标检测被广泛应用于智能安防、自动驾驶、重点场所监控(如博物馆、银行、危险品库房等)等众多领域,其检测结果可进一步用于目标跟踪、目标行为识别等[1-2]。
传统的运动目标检测方法包括帧间差分法[3]、背景减除法[4]、光流法[5],三种方法各有其优缺点。其中,帧间差分法计算复杂度低、速度快、对光照变化不敏感,能够满足嵌入式终端设备对实时性的要求[6]。近年来,各种运动目标检测优化算法层出不穷,且已经在CPU 平台上实现了部署。但由于CPU自身设计架构的局限性,其难以支持并行计算从而导致处理效率存在明显不足。现场可编程门阵列(Field Programmable Gate Array,FPGA)能够在灵活性、性能、功耗、成本之间达到较好的平衡,因此在边缘计算的嵌入式系统中得到广泛应用[7-8]。相较于CPU,FPGA 并行计算能力可提升运算速率并降低时延。相较于ASIC,FPGA 具有开发周期短、灵活性强、性价比高的优势。相较于GPU,FPGA 的功耗更低,更加适合嵌入式移动终端的应用场景。
为了在嵌入式移动终端上实现运动目标检测,基于软硬件协同设计的思路,采用Xilinx 的PYNQZ2 开发平台,设计并实现了基于帧间差分法的运动目标检测系统。该系统能够实现多运动目标的同时检测,且能够适应光照变化的影响,具有一定的鲁棒性和实时性。
系统划分为三个主要模块,包括图像采集模块、图像处理模块以及图像显示模块。图像采集模块使用USB 接口连接摄像头采集视频数据。图像处理模块包括RGB 转灰度、形态学开运算、帧间差分等一系列操作。图像显示模块使用HDMI 接口连接显示器,显示运动目标检测结果。系统框图如图1所示。
图1 系统总体设计图
PYNQ 全称是Python Productivity for Zynq,即Zynq 的Python 生产力[9]。Zynq 是Xilinx 的片上系统,它拥有双核ARM Cortex-A9 处理器+FPGA 可编程逻辑门阵列结构。Zynq 架构分为可编程逻辑PL 端和处理系统PS 端。PYNQ-Z2 是Xilinx 公司推出的一款FPGA 开发板,如图2 所示,其以ZYNQ XC7Z020 FPGA 为核心,利用ZYNQ 中的可编程逻辑和ARM处理器的优势可以构建强大的嵌入式系统。PYNQ的开源框架可以使嵌入式编程用户在无需设计可编程逻辑电路的情况下充分发挥Xilinx ZYNQ SoC的功能[10],已在图像分类、传感器等多个领域得到了应用[11-15]。
图2 PYNQ-Z2开发板
该设计使用USB 接口的摄像头(DF200-1080P)作为系统视频采集工具,在PYNQ-Z2 的base overlay中调用HDMI 输入的硬件电路,将视频数据的一帧图像在DDR 中存储,便于后续图像处理。所采集图像的分辨率可为1 280×720 或800×600,像素格式为RGB888。
首先将所采集的RGB 图像转为灰度图像。其次是形态学开运算,即先腐蚀,再膨胀。开运算能够将相互之间有细微连接关系的两个物体分离开,保证每个物体完整性的同时,提高抗干扰性能和检测精度。
当视频图像中有运动目标时,前后两帧图像就会有像素点上的变化。用后一帧图像的像素点减去前一帧图像的像素点即可得到运动目标所在的区域[16]。帧间差分法的实现流程如图3 所示,首先缓存前一帧图像数据,在当前帧图像数据到来时,将两帧图像对应像素点的灰度值进行相减,并取其绝对值。接着进行图像二值化操作,将差分图像的像素点与设定的阈值进行比较,大于阈值时为255,该点即为运动目标点;小于阈值时为0,该点即为背景像素点。经过测试,选择图像二值化的阈值为20,得到的处理结果较好。最后将检测到的连续运动目标区域用边框进行标记,并送入图像显示模块。
图3 帧间差分法的实现流程
该设计通过HDMI 接口连接显示器做图像显示工具,在PYNQ-Z2 的base overlay 中调用HDMI 输出的硬件电路,将处理好的视频图像结果传输到显示器显示。输出视频格式与输入格式一致。
系统的图像处理模块在可编程逻辑PL 部分实现,使用Xilinx Vitis HLS 工具对模块内的每个操作进行硬件加速IP 核的开发,即通过高层次综合工具将使用C++描述的算法代码转换为硬件IP 核。
使用Vitis HLS 的视频库函数来代替OpenCV 的功能函数。当视频数据进入硬件加速后,需要使用AXIvideo2xfMat 转换函数将视频转换成HLS 视频库可用格式,经过加速处理后再使用xfMat2AXIvideo转换函数将视频转换成传输的数据流。
2.1.1 RGB转灰度IP核设计
IP 核设计流程严格遵守HLS 开发工具相关要求。首先添加头文件和编写C++代码文件,并确定IP 核的顶层函数。该IP 核使用cvtcolor 函数将彩色图像转换成灰度图像。对函数相关参数以及输入输出参数进行定义,具体参数设置如表1 所示。添加DATAFLOW优化指令确保各个处理函数能并行执行。
表1 RGB转灰度IP核参数设置
之后对C++代码进行编译仿真测试,验证无误后将其综合成RTL 设计,并使用RTL 协同仿真验证,生成综合报告,最后导出为RTL IP 核。RGB 转灰度操作IP 核模块如图4 所示。由于顶层传递参数为AXI _STREAM 类型的函数,所以声 明src 和dst 为AXI_STREAM 协议的接口。需要寄存器控制IP 核处理图像的大小、位宽等参数信息以及开始/停止等信号,将这些控制寄存器声明为SLAVE_AXI_LITE的协议接口,s_axi_control 来控制和配置IP 核。本IP 核的控制路径和数据路径即AXI_LITE 和AXI_STREAM 都使用和ZYNQ_HP接口相同的时钟,ap_clk为上述路径的共同时钟。ap_rst_n为复位信号,interrupt为中断信号。
图4 RGB转灰度操作IP核模块
2.1.2 形态学开运算IP核设计
形态学开运算是先进行腐蚀操作,再进行膨胀操作,使用3×3 矩阵的结构内核。腐蚀部分调用XILINX_VITIS_VISION 库的erosion 函数加速核做处理,膨胀部分调用dilation 函数加速核做处理。输入输出及函数相关参数设置如表2 所示。
2.1.3 帧间差分IP核设计
帧间差分法中的帧间差分操作(即两帧图像相减并取绝对值)调用了absdiff 函数加速核做处理。帧间差分IP 核的相关参数设置如表3 所示。
2.1.4 图像二值化IP核设计
帧间差分法中的图像二值化操作调用了threshold 函数加速核做处理。相关参数设置如表4所示。
表4 图像二值化IP核参数设置
2.2.1 数据传输通路配置
数据传输调用HDMI 模块处理视频输入和输出,输入视频数据通过VDMA 模块缓存到DDR 存储器,进行图像处理时使用VDMA 模块将数据从DDR中取出。经过处理的图像数据同样使用VDMA 模块存入DDR 中。
2.2.2 图像处理模块配置
图像处理模块中各个IP 核按照处理流程进行连接,一帧RGB 图像转成灰度图像,经过形态学开运算缓存到DDR 中,等待下一帧图像经过相同处理后一同送入帧间差分IP 核做帧差处理,并将结果与阈值进行比较。硬件加速IP 核与DDR 存储器之间调用VDMA 模块传输数据。图像处理模块硬件连接示意图如图5 所示。
图5 图像处理模块硬件连接示意图
2.2.3 ZYNQ_PS IP配置
通路搭建需要对ZYNQ 芯片参数和系统I/O 口进行配置。ZYNQ 芯片的相关参数配置操作有对PS端和PL 端的接口进行配置;设置时钟规范。该系统使用的HDMI、USB、SD 接口以及URAT 等I/O 接口均在ZYNQ 芯片的I/O 外设选项中进行配置。
PYNQ 开发平台在处理系统PS 端使用Python 编程语言对硬件模块进行操作调用,Xilinx 官方提供的函数库文件也让开发者很方便地使用Python 进行硬件开发。
在Jupyter Notebook 程序中首先对系统进行初始化,导入设计所需库函数(Numpy,cv2 等)和Overlay。需要例化各IP 核并设置其参数:例化视频的输入输出,例化图像处理IP 核,设置视频的分辨率,例化传输模块IP 核,设置传输的视频数据类型格式。对于控制类的数据传输,使用MMIO 接口来配置IP 寄存器,并使用write 函数将数据写入对应地址。
例化定义完成后,控制视频处理操作。将第一帧经过灰度处理和形态学开运算处理的图像数据采集出来送入帧间差分IP 核中,手动设置10 ms 延迟后将第二帧经过相同处理后的图像数据采集后送入帧间差分IP 核中,让二者进行帧差运算。使用cv2函数分割处理找到目标边框坐标并叠加到原图像上,结果存放到HDMI 输出缓存区。
系统搭载在PYNQ-Z2 开发板上,测试之前先对开发板进行相应的环境配置,将设计的Overlay 烧写到开发板中,并使用Python 语言进行操控。实际检测效果如图6 所示。
图6 实际检测效果图
由图6 可见,系统可同时对多个运动目标进行检测,且经测试系统功耗为2.06 W。在相同平台下将本系统与仅使用PS 端的无硬件加速系统进行对比,在不同输入视频分辨率下的检测速度如表5 所示。
表5 检测速度对比
由表5 可见,硬件加速后的运动目标检测系统的检测速度在视频分辨率为800×600 时提升了约2.8 倍,在视频分辨率为1 280×720时提升了约2.4倍。
对系统在不同光照条件下的鲁棒性进行测试,检测效果如图7 所示。可见,该系统能够较好地适应光照变化的影响。
图7 不同光照条件下的检测效果
基于软硬件协同设计的基本思想在PYNQ-Z2平台上实现了运动目标检测系统。该系统可以同时检测多个运动目标,处理速度也基本满足实时性要求,适合嵌入式移动终端的应用场景运动目标检测。