陳支鵬,張 霞,白 鵬,李 超
(西安郵電大學(xué)電子工程學(xué)院,陜西西安 710121)
運(yùn)動(dòng)目標(biāo)檢測(cè)被廣泛應(yīng)用于智能安防、自動(dòng)駕駛、重點(diǎn)場(chǎng)所監(jiān)控(如博物館、銀行、危險(xiǎn)品庫(kù)房等)等眾多領(lǐng)域,其檢測(cè)結(jié)果可進(jìn)一步用于目標(biāo)跟蹤、目標(biāo)行為識(shí)別等[1-2]。
傳統(tǒng)的運(yùn)動(dòng)目標(biāo)檢測(cè)方法包括幀間差分法[3]、背景減除法[4]、光流法[5],三種方法各有其優(yōu)缺點(diǎn)。其中,幀間差分法計(jì)算復(fù)雜度低、速度快、對(duì)光照變化不敏感,能夠滿足嵌入式終端設(shè)備對(duì)實(shí)時(shí)性的要求[6]。近年來(lái),各種運(yùn)動(dòng)目標(biāo)檢測(cè)優(yōu)化算法層出不窮,且已經(jīng)在CPU 平臺(tái)上實(shí)現(xiàn)了部署。但由于CPU自身設(shè)計(jì)架構(gòu)的局限性,其難以支持并行計(jì)算從而導(dǎo)致處理效率存在明顯不足?,F(xiàn)場(chǎng)可編程門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)能夠在靈活性、性能、功耗、成本之間達(dá)到較好的平衡,因此在邊緣計(jì)算的嵌入式系統(tǒng)中得到廣泛應(yīng)用[7-8]。相較于CPU,F(xiàn)PGA 并行計(jì)算能力可提升運(yùn)算速率并降低時(shí)延。相較于ASIC,F(xiàn)PGA 具有開(kāi)發(fā)周期短、靈活性強(qiáng)、性價(jià)比高的優(yōu)勢(shì)。相較于GPU,F(xiàn)PGA 的功耗更低,更加適合嵌入式移動(dòng)終端的應(yīng)用場(chǎng)景。
為了在嵌入式移動(dòng)終端上實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)檢測(cè),基于軟硬件協(xié)同設(shè)計(jì)的思路,采用Xilinx 的PYNQZ2 開(kāi)發(fā)平臺(tái),設(shè)計(jì)并實(shí)現(xiàn)了基于幀間差分法的運(yùn)動(dòng)目標(biāo)檢測(cè)系統(tǒng)。該系統(tǒng)能夠?qū)崿F(xiàn)多運(yùn)動(dòng)目標(biāo)的同時(shí)檢測(cè),且能夠適應(yīng)光照變化的影響,具有一定的魯棒性和實(shí)時(shí)性。
系統(tǒng)劃分為三個(gè)主要模塊,包括圖像采集模塊、圖像處理模塊以及圖像顯示模塊。圖像采集模塊使用USB 接口連接攝像頭采集視頻數(shù)據(jù)。圖像處理模塊包括RGB 轉(zhuǎn)灰度、形態(tài)學(xué)開(kāi)運(yùn)算、幀間差分等一系列操作。圖像顯示模塊使用HDMI 接口連接顯示器,顯示運(yùn)動(dòng)目標(biāo)檢測(cè)結(jié)果。系統(tǒng)框圖如圖1所示。
圖1 系統(tǒng)總體設(shè)計(jì)圖
PYNQ 全稱是Python Productivity for Zynq,即Zynq 的Python 生產(chǎn)力[9]。Zynq 是Xilinx 的片上系統(tǒng),它擁有雙核ARM Cortex-A9 處理器+FPGA 可編程邏輯門(mén)陣列結(jié)構(gòu)。Zynq 架構(gòu)分為可編程邏輯PL 端和處理系統(tǒng)PS 端。PYNQ-Z2 是Xilinx 公司推出的一款FPGA 開(kāi)發(fā)板,如圖2 所示,其以ZYNQ XC7Z020 FPGA 為核心,利用ZYNQ 中的可編程邏輯和ARM處理器的優(yōu)勢(shì)可以構(gòu)建強(qiáng)大的嵌入式系統(tǒng)。PYNQ的開(kāi)源框架可以使嵌入式編程用戶在無(wú)需設(shè)計(jì)可編程邏輯電路的情況下充分發(fā)揮Xilinx ZYNQ SoC的功能[10],已在圖像分類、傳感器等多個(gè)領(lǐng)域得到了應(yīng)用[11-15]。
圖2 PYNQ-Z2開(kāi)發(fā)板
該設(shè)計(jì)使用USB 接口的攝像頭(DF200-1080P)作為系統(tǒng)視頻采集工具,在PYNQ-Z2 的base overlay中調(diào)用HDMI 輸入的硬件電路,將視頻數(shù)據(jù)的一幀圖像在DDR 中存儲(chǔ),便于后續(xù)圖像處理。所采集圖像的分辨率可為1 280×720 或800×600,像素格式為RGB888。
首先將所采集的RGB 圖像轉(zhuǎn)為灰度圖像。其次是形態(tài)學(xué)開(kāi)運(yùn)算,即先腐蝕,再膨脹。開(kāi)運(yùn)算能夠?qū)⑾嗷ブg有細(xì)微連接關(guān)系的兩個(gè)物體分離開(kāi),保證每個(gè)物體完整性的同時(shí),提高抗干擾性能和檢測(cè)精度。
當(dāng)視頻圖像中有運(yùn)動(dòng)目標(biāo)時(shí),前后兩幀圖像就會(huì)有像素點(diǎn)上的變化。用后一幀圖像的像素點(diǎn)減去前一幀圖像的像素點(diǎn)即可得到運(yùn)動(dòng)目標(biāo)所在的區(qū)域[16]。幀間差分法的實(shí)現(xiàn)流程如圖3 所示,首先緩存前一幀圖像數(shù)據(jù),在當(dāng)前幀圖像數(shù)據(jù)到來(lái)時(shí),將兩幀圖像對(duì)應(yīng)像素點(diǎn)的灰度值進(jìn)行相減,并取其絕對(duì)值。接著進(jìn)行圖像二值化操作,將差分圖像的像素點(diǎn)與設(shè)定的閾值進(jìn)行比較,大于閾值時(shí)為255,該點(diǎn)即為運(yùn)動(dòng)目標(biāo)點(diǎn);小于閾值時(shí)為0,該點(diǎn)即為背景像素點(diǎn)。經(jīng)過(guò)測(cè)試,選擇圖像二值化的閾值為20,得到的處理結(jié)果較好。最后將檢測(cè)到的連續(xù)運(yùn)動(dòng)目標(biāo)區(qū)域用邊框進(jìn)行標(biāo)記,并送入圖像顯示模塊。
圖3 幀間差分法的實(shí)現(xiàn)流程
該設(shè)計(jì)通過(guò)HDMI 接口連接顯示器做圖像顯示工具,在PYNQ-Z2 的base overlay 中調(diào)用HDMI 輸出的硬件電路,將處理好的視頻圖像結(jié)果傳輸?shù)斤@示器顯示。輸出視頻格式與輸入格式一致。
系統(tǒng)的圖像處理模塊在可編程邏輯PL 部分實(shí)現(xiàn),使用Xilinx Vitis HLS 工具對(duì)模塊內(nèi)的每個(gè)操作進(jìn)行硬件加速I(mǎi)P 核的開(kāi)發(fā),即通過(guò)高層次綜合工具將使用C++描述的算法代碼轉(zhuǎn)換為硬件IP 核。
使用Vitis HLS 的視頻庫(kù)函數(shù)來(lái)代替OpenCV 的功能函數(shù)。當(dāng)視頻數(shù)據(jù)進(jìn)入硬件加速后,需要使用AXIvideo2xfMat 轉(zhuǎn)換函數(shù)將視頻轉(zhuǎn)換成HLS 視頻庫(kù)可用格式,經(jīng)過(guò)加速處理后再使用xfMat2AXIvideo轉(zhuǎn)換函數(shù)將視頻轉(zhuǎn)換成傳輸?shù)臄?shù)據(jù)流。
2.1.1 RGB轉(zhuǎn)灰度IP核設(shè)計(jì)
IP 核設(shè)計(jì)流程嚴(yán)格遵守HLS 開(kāi)發(fā)工具相關(guān)要求。首先添加頭文件和編寫(xiě)C++代碼文件,并確定IP 核的頂層函數(shù)。該IP 核使用cvtcolor 函數(shù)將彩色圖像轉(zhuǎn)換成灰度圖像。對(duì)函數(shù)相關(guān)參數(shù)以及輸入輸出參數(shù)進(jìn)行定義,具體參數(shù)設(shè)置如表1 所示。添加DATAFLOW優(yōu)化指令確保各個(gè)處理函數(shù)能并行執(zhí)行。
表1 RGB轉(zhuǎn)灰度IP核參數(shù)設(shè)置
之后對(duì)C++代碼進(jìn)行編譯仿真測(cè)試,驗(yàn)證無(wú)誤后將其綜合成RTL 設(shè)計(jì),并使用RTL 協(xié)同仿真驗(yàn)證,生成綜合報(bào)告,最后導(dǎo)出為RTL IP 核。RGB 轉(zhuǎn)灰度操作IP 核模塊如圖4 所示。由于頂層傳遞參數(shù)為AXI _STREAM 類型的函數(shù),所以聲 明src 和dst 為AXI_STREAM 協(xié)議的接口。需要寄存器控制IP 核處理圖像的大小、位寬等參數(shù)信息以及開(kāi)始/停止等信號(hào),將這些控制寄存器聲明為SLAVE_AXI_LITE的協(xié)議接口,s_axi_control 來(lái)控制和配置IP 核。本IP 核的控制路徑和數(shù)據(jù)路徑即AXI_LITE 和AXI_STREAM 都使用和ZYNQ_HP接口相同的時(shí)鐘,ap_clk為上述路徑的共同時(shí)鐘。ap_rst_n為復(fù)位信號(hào),interrupt為中斷信號(hào)。
圖4 RGB轉(zhuǎn)灰度操作IP核模塊
2.1.2 形態(tài)學(xué)開(kāi)運(yùn)算IP核設(shè)計(jì)
形態(tài)學(xué)開(kāi)運(yùn)算是先進(jìn)行腐蝕操作,再進(jìn)行膨脹操作,使用3×3 矩陣的結(jié)構(gòu)內(nèi)核。腐蝕部分調(diào)用XILINX_VITIS_VISION 庫(kù)的erosion 函數(shù)加速核做處理,膨脹部分調(diào)用dilation 函數(shù)加速核做處理。輸入輸出及函數(shù)相關(guān)參數(shù)設(shè)置如表2 所示。
2.1.3 幀間差分IP核設(shè)計(jì)
幀間差分法中的幀間差分操作(即兩幀圖像相減并取絕對(duì)值)調(diào)用了absdiff 函數(shù)加速核做處理。幀間差分IP 核的相關(guān)參數(shù)設(shè)置如表3 所示。
2.1.4 圖像二值化IP核設(shè)計(jì)
幀間差分法中的圖像二值化操作調(diào)用了threshold 函數(shù)加速核做處理。相關(guān)參數(shù)設(shè)置如表4所示。
表4 圖像二值化IP核參數(shù)設(shè)置
2.2.1 數(shù)據(jù)傳輸通路配置
數(shù)據(jù)傳輸調(diào)用HDMI 模塊處理視頻輸入和輸出,輸入視頻數(shù)據(jù)通過(guò)VDMA 模塊緩存到DDR 存儲(chǔ)器,進(jìn)行圖像處理時(shí)使用VDMA 模塊將數(shù)據(jù)從DDR中取出。經(jīng)過(guò)處理的圖像數(shù)據(jù)同樣使用VDMA 模塊存入DDR 中。
2.2.2 圖像處理模塊配置
圖像處理模塊中各個(gè)IP 核按照處理流程進(jìn)行連接,一幀RGB 圖像轉(zhuǎn)成灰度圖像,經(jīng)過(guò)形態(tài)學(xué)開(kāi)運(yùn)算緩存到DDR 中,等待下一幀圖像經(jīng)過(guò)相同處理后一同送入幀間差分IP 核做幀差處理,并將結(jié)果與閾值進(jìn)行比較。硬件加速I(mǎi)P 核與DDR 存儲(chǔ)器之間調(diào)用VDMA 模塊傳輸數(shù)據(jù)。圖像處理模塊硬件連接示意圖如圖5 所示。
圖5 圖像處理模塊硬件連接示意圖
2.2.3 ZYNQ_PS IP配置
通路搭建需要對(duì)ZYNQ 芯片參數(shù)和系統(tǒng)I/O 口進(jìn)行配置。ZYNQ 芯片的相關(guān)參數(shù)配置操作有對(duì)PS端和PL 端的接口進(jìn)行配置;設(shè)置時(shí)鐘規(guī)范。該系統(tǒng)使用的HDMI、USB、SD 接口以及URAT 等I/O 接口均在ZYNQ 芯片的I/O 外設(shè)選項(xiàng)中進(jìn)行配置。
PYNQ 開(kāi)發(fā)平臺(tái)在處理系統(tǒng)PS 端使用Python 編程語(yǔ)言對(duì)硬件模塊進(jìn)行操作調(diào)用,Xilinx 官方提供的函數(shù)庫(kù)文件也讓開(kāi)發(fā)者很方便地使用Python 進(jìn)行硬件開(kāi)發(fā)。
在Jupyter Notebook 程序中首先對(duì)系統(tǒng)進(jìn)行初始化,導(dǎo)入設(shè)計(jì)所需庫(kù)函數(shù)(Numpy,cv2 等)和Overlay。需要例化各IP 核并設(shè)置其參數(shù):例化視頻的輸入輸出,例化圖像處理IP 核,設(shè)置視頻的分辨率,例化傳輸模塊IP 核,設(shè)置傳輸?shù)囊曨l數(shù)據(jù)類型格式。對(duì)于控制類的數(shù)據(jù)傳輸,使用MMIO 接口來(lái)配置IP 寄存器,并使用write 函數(shù)將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)地址。
例化定義完成后,控制視頻處理操作。將第一幀經(jīng)過(guò)灰度處理和形態(tài)學(xué)開(kāi)運(yùn)算處理的圖像數(shù)據(jù)采集出來(lái)送入幀間差分IP 核中,手動(dòng)設(shè)置10 ms 延遲后將第二幀經(jīng)過(guò)相同處理后的圖像數(shù)據(jù)采集后送入幀間差分IP 核中,讓二者進(jìn)行幀差運(yùn)算。使用cv2函數(shù)分割處理找到目標(biāo)邊框坐標(biāo)并疊加到原圖像上,結(jié)果存放到HDMI 輸出緩存區(qū)。
系統(tǒng)搭載在PYNQ-Z2 開(kāi)發(fā)板上,測(cè)試之前先對(duì)開(kāi)發(fā)板進(jìn)行相應(yīng)的環(huán)境配置,將設(shè)計(jì)的Overlay 燒寫(xiě)到開(kāi)發(fā)板中,并使用Python 語(yǔ)言進(jìn)行操控。實(shí)際檢測(cè)效果如圖6 所示。
圖6 實(shí)際檢測(cè)效果圖
由圖6 可見(jiàn),系統(tǒng)可同時(shí)對(duì)多個(gè)運(yùn)動(dòng)目標(biāo)進(jìn)行檢測(cè),且經(jīng)測(cè)試系統(tǒng)功耗為2.06 W。在相同平臺(tái)下將本系統(tǒng)與僅使用PS 端的無(wú)硬件加速系統(tǒng)進(jìn)行對(duì)比,在不同輸入視頻分辨率下的檢測(cè)速度如表5 所示。
表5 檢測(cè)速度對(duì)比
由表5 可見(jiàn),硬件加速后的運(yùn)動(dòng)目標(biāo)檢測(cè)系統(tǒng)的檢測(cè)速度在視頻分辨率為800×600 時(shí)提升了約2.8 倍,在視頻分辨率為1 280×720時(shí)提升了約2.4倍。
對(duì)系統(tǒng)在不同光照條件下的魯棒性進(jìn)行測(cè)試,檢測(cè)效果如圖7 所示??梢?jiàn),該系統(tǒng)能夠較好地適應(yīng)光照變化的影響。
圖7 不同光照條件下的檢測(cè)效果
基于軟硬件協(xié)同設(shè)計(jì)的基本思想在PYNQ-Z2平臺(tái)上實(shí)現(xiàn)了運(yùn)動(dòng)目標(biāo)檢測(cè)系統(tǒng)。該系統(tǒng)可以同時(shí)檢測(cè)多個(gè)運(yùn)動(dòng)目標(biāo),處理速度也基本滿足實(shí)時(shí)性要求,適合嵌入式移動(dòng)終端的應(yīng)用場(chǎng)景運(yùn)動(dòng)目標(biāo)檢測(cè)。