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