嵇達龍,張尤賽,王亞軍
(江蘇科技大學 電子信息學院,江蘇 鎮江 212003)
行人檢測在自動駕駛、智能監控等領域得到了許多的應用[1]。但由于行人檢測算法復雜度高、計算量大,現有的行人檢測算法多數采用PC機來完成,其靈活性、便攜性等限制了在戶外場景及汽車等可移動設備中的應用。
常見的行人檢測方法分為基于運動檢測和基于特征學習的方法[2]。基于特征學習的行人檢測方法,由于其檢測效果較好,得到了廣泛的關注。其中,基于HOG特征的AdaBoost算法是此類方法中的典型算法之一,該算法具有較高的檢測率和魯棒性[3,4]。
目前行人檢測片上系統主要采用ARM、FPGA等單一平臺的設計方案。ARM易于搭建操作系統,但是處理速度較慢;FPGA計算能力強,資源豐富,結構靈活,但是不易于搭建操作系統[5]。XILINX公司新提供了一種集成ARM和FPGA的ZYNQ-7000片上系統,芯片分為處理系統(processing system,PS)和可編程邏輯(programmable logic,PL)兩部分。該系統彌補了上述單一平臺的不足,充分結合了FPGA的并行特性以及ARM在操作系統上的優勢[6,7]。
據此,本文提出了一種基于ZYNQ的行人檢測系統的設計方案。為了提高HOG特征提取算法的效率,利用FPGA的并行特性,采用流水線結構替代傳統串行結構,可以在一個時鐘周期下同時完成多個步驟,從而大大提高算法的速度。在AdaBoost級聯分類器算法的設計中,采用并行結構的設計方式將其保存在FPGA的BRAM中,通過查找表的方式在單個時鐘周期內即可完成判斷。此外,采用軟硬件協同的設計方式,利用ARM編程的靈活性,由PS部分完成顯示控制、圖片讀取等操作[8]。
HOG是一種表征行人輪廓信息的特征描述子,采用局部方向梯度直方圖來構建特征集。HOG算法的核心思想是采用滑動窗口的機制,將圖像中的局部目標的形狀描述為梯度方向的密度分布。
圖1以80×60像素的圖像為例給出了HOG特征提取原理。圖1為80×60像素的圖像。首先將其分割成無重疊的cell單元,每個cell單元的大小為8×8像素,然后分別計算每個像素的梯度。依據像素梯度的方向劃分成8段,統計各cell單元的方向梯度直方圖。最后將cell單元以 3×3 大小拼接為相互重疊的block塊,組合在一起構成該圖像的HOG特征。

圖1 HOG特征提取原理
HOG特征提取過程可分為以下5步:
步驟1 計算RGB圖像的亮度值L
(1)
其中,R、G、B分別表示3個顏色通道對應的值。L的取值范圍為[0,255],可以用8bit無符號整型表示。
步驟2 根據亮度值,計算高度方向和寬度方向的梯度
Gh(h,w)=L(h+1,w)-L(h-1,w)
(2)
Gw(h,w)=L(h,w+1)-L(h,w-1)
(3)
其中,Gh(h,w)、Gw(h,w) 分別表示坐標 (h,w) 處對應高度方向和寬度方向的梯度,L(h,w) 表示坐標 (h,w) 處對應的亮度值。Gh(h,w)、Gw(h,w) 的范圍為[-255,255],需要用9bit有符號的整型表示。
步驟3 計算像素點 (h,w) 的梯度幅值G(h,w) 和角度θ(h,w)

(4)

(5)
為了統計cell單元的梯度方向直方圖,在本文中將梯度角度劃分成8段,如圖2所示。經計算易知,梯度幅值G(h,w) 需要9bit表示。

圖2 梯度方向分段
步驟4 依據步驟3劃分的區間,構建梯度方向直方圖h,如式(6)、式(7)所示
h=(h0,h1,h2,h3,h4,h5,h6,h7)
(6)

(7)
其中,hk的最大值為2885,因此hk需要12bit表示,h需要8×12bit來表示。
步驟5 由于局部光照的變化,使得梯度強度的變化范圍較大[9],因此將cell單元以3×3大小劃分成一個block塊,并對局部進行歸一化處理,進一步提高檢測效果。組合的block塊的特征向量Hv為
Hv=(h(i,j),h(i,j+1),h(i,j+2),
h(i+1,j),h(i+1,j+1),h(i+1,j+2),
h(i+2,j),h(i+2,j+1),h(i+2,j+2))
(8)
其中,h(i,j) 表示第i行、第j列cell單元統計直方圖的特征向量。
采用L1-norm對block塊進行歸一化,得到歸一化后的統計直方圖Hvnorm
(9)

AdaBoost是一種迭代算法,核心思想是通過對同一個訓練集用多個弱分類器去學習,每個弱分類器只返回0和1兩種結果,然后將這些弱分類器組合起來,構成一個強分類器。
假定訓練樣本集S包含Np正樣本和Nn負樣本 (N=Np+Nn),經過I次迭代得到K個弱分類器Cw={B,H},其中B={x,y} 表示block塊坐標,H為對應坐標的HOG值。
AdaBoost級聯分類器的具體訓練過程如下:
步驟1 初始化樣本權重

(10)
步驟2 針對正負樣本,分別統計block塊中各個cell單元HOG特征值的累加權重分布

(11)

(12)
其中,hcell和wcell分別表示block塊坐標中cell單元的行和列索引,i表示當前迭代的次數。根據式(13)計算差值,取差值最大時對應的block塊坐標B和HOG值H構成當前迭代輸出的弱分類器Ck={B,H}
D=D正樣本(B,H,hcell,wcell)-D負樣本(B,H,hcell,wcell)
(13)
步驟3 根據上一步得到的block塊坐標B以及對應的HOG值H,遍歷所有樣本更新權值,滿足該條件的樣本權重不變,提高其它樣本的權重

(14)
將更新后的權重歸一化
wi+1,n=w′i+1,n/Zi
(15)
(16)
其中,Zi為規范化因子。
步驟4 重復步驟2和步驟3過程I次,每次迭代產生一個弱分類器Cwi,最后剔除重復的弱分類器,構成一個強分類器Cs={Cw1,Cw2,…,Cwi}。
傳統的HOG算法采用串行結構提取特征,算法執行效率較低,在硬件實現中難以滿足實時性的要求,每個時鐘周期只能處理一個任務。本文采用FPGA的三級流水線結構設計方式對HOG特征提取算法進行加速,實現了在一個時鐘周期內,同時完成特征提取的梯度計算模塊、cell單元統計直方圖生成模塊、block單元統計直方圖生成模塊的工作,大大提高算法的速度。為了進一步提高算法的效率,設計中針對硬件結構特性采用分段近似的方法簡化算法的歸一化過程,通過移位運算替代復雜的除法運算,不僅提高了歸一化的速度,又可以降低硬件資源的消耗。基于軟件實現的AdaBoost分類算法在檢測過程中,需要串行遍歷每一個弱分類器進行匹配判斷,本文采用并行結構將弱分類保存在FPGA的BRAM中,采用查找表的方式替代遍歷方式,只需要一個時鐘周期就可以完成匹配判斷工作。優化后的算法在保證檢測率的同時,大大加速算法的執行速度。
本文算法在XILINX公司的ZYNQ-7000片上系統實現,該片上系統包含PL和PS兩部分。算法的設計流程圖如圖3所示,圖片讀取模塊和顯示控制模塊運算量小但流程控制復雜,適合在PS端實現;特征提取模塊計算量大、級聯分類器模塊易于并行化,適合在PL端實現;最后將檢測結果送至顯示屏。其中PS端和PL端采用AXI總線完成數據通信。

圖3 基于ZYNQ行人檢測算法的設計流程
2.1.1 梯度計算
本文采用流水線結構設計梯度計算模塊,該模塊包含一個處理區和一個緩存區,如圖4所示。處理區由8個8bit的移位寄存器構成,在時鐘上升沿的驅動下,新到的8bit亮度值L移入寄存器REG_3_1,其它寄存器的值依次移入下一級寄存器單元。本文待檢測圖片像素為80×60,因此緩存區需要2組57(=60-3) 個8bit寄存器單元完成緩存。該方法保證計算梯度所需的亮度值始終處于處理區的REG_3_2、REG_1_2、REG_2_1和REG_2_3。采用流水線結構,不需要一次性緩存4800(=80×60) 個像素值,只需要設計122個8bit寄存器緩存即可,大大節約了硬件資源。
2.1.2 梯度幅值和角度
由于生成直方圖時只需要確定對應的段號即可,而不需要知道具體的角度值,因此K Dohi等針對式(4)、式(5)提出了一種簡化方法[10],將梯度方向表示為θn(h,w)

圖4 梯度計算的流水線結構


(17)
其中,θn(h,w)∈{0,1,2,…,7}。 具體硬件電路實現如圖5所示,該方法避免了復雜的tan-1運算,只需要4次乘法運算、4次比較運算和1次減法運算。

圖5 梯度幅值和角度計算模塊
由于Gh和Gw為9bit有符號數,使用ZYNQ-7000提供的DSP48E模塊中的18×25的乘法器,完全滿足式(4)中平方運算的精度要求。最后調用CORDIC IP核對平方和進行開方,得到梯度幅值。
2.1.3 生成cell統計直方圖
由于每個像素點包含梯度幅值和梯度角度兩個數據,為了方便設計,將9bit梯度幅值和3bit梯度角度拼接為一個12位的數據作為本模塊的輸入。同樣采用流水線結構設計cell統計直方圖電路模塊,如圖6所示。處理區中包含了5×5個寄存器單元,對應一個cell單元,生成的cell單元統計直方圖h可用8×14bit表示。由于cell單元之間互相不重疊,因此與梯度計算模塊不同,該模塊不需要每個時鐘周期都進行計算。

圖6 cell統計直方圖流水線結構
2.1.4 生成block統計直方圖

圖7 block統計直方圖流水線結構
cell單元以3×3大小劃分成block塊,采用流水線結構進行設計,如圖7所示。上一級生成的cell單元統計直方圖h,依次流入下一級寄存器單元。文獻[10]提出了一種分段法近似法,對歸一化過程進行了簡化。該方法的主要思想是將式(9)中的歸一化分母近似為以2為底的指數冪和的形式,將除法運算轉化成移位運算,在一定誤差范圍內,大大提高了算法的速度。為了節約硬件資源,將歸一化后的直方圖二值化,二值化后每個block統計直方圖只需9×8bit即可表示。
分類器的設計過程分為離線學習和硬件實現兩個階段。在設計中,分類器的離線學習過程在MATLAB上完成。每次學習過程,分別統計正負樣本每個block塊單元HOG特征值的累加權重分布,選出正負樣本中HOG特征值的累積分布差值最大時對應的特征值H和塊坐標B作為當前迭代輸出的弱分類器。經過500次迭代訓練,并剔除重復的弱分類器后,得到了61個弱分類器Cw={B,H}。 將所有的弱分類器級聯構成一個強分類器Cs。 強分類器通過待檢測圖像與訓練好的弱分類器匹配成功的統計個數來判斷當前檢測窗口是否存在行人,當統計值低于某閾值時判斷為沒有行人,高于該閾值則判斷為有行人。為了確定該閾值,圖8給出了本設計采用的NICTA行人庫的ROC曲線圖,該曲線描述了閾值從10到50之間的系統誤檢率和召回率之間的關系,越接近圖表的左上方,系統的檢測效果更好[10],選取24作為分類器的閾值,此時檢測效果最好。

圖8 NICTA行人庫ROC曲線

分類器的設計模塊如圖9所示。系統上電后,PS端將待檢測的圖像數據通過AXI總線送至HOG特征提取電路。特征提取電路工作時,每一級流水線輸出待檢測圖像當前block塊的HOG特征值Hvbin,坐標生成電路輸出當前的塊坐標Bnorm,其中塊坐標Bnorm的數據格式與弱分類器塊坐標B的格式相同。根據當前電路輸出的塊坐標Bnorm,利用查找表的方式,一個時鐘周期就可以找出固化在FPGA的BRAM中具有相同坐標Bwi所對應的弱分類器的HOG特征值Hwi,而在PC端實現的算法找出該特征值,則需要在消耗多個時鐘周期下遍歷所有弱分類器才能找出。將找到的弱分類器的HOG特征值Hwi與特征提取電路模塊輸出的HOG特征值Hvbin匹配判斷,統計匹配成功的弱分類器的個數。統計結果通過AXI總線送回PS端,PS端根據統計結果和訓練階段得到的分類器的閾值關系,判斷當前待檢測圖像是否存在行人,并輸出相應的檢測結果。

圖9 分類器的設計
本實驗硬件平臺采用基于ZYNQ-7000的黑金ALINX7010開發板,其中ARM主頻667MHz,FPGA主頻250 MHz,開發環境使用VIVADO 2018.1和Xilinx SDK 2018.1,編程語言使用Verilog HDL和C;分類器的學習在MATLAB R2016a實現。
實驗使用NICTA行人數據庫[11],樣本數據大小80×60,隨機選取2000個正樣本和2000個負樣本構成訓練樣本集,另外選取3000個正樣本和3000個負樣本作為測試樣本集。圖10給出了正負樣本的示例,第一行為正樣本,第二行為負樣本。

圖10 正樣本和負樣本示例
在AdaBoost分類算法中,訓練樣本集經過500次迭代,得到了61個弱分類器。分類器的閾值為24。為了減低FPGA的資源消耗,在特征提取階段,對Block塊特征值進行二值化,二值化的閾值取0.03[10]。
實驗中,采用召回率、精度、誤檢率作為評價行人檢測系統檢測性能的技術指標。設TP、TN、FP、FN分別表示正樣本分類為正樣本,負樣本分類為負樣本,負樣本分類成正樣本和正樣本分類為負樣本的樣本數。則召回率TPR、精度P、誤檢率FPR可以分別表示為
(18)
(19)
(20)
召回率TPR、精度P和誤檢率FPR是衡量算法檢測性能的重要技術指標,TPR和P越高,FPR越小,檢測性能越好[4]。表1給出了本文算法在3種不同的實現方式下的各項性能指標的比較。

表1 不同實現方式下算法檢測率的比較
從表1可以看出,基于MATLAB和基于ZYNQ平臺ARM方式實現的檢測系統,各項性能指標相同。而采用基于FPGA+ARM實現方式,由于在設計過程中為了簡化計算,提高檢測速度,采用了近似計算的方式,召回率、精度和誤檢率均有所降低,但與前兩種實現方式相當,基本達到同等性能。
FPGA占用資源主要包括LUT、LUTRAM、FF、BRAM和DSP。表2給出了本文方法和基于PS實現方法在資源利用和時間消耗兩個性能指標的對比。

表2 資源和時間消耗對比
從表2可以看出:
(1)PS實現方法中,特征提取算法和分類器的設計都是通過軟件在ARM核中實現,所設計的系統主要硬件資源消耗在顯示模塊VDMA的IP核的實現上;
(2)本文采用的PS+PL方法,除了VDMA上的資源消耗,還有為了提高算法的速度,移植到FPGA上的特征提取模塊和分類器模塊所需的硬件資源消耗;
(3)本文算法占用的各項硬件資源相比要多于PS方法,但對于本設計中采用的ZYNQ-7000平臺,能夠完全滿足所需的資源要求;
(4)本文方法的運算速度相對于PS方法提高了44倍以上,每秒可檢測83張(80×60)以上,完全滿足實時檢測的要求。
本文針對戶外場景下行人檢測系統對實時性、便攜性和低功耗等性能要求,提出了一種基于ZYNQ的行人檢測算法。利用FPGA的特性,對HOG算法和AdaBoost分類器的結構設計和實現方法上進行優化,大大提高算法的效率;結合ARM部分(PS)完成顯示和控制工作,提高了系統設計的靈活性。在保持同等檢測性能的條件下,運算速度上得到了大幅提升,能夠很好地滿足實際需求。