何 凱,梁 蓓,楊發(fā)順
(貴州大學 大數(shù)據(jù)與信息工程學院,貴州 貴陽 550025)
視覺定位技術是機器視覺研究領域的一個分支,在工業(yè)、醫(yī)療等領域都有廣泛的應用前景,光學定位是其中常見的一種定位技術。本文探討了一種以被動式光學反射標記物作為特征點的圖像坐標求取方法,即以近紅外波長反射材料制作靶點,在相機上安裝特定的濾光片,以獲得特征點明顯的灰度圖像。此種方案具有魯棒性強、精度高、使用方便的特點。
特征點圖像坐標的獲取涉及高斯濾波、二值化、坐標點求取等算法。借助于開源的OpenCV(Open Source Computer Vision)視覺庫,在傳統(tǒng)串行架構的嵌入式處理器上可以用軟件方式輕松實現(xiàn)特征點圖像坐標的求取,但該方式存在功耗高、延時長以及數(shù)據(jù)存儲帶寬受限等問題。而利用FPGA(Field-Programmable Gate Array)并行求取特征點圖像坐標的方式則可以解決上述問題。采用HDL(Hardware Description Language)實現(xiàn)則面臨開發(fā)難度大、周期長等問題,尤其是算法的時序問題,需要花費大量的時間進行分析、設計、仿真及優(yōu)化。Xilinx高層次綜合工具Vivado HLS(High Level Synthesis)利用有限狀態(tài)機原理控制算法進程,通過調用與OpenCV視覺庫功能對應的HLS視頻庫,能夠快速地將含有OpenCV視覺庫的算法程序轉化為RTL(Register Transfer Level)硬件。結合Xilinx 高性能和低功耗的Zynq-7000 SoC(System on Chip)處理器平臺,通過軟硬件協(xié)同設計實現(xiàn)對圖像處理軟件的硬件加速,不僅解決了傳統(tǒng)嵌入式處理器處理高清圖像時功耗高、延時長、帶寬受限等問題,還提高了硬件的開發(fā)效率。
Xilinx Vivado HLS利用有限狀態(tài)機原理控制算法進程,從求取特征點圖像坐標的算法程序中提取控制和數(shù)據(jù)流,通過頂層函數(shù)控制流的一些節(jié)點,將控制傳遞到各個子程序中,從而達到并行執(zhí)行子程序的目的。Vivado HLS本質上是一款軟件編譯器,通過對算法進行規(guī)范以及添加適當?shù)募s束指令把相關的OpenCV視覺庫算法程序高層次地綜合成具有時序和并行性的RTL硬件。
對求取特征點圖像坐標進行軟件算法設計,首先通過高斯濾波算法對圖像進行降噪處理,然后對圖像進行二值化處理,以獲取該圖像的二值圖。上述預處理環(huán)節(jié)均是通過調用OpenCV視覺庫中的相關函數(shù)來完成的。介于硬件已經(jīng)對圖像背景做了很好的濾除,經(jīng)過簡單的二值化處理,便能獲得圖像特征點與背景黑白分明的二值圖像,最后遍歷圖像矩陣數(shù)據(jù)累加大于閾值的像素點的坐標,將累加結果除以像素點數(shù)得到對應的特征點圖像坐標(x,y)。經(jīng)過仿真驗證后在ARM處理器上實現(xiàn)求取特征點圖像坐標的功能。求取特征點圖像坐標算法結構圖如圖1所示。
圖1 求取特征點圖像坐標算法結構圖
為了規(guī)劃算法在Zynq SoC架構上的實現(xiàn),文中對ARM軟件實現(xiàn)方式進行測試。當系統(tǒng)工作在666.6 MHz頻率時,處理像素為1 280×1 024的圖像。取20幀求平均時間,記錄主要處理步驟的執(zhí)行時間,記錄結果如表1所示。
表1 ARM軟件實現(xiàn)主要處理步驟執(zhí)行時間
由表1數(shù)據(jù)可以看出,在ARM平臺軟件實現(xiàn)中,高斯濾波、二值化處理、求取坐標等過程共消耗337.2 ms,占據(jù)了系統(tǒng)大量的處理時間,導致整個系統(tǒng)的處理速率降低。本文提出的設計將對計算量較大的處理環(huán)節(jié)進行硬件加速,從而達到提高系統(tǒng)的處理速率的目的。
在Vivado HLS上對求取特征點圖像坐標的算法程序進行硬件加速,需對程序進行算法規(guī)范。為了與HLS視頻庫處理機制相匹配,將原程序改寫成基于視頻數(shù)據(jù)流鏈的算法程序。在預處理環(huán)節(jié)中,OpenCV視覺庫函數(shù)中的高斯濾波和二值化程序包含了Vivado HLS 在編譯時不能綜合的動態(tài)內存分配、浮點運算等,因此需要用功能相同的HLS視頻庫函數(shù)進行替換。由于HLS視頻庫中的高斯濾波、二值化處理等函數(shù)與OpenCV視覺庫中相應功能的函數(shù)具有相似的接口與算法,為適應FPGA的并行架構,對HLS視頻庫函數(shù)進行了浮點運算轉化成定點運算、片上行緩存、窗口緩存等優(yōu)化。預處理后的圖像交由求取特征點圖像坐標環(huán)節(jié)進行加速處理。需要注意的是,與ARM軟件實現(xiàn)代碼不同,編寫可加速代碼的過程中不能包含任何運行時動態(tài)存儲器分配,必須在代碼中明確描述算法使用的所有存儲器陣列,并通過手工添加約束優(yōu)化系統(tǒng)結構,使算法模塊符合AXI(Advanced eXtensible Interface)協(xié)議標準。在該設計中,定義了3個大小為1 280×1 024,HLS_8UC1的圖像內存,將算法處理過程中的圖像映射到存儲單元,并將(x,y)坐標及return的接口設置Saxi_AXILiteS模式,輸入圖像的接口設置為axis模式。坐標求取環(huán)節(jié)主要實現(xiàn)遍歷累加大于閾值的像素點的坐標,并將累加結果除以像素點數(shù)以求取對應的特征點圖像坐標(x,y)的功能。將此環(huán)節(jié)放置于HLS視頻庫函數(shù)鏈之后,預處理后的圖像數(shù)據(jù)由求取坐標環(huán)節(jié)消耗,并輸出特征點圖像坐標(x,y)。求取特征點圖像坐標算法硬件加速設計流程圖如圖2所示。
圖2 求取特征點圖像坐標算法硬件加速設計流程圖
該設計通過dataflow指令對硬件加速模塊進行優(yōu)化,主要指示Vivado HLS通過并行方式安排執(zhí)行該函數(shù)的所有子函數(shù),從而達到縮短延時、提高吞吐率的效果。利用編譯器對軟件進行RTL實現(xiàn),在RTL/C++協(xié)同仿真驗證階段,取20幀圖像并求取特征點圖像坐標的結果進行對比分析,圖像坐標(x,y)的值精確到小數(shù)點后3位。試驗驗證表明,兩種實現(xiàn)方式的仿真結果相同。驗證后編譯器以AXI兼容的方式對IP核進行封裝,封裝過程中編譯器自動生成IP核的軟件驅動,從而完成整個求取特征點圖像坐標模塊(Coordinates)的IP核設計。整體求取特征點圖像坐標算法硬件加速設計流程如圖3所示。
圖3 整體求取特征點圖像坐標硬件加速設計流程圖
求取特征點圖像坐標算法經(jīng)Vivado HLS綜合后,統(tǒng)計了其在XC7Z020-2CLG400I 器件FPGA部分的資源占用率,如表2所示。
表2 PL部分的資源占用統(tǒng)計表
Zynq SoC融合了通用嵌入式單元(Processing System,PS)和可編程邏輯單元(Programmable Logic,PL)兩種架構。PS包含雙核ARM Cortex A9處理器及一些關鍵外設;而PL實際上是Xilinx 7系列的FPGA,可作為PS外設的一部分,用于擴展處理平臺。Zynq SoC啟動流程與FPGA不同,但與傳統(tǒng)ARM處理器類似,支持JTAG、NAND、parallel NOR、Serial NOR(Quad-SPI)以及SD卡等啟動方式。該設計采用Basler GigE相機,需要Linux系統(tǒng)作為裝載驅動的平臺,因此Zynq SoC采用SD卡啟動方式:(1)將SD卡分為卷標rootfs的EXT3格式與卷標BOOT的FAT32格式的兩區(qū)并格式化,將Linaro Ubuntu文件系統(tǒng)放進SD卡的rootfs分區(qū);(2)根據(jù)系統(tǒng)需求添加PS的SD卡千兆以太網(wǎng)等外設并完成系統(tǒng)的模塊設計(Block Design),將仿真綜合后生成的二進制比特流文件(systerm.bit)導入Vivado SDK(Software Development Kit)與第一階段引導文件(fsbl.elf)、Linux系統(tǒng)的啟動文件(u-boot.elf)合成加載啟動任務的文件(Uboot.bin);(3)根據(jù)配置修改內核文件并編譯生成二進制的Linux內核鏡像文件(uImage),依據(jù)內核配置裁減設備樹文件生成二進制設備樹文件(devicetree.dtb);(4)將Uboot.bin、uImage、devicetree.dtb3個文件放入BOOT分區(qū),構建基于Zynq SoC的板載系統(tǒng)。在系統(tǒng)規(guī)劃中,PS主要負責抓取圖像與控制系統(tǒng)進程;計算密集型數(shù)據(jù)則由PL加速處理。利用Zynq SoC完成求取特征點圖像坐標系統(tǒng)的搭建,具體過程如圖4所示。
圖4 特征點圖像坐標求取系統(tǒng)
PS處理系統(tǒng)抓取圖像與控制系統(tǒng)進程功能主要分為5個流程實現(xiàn),具體流程如下:
(1)運行Linaro Ubuntu板載系統(tǒng),為上層應用提供Linux操作系統(tǒng)支持;
(2)在PS中安裝Basler Pylon驅動程序軟件包,從Basler相機中抓取圖像并存儲到PS和PL共用的DDR3存儲芯片中;
(3)通過調用Vivado HLS 自帶的VDMA(Video Direct Memory Access)視頻存儲器直接訪問IP核驅動程序實現(xiàn)對讀寫過程中的通道控制;
(4)裝載OpenCV視覺庫,運行OpenCV軟件算法程序;
(5)運行軟件控制整個系統(tǒng)的進程。
圖像采集使用的是Basler GigE千兆網(wǎng)工業(yè)相機,該相機配有e2v EV76C661 CMOS 感光芯片,幀率可達 60 fps,130萬像素。該相機具有較低的延遲和抖動時間,GigE每秒數(shù)據(jù)量超過100 MB,能夠快速傳輸高清圖片無需擔心帶寬問題。實際操作中,將相機與PS端的以太網(wǎng)口相連,在板載系統(tǒng)中安裝相機驅動程序軟件包;設置板載系統(tǒng)的IP地址與相機IP在同一個網(wǎng)段,編寫并調試軟件抓取圖像,并將抓取的圖像存儲在PL、PS共享的DDR3內存中。
PL加速處理密集型數(shù)據(jù)功能主要分為以下3個流程完成:
(1)將生成的Coordinates IP核加入PL中,并與其他模塊相連接;
(2)通過軟件調用VDMA從PL、PS共享DDR3存儲芯片中讀取圖像并傳輸至Coordinates IP核中進行加速處理;
(3)加速處理完成以后計算出特征點的圖像坐標,將坐標(x,y)的輸出設定為S_axi_AXILiteS模式,與PS端的AXI互聯(lián)總線連接,則可用MMAP函數(shù)將設備映射到內存,然后直接操作虛擬地址從Coordinates IP核的寄存器讀取(x,y)的像素值。
在Zynq SOC內部,PS和PL共享DDR3控制器。PS訪問DDR3內存較為簡單,只要操作DDR3內存映射的虛擬地址即可。對于PL而言,要接入DDR3,必須通過遵循AXI協(xié)議AXI_HP端口。該設計采用Xilinx官方提供的VDMA IP核,VDMA是一種遵循AXI協(xié)議的軟核IP,可以實現(xiàn)雙緩沖和多緩沖機制,并且能夠直接與AXI_HP端口相連。VDMA數(shù)據(jù)接口可以分為讀、寫通道,使用時可以通過寫通道將AXI-Stream類型的數(shù)據(jù)流寫入DDR3,通過讀通道可以從DDR3讀取數(shù)據(jù),并以AXI-Stream類型的格式輸出。VDMA本質上是一個數(shù)據(jù)搬運IP,為數(shù)據(jù)進出DDR3提供了一種便捷的方案。
RTL/C++聯(lián)合仿真驗證表明,經(jīng)算法規(guī)范加速后,兩種實現(xiàn)方式的仿真結果完全一致。為了直觀體現(xiàn)硬件加速的效果,文中對比兩種實現(xiàn)方法的執(zhí)行時間。系統(tǒng)中Basler 相機分辨率為1 280×1 024,幀率達到60 fps。取五幀圖像進行對比,ARM 工作時鐘設置為666.6 MHz,F(xiàn)PGA工作時鐘設置為100 MHz,不同實現(xiàn)方式執(zhí)行時間如表3所示。
表3 不同實現(xiàn)方式所需時間對比
由表2可知,若將相機獲取圖片以及硬件加速時傳輸圖像的時間都計算在內,Zynq SOC硬件處理系統(tǒng)每幀的平均時間為33.1 ms,而ARM軟件處理系統(tǒng)每幀的平均時間為353.3 ms。整個系統(tǒng)用Zynq SOC硬件實現(xiàn)求取特征點圖像坐標算法比ARM軟件實現(xiàn)要快9倍。若僅從算法的處理時間上看,包括高斯濾波、二值化、圖像坐標求取步驟,硬件處理算法僅耗時10.2 ms,比軟件處理算法的335.8 ms要快33倍。
本文提出了一種基于Vivado HLS開發(fā)工具來對軟件程序進行硬件加速的解決方案。借助于Xilinx的Vivado HLS 開發(fā)工具設計了求取特征點圖像坐標的硬件加速單元,并在Zynq SOC上完成整個系統(tǒng)的設計。通過對比不同系統(tǒng)下軟硬件實現(xiàn)的執(zhí)行時間,可以看出硬件加速方案顯著提高了系統(tǒng)的計算性能,而通過采用軟硬協(xié)同設計的方法大大降低了系統(tǒng)硬件的開發(fā)時間。該方案對計算密集型軟件算法的優(yōu)化具有一定參考價值。
[1]張展,崔晉偉,陸炯.基于Xilinx Vivado HLS的小型無人機平衡儀設計[J].電子科技,2015,28(7):151-154.
[2]周體民,佐風玲,吳宜軒,等. 基于Zedboard的便攜式頻譜儀的設計與實現(xiàn)[J].電子科技,2017,30(7):139-145.
[3]彭習武,張濤. 基于Vivado HLS的邊緣檢測硬件加速應用[J].電子應用技術,2017,43(5):70-73.
[4]丁帥帥,柴志雷.基于HLS的SURF特征提取硬件加速單元設計與實現(xiàn)[J].微電子學與計算機,2015,32(9):133-143.
[5]郭豐收.Xilinx FPGA/Zynq設計中使用HLS實現(xiàn)OpenCV的開發(fā)流程[J].電子產(chǎn)品世界,2014(2-3):50-52.
[6]李振宇.基于PL-PS架構的圖像處理系統(tǒng)的實現(xiàn)與算法應用[D].濟南:山東大學,2016.
[7]何賓.Xilinx FPGA設計權威指南[M].北京:清華大學出版社,2014.
[8]黨宏社,王黎,王曉倩.基于Vivado HLS的FPGA開發(fā)與應用研究[J].陜西科技大學學報,2015,33(1):155-159.
[9]張俊濤,王園偉,龐多.一種硬件加速OpenCV的圖像處理方法研究[J].微型機與應用,2015,34(22):41-43.
[10] 張艷輝,郭洺宇,何賓. Vivado HLS嵌入式實時圖像處理系統(tǒng)的構建與實現(xiàn)[J].電子技術應用,2015,34(22):115-121.
[11] 焦再強.基于Zynq-7000的嵌入式數(shù)字圖像處理系統(tǒng)設計與實現(xiàn)[D].太原:太原理工大學,2015.
[12] 陸佳華,江舟.嵌入式系統(tǒng)軟硬件協(xié)同設計實戰(zhàn)指南[M].北京:機械工業(yè)出版社,2013.
[13] 陸啟帥,陸彥婷,王地.Xilinx Zynq SoC與Linux嵌入式設計實戰(zhàn)指南[M].北京:清華大學出版社,2014.
[14] 郭暉,陳光.基于OpenCV的視頻圖像處理應用研究[J].微機型與應用,2010,29(21):14-20.
[15] 姬生毅.基于Zynq的嵌入式數(shù)字圖像傳輸系統(tǒng)的設計與實現(xiàn)[D].西安:西安電子科技大學,2014.
[16] 楊曉安,羅杰,蘇豪,等.基于Zynq-7000高速圖像采集與實時處理系統(tǒng)[J].電子科技,2014,27(7):151-154.