摘 要: 研究了一种基于Vivado HLS加速OpenCV程序的方法,其核心是利用Xilinx高层次综合工具Vivado HLS,将C++编写的OpenCV程序按照Vivado HLS处理规范进行修改,进而将代码转换为硬件描述语言,可快速生成IP核。结合Xilinx Zynq SoC架构和其视频图像处理方面的优势,通过软硬件协同的方法,实现OpenCV程序算法向高性能处理平台Zynq SoC系统的移植和加速。该方法对图像处理软件设计的硬件化加速具有重要的应用价值。
0 引言
开源计算机视觉库OpenCV是目前最受欢迎的开源计算机视觉软件函数包[1],为计算机视觉的研究和图像处理应用提供了很大的便利。然而,OpenCV程序算法都是在PC上通过软件运行的方式实现,存在处理实时性差、适用范围有限等问题,尤其是在高清图像处理方面经常受到外部存储器性能的限制,存储带宽经常成为其程序优化的瓶颈,并且存储访问也限制了功耗效率[2]。
基于FPGA可用全硬件实现图像处理算法,在嵌入式系统应用中得天独厚,所以很值得尝试利用可编程逻辑硬件来加速OpenCV。Vivado HLS是Xilinx最新开发的一种高级综合工具,可以直接将C/C++编写的算法程序进行仿真综合成RTL,从而可以在FPGA上实现图像处理算法。Vivado HLS具有专门的图像处理库,与OpenCV函数对应。
本文主要研究高层次综合工具Vivado HLS及Xilinx Zynq SOC全可编程处理平台、Vivado图像视频函数库,并通过高级综合工具Vivado HLS将OpenCV转化为RTL处理流程,在Xilinx Zynq SoC系列全可编程处理平台上实现OpenCV程序算法的硬件加速。以边缘检测为例说明加速流程。
1 Zynq SOC与HLS
Xilinx Zynq SOC是具有ARM+FPGA架构的全可编程处理器,集成了双核Cortex-A9处理系统、FPGA逻辑和一些关键外设,提供了软硬件和I/O可编程性。Zynq SOC具有64位高性能端口,可以实现对外部存储器的访问;还有32位通用端口实现控制寄存器的访问,并且使用AXI4-Stream能更好地解决高清视频流速度问题。处理子系统、FPGA逻辑和外设在Zynq SOC中的高度集成性确保了相对于采用分离式组建设计的系统而言提高数据传输速率,高度的软硬件集成性能帮助设计人员实现极为高效的嵌入式视觉系统,降低功耗和材料清单成本。Zynq SoC视频图像处理架构如图1所示[3]。为了全面利用Zynq SOC的诸多性能,Xilinx推出了以IP设计为中心的设计环境Vivado设计套件,该套件可加速集成和设计实现。而Vivado HLS作为该套件的一个重要组件,能帮助设计人员将采用C/C++语言的开发的算法编译为RTL,以便在FPGA逻辑中运行。在图像处理复杂算法中,通过C/C++创建算法原型,再利用Vivado HLS将算法或者算法的一部分编译为RTL,进而确定哪些函数更适合在FPGA逻辑中运行,哪些函数适合在ARM上运行,这样更能集中精力设计出最佳性能的基于Zynq SOC的视觉系统。利用高级综合工具Vivado HLS开发的流程如图2所示。
2 OpenCV算法程序到Vivado HLS程序的修改
对OpenCV程序的硬件加速,实际上是将OpenCV转化为可综合的代码,用可综合的Vivado HLS视频库函数代替OpenCV函数。VIvado HLS具有专门支持OpenCV的视频函数库,这些函数可以代替OpenCV函数,并且能很好地综合为RTl代码,进而可以利用Zynq全可编程SoC的优势实现图像或者视频的处理。
2.1 OpenCV与Vivado HLS视频函数库
Vivado HLS高级语言综合工具包含了专门的OpenCV视频库,通过HLS库中的函数代替原本OpenCV算法程序中的函数便可以完成由OpenCV到HLS的转化,在Zynq上硬件化后,提高OpenCV应用效率[4]。
OpenCV经常用到的数据类型有Mat、CvMat和IplImage[5],VivadoHLS视频处理函数库使用hls::Mat<>数据类型,这种类型用于模型化视频像素流处理,等同于hls::steam<>流的类型,而不是OpenCV中在外部memory中存储的matrix矩阵类型。因此,在用Vivado HLS实现OpenCV的设计中,需要将输入和输出HLS可综合的视频设计接口修改为Video stream接口,也就是采用HLS提供的Video接口可综合函数,实现AXI4 Video stream到Vivado HLS中hls::Mat<>类型的转换[6]。
从软件到RTL过程中,最关键的是接口问题,而HLS创建的硬件专注于硬件接口,Vivado HLS支持以相对较小的可以轻松创建AXI的从接口,从而使硬件加速器设计变得简单。在视频处理中,Xilinx通过AXI4流协议来实现像素通信,以更小的元素来传输视频帧,可以不用知道视频流的大小或者图片的尺寸,大大简化了视频处理计算。
2.2 OpenCV程序修改方法
使用HLS加速OpenCV时,需要先用I/O函数提取FPGA实现部分,用可综合的Vivado HLS函数库函数代替OpenCV函数。在Zynq开发中使用Vivado HLS实现OpenCV的设计流程如下[7]:
首先,开发OpenCV的应用,编写源码和测试文件,并且采用C++编译器进行编译、仿真和调试,产生可执行文件。
其次,使用I/O函数抽取FPGA实现部分,并且使用可综合的Vivado HLS库函数代码代替OpenCV函数的调用。其流程如图3所示。
最后,运用HLS生成的RTL代码,在Vivado HLS工程中启动co-sim,HLS工具自动重用OpenCV的测试激励验证产生的RTL代码。在Xilinx的Vivado集成开发环境中做RTL集成和SOC/FPGA实现。
3 硬件加速OpenCV程序应用
本文通过边缘检测算法来介绍硬件加速OpenCV应用。根据前面介绍的方法,利用OpenCV库函数先设计出边缘检测算法原型,如图4所示,并使用基于OpenCV的测试激励验证这个算法。再改写前面设计好的OpenCV算法程序,按照视频数据链的形式重新改写,如图5所示,这样与HLS视频库处理机制相同,方便函数替换。最后将改写好的OpenCV程序中的函数替换为HLS提供的相应功能的函数,如图6所示,并且使用Vivado HLS工具综合,综合之后生成IP,在Vivado集成开发环境中以IP为核心完成设计,在SDK中利用原OpenCV测试激励进行测试,基于边缘设计应用测试结果如图7所示。
4 结论
使用高层次综合工具Vivado HLS结合逻辑可编程FPGA或者Zynq SOC实现OpenCV在高分辨帧率的实时视频处理是解决目前OpenCV软件程序速度优化瓶颈问题的有效方法。采用Vivado HLS视频库能加快OpenCV函数向可综合逻辑器件Zynq SOC或FPGA的映射。同样,也可以利用Zynq SOC结合Vivado HLS工具的方法,来硬件加速其他计算机软件设计。该方法对加速优化高速算法软件设计具有一定的参考价值。