嵇達(dá)龍,張尤賽,王亞軍
(江蘇科技大學(xué) 電子信息學(xué)院,江蘇 鎮(zhèn)江 212003)
行人檢測(cè)在自動(dòng)駕駛、智能監(jiān)控等領(lǐng)域得到了許多的應(yīng)用[1]。但由于行人檢測(cè)算法復(fù)雜度高、計(jì)算量大,現(xiàn)有的行人檢測(cè)算法多數(shù)采用PC機(jī)來(lái)完成,其靈活性、便攜性等限制了在戶外場(chǎng)景及汽車等可移動(dòng)設(shè)備中的應(yīng)用。
常見(jiàn)的行人檢測(cè)方法分為基于運(yùn)動(dòng)檢測(cè)和基于特征學(xué)習(xí)的方法[2]?;谔卣鲗W(xué)習(xí)的行人檢測(cè)方法,由于其檢測(cè)效果較好,得到了廣泛的關(guān)注。其中,基于HOG特征的AdaBoost算法是此類方法中的典型算法之一,該算法具有較高的檢測(cè)率和魯棒性[3,4]。
目前行人檢測(cè)片上系統(tǒng)主要采用ARM、FPGA等單一平臺(tái)的設(shè)計(jì)方案。ARM易于搭建操作系統(tǒng),但是處理速度較慢;FPGA計(jì)算能力強(qiáng),資源豐富,結(jié)構(gòu)靈活,但是不易于搭建操作系統(tǒng)[5]。XILINX公司新提供了一種集成ARM和FPGA的ZYNQ-7000片上系統(tǒng),芯片分為處理系統(tǒng)(processing system,PS)和可編程邏輯(programmable logic,PL)兩部分。該系統(tǒng)彌補(bǔ)了上述單一平臺(tái)的不足,充分結(jié)合了FPGA的并行特性以及ARM在操作系統(tǒng)上的優(yōu)勢(shì)[6,7]。
據(jù)此,本文提出了一種基于ZYNQ的行人檢測(cè)系統(tǒng)的設(shè)計(jì)方案。為了提高HOG特征提取算法的效率,利用FPGA的并行特性,采用流水線結(jié)構(gòu)替代傳統(tǒng)串行結(jié)構(gòu),可以在一個(gè)時(shí)鐘周期下同時(shí)完成多個(gè)步驟,從而大大提高算法的速度。在AdaBoost級(jí)聯(lián)分類器算法的設(shè)計(jì)中,采用并行結(jié)構(gòu)的設(shè)計(jì)方式將其保存在FPGA的BRAM中,通過(guò)查找表的方式在單個(gè)時(shí)鐘周期內(nèi)即可完成判斷。此外,采用軟硬件協(xié)同的設(shè)計(jì)方式,利用ARM編程的靈活性,由PS部分完成顯示控制、圖片讀取等操作[8]。
HOG是一種表征行人輪廓信息的特征描述子,采用局部方向梯度直方圖來(lái)構(gòu)建特征集。HOG算法的核心思想是采用滑動(dòng)窗口的機(jī)制,將圖像中的局部目標(biāo)的形狀描述為梯度方向的密度分布。
圖1以80×60像素的圖像為例給出了HOG特征提取原理。圖1為80×60像素的圖像。首先將其分割成無(wú)重疊的cell單元,每個(gè)cell單元的大小為8×8像素,然后分別計(jì)算每個(gè)像素的梯度。依據(jù)像素梯度的方向劃分成8段,統(tǒng)計(jì)各cell單元的方向梯度直方圖。最后將cell單元以 3×3 大小拼接為相互重疊的block塊,組合在一起構(gòu)成該圖像的HOG特征。
圖1 HOG特征提取原理
HOG特征提取過(guò)程可分為以下5步:
步驟1 計(jì)算RGB圖像的亮度值L
(1)
其中,R、G、B分別表示3個(gè)顏色通道對(duì)應(yīng)的值。L的取值范圍為[0,255],可以用8bit無(wú)符號(hào)整型表示。
步驟2 根據(jù)亮度值,計(jì)算高度方向和寬度方向的梯度
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) 分別表示坐標(biāo) (h,w) 處對(duì)應(yīng)高度方向和寬度方向的梯度,L(h,w) 表示坐標(biāo) (h,w) 處對(duì)應(yīng)的亮度值。Gh(h,w)、Gw(h,w) 的范圍為[-255,255],需要用9bit有符號(hào)的整型表示。
步驟3 計(jì)算像素點(diǎn) (h,w) 的梯度幅值G(h,w) 和角度θ(h,w)
(4)
(5)
為了統(tǒng)計(jì)cell單元的梯度方向直方圖,在本文中將梯度角度劃分成8段,如圖2所示。經(jīng)計(jì)算易知,梯度幅值G(h,w) 需要9bit表示。
圖2 梯度方向分段
步驟4 依據(jù)步驟3劃分的區(qū)間,構(gòu)建梯度方向直方圖h,如式(6)、式(7)所示
h=(h0,h1,h2,h3,h4,h5,h6,h7)
(6)
(7)
其中,hk的最大值為2885,因此hk需要12bit表示,h需要8×12bit來(lái)表示。
步驟5 由于局部光照的變化,使得梯度強(qiáng)度的變化范圍較大[9],因此將cell單元以3×3大小劃分成一個(gè)block塊,并對(duì)局部進(jìn)行歸一化處理,進(jìn)一步提高檢測(cè)效果。組合的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單元統(tǒng)計(jì)直方圖的特征向量。
采用L1-norm對(duì)block塊進(jìn)行歸一化,得到歸一化后的統(tǒng)計(jì)直方圖Hvnorm
(9)
AdaBoost是一種迭代算法,核心思想是通過(guò)對(duì)同一個(gè)訓(xùn)練集用多個(gè)弱分類器去學(xué)習(xí),每個(gè)弱分類器只返回0和1兩種結(jié)果,然后將這些弱分類器組合起來(lái),構(gòu)成一個(gè)強(qiáng)分類器。
假定訓(xùn)練樣本集S包含Np正樣本和Nn負(fù)樣本 (N=Np+Nn),經(jīng)過(guò)I次迭代得到K個(gè)弱分類器Cw={B,H},其中B={x,y} 表示block塊坐標(biāo),H為對(duì)應(yīng)坐標(biāo)的HOG值。
AdaBoost級(jí)聯(lián)分類器的具體訓(xùn)練過(guò)程如下:
步驟1 初始化樣本權(quán)重
(10)
步驟2 針對(duì)正負(fù)樣本,分別統(tǒng)計(jì)block塊中各個(gè)cell單元HOG特征值的累加權(quán)重分布
(11)
(12)
其中,hcell和wcell分別表示block塊坐標(biāo)中cell單元的行和列索引,i表示當(dāng)前迭代的次數(shù)。根據(jù)式(13)計(jì)算差值,取差值最大時(shí)對(duì)應(yīng)的block塊坐標(biāo)B和HOG值H構(gòu)成當(dāng)前迭代輸出的弱分類器Ck={B,H}
D=D正樣本(B,H,hcell,wcell)-D負(fù)樣本(B,H,hcell,wcell)
(13)
步驟3 根據(jù)上一步得到的block塊坐標(biāo)B以及對(duì)應(yīng)的HOG值H,遍歷所有樣本更新權(quán)值,滿足該條件的樣本權(quán)重不變,提高其它樣本的權(quán)重
(14)
將更新后的權(quán)重歸一化
wi+1,n=w′i+1,n/Zi
(15)
(16)
其中,Zi為規(guī)范化因子。
步驟4 重復(fù)步驟2和步驟3過(guò)程I次,每次迭代產(chǎn)生一個(gè)弱分類器Cwi,最后剔除重復(fù)的弱分類器,構(gòu)成一個(gè)強(qiáng)分類器Cs={Cw1,Cw2,…,Cwi}。
傳統(tǒng)的HOG算法采用串行結(jié)構(gòu)提取特征,算法執(zhí)行效率較低,在硬件實(shí)現(xiàn)中難以滿足實(shí)時(shí)性的要求,每個(gè)時(shí)鐘周期只能處理一個(gè)任務(wù)。本文采用FPGA的三級(jí)流水線結(jié)構(gòu)設(shè)計(jì)方式對(duì)HOG特征提取算法進(jìn)行加速,實(shí)現(xiàn)了在一個(gè)時(shí)鐘周期內(nèi),同時(shí)完成特征提取的梯度計(jì)算模塊、cell單元統(tǒng)計(jì)直方圖生成模塊、block單元統(tǒng)計(jì)直方圖生成模塊的工作,大大提高算法的速度。為了進(jìn)一步提高算法的效率,設(shè)計(jì)中針對(duì)硬件結(jié)構(gòu)特性采用分段近似的方法簡(jiǎn)化算法的歸一化過(guò)程,通過(guò)移位運(yùn)算替代復(fù)雜的除法運(yùn)算,不僅提高了歸一化的速度,又可以降低硬件資源的消耗。基于軟件實(shí)現(xiàn)的AdaBoost分類算法在檢測(cè)過(guò)程中,需要串行遍歷每一個(gè)弱分類器進(jìn)行匹配判斷,本文采用并行結(jié)構(gòu)將弱分類保存在FPGA的BRAM中,采用查找表的方式替代遍歷方式,只需要一個(gè)時(shí)鐘周期就可以完成匹配判斷工作。優(yōu)化后的算法在保證檢測(cè)率的同時(shí),大大加速算法的執(zhí)行速度。
本文算法在XILINX公司的ZYNQ-7000片上系統(tǒng)實(shí)現(xiàn),該片上系統(tǒng)包含PL和PS兩部分。算法的設(shè)計(jì)流程圖如圖3所示,圖片讀取模塊和顯示控制模塊運(yùn)算量小但流程控制復(fù)雜,適合在PS端實(shí)現(xiàn);特征提取模塊計(jì)算量大、級(jí)聯(lián)分類器模塊易于并行化,適合在PL端實(shí)現(xiàn);最后將檢測(cè)結(jié)果送至顯示屏。其中PS端和PL端采用AXI總線完成數(shù)據(jù)通信。
圖3 基于ZYNQ行人檢測(cè)算法的設(shè)計(jì)流程
2.1.1 梯度計(jì)算
本文采用流水線結(jié)構(gòu)設(shè)計(jì)梯度計(jì)算模塊,該模塊包含一個(gè)處理區(qū)和一個(gè)緩存區(qū),如圖4所示。處理區(qū)由8個(gè)8bit的移位寄存器構(gòu)成,在時(shí)鐘上升沿的驅(qū)動(dòng)下,新到的8bit亮度值L移入寄存器REG_3_1,其它寄存器的值依次移入下一級(jí)寄存器單元。本文待檢測(cè)圖片像素為80×60,因此緩存區(qū)需要2組57(=60-3) 個(gè)8bit寄存器單元完成緩存。該方法保證計(jì)算梯度所需的亮度值始終處于處理區(qū)的REG_3_2、REG_1_2、REG_2_1和REG_2_3。采用流水線結(jié)構(gòu),不需要一次性緩存4800(=80×60) 個(gè)像素值,只需要設(shè)計(jì)122個(gè)8bit寄存器緩存即可,大大節(jié)約了硬件資源。
2.1.2 梯度幅值和角度
由于生成直方圖時(shí)只需要確定對(duì)應(yīng)的段號(hào)即可,而不需要知道具體的角度值,因此K Dohi等針對(duì)式(4)、式(5)提出了一種簡(jiǎn)化方法[10],將梯度方向表示為θn(h,w)
圖4 梯度計(jì)算的流水線結(jié)構(gòu)
(17)
其中,θn(h,w)∈{0,1,2,…,7}。 具體硬件電路實(shí)現(xiàn)如圖5所示,該方法避免了復(fù)雜的tan-1運(yùn)算,只需要4次乘法運(yùn)算、4次比較運(yùn)算和1次減法運(yùn)算。
圖5 梯度幅值和角度計(jì)算模塊
由于Gh和Gw為9bit有符號(hào)數(shù),使用ZYNQ-7000提供的DSP48E模塊中的18×25的乘法器,完全滿足式(4)中平方運(yùn)算的精度要求。最后調(diào)用CORDIC IP核對(duì)平方和進(jìn)行開(kāi)方,得到梯度幅值。
2.1.3 生成cell統(tǒng)計(jì)直方圖
由于每個(gè)像素點(diǎn)包含梯度幅值和梯度角度兩個(gè)數(shù)據(jù),為了方便設(shè)計(jì),將9bit梯度幅值和3bit梯度角度拼接為一個(gè)12位的數(shù)據(jù)作為本模塊的輸入。同樣采用流水線結(jié)構(gòu)設(shè)計(jì)cell統(tǒng)計(jì)直方圖電路模塊,如圖6所示。處理區(qū)中包含了5×5個(gè)寄存器單元,對(duì)應(yīng)一個(gè)cell單元,生成的cell單元統(tǒng)計(jì)直方圖h可用8×14bit表示。由于cell單元之間互相不重疊,因此與梯度計(jì)算模塊不同,該模塊不需要每個(gè)時(shí)鐘周期都進(jìn)行計(jì)算。
圖6 cell統(tǒng)計(jì)直方圖流水線結(jié)構(gòu)
2.1.4 生成block統(tǒng)計(jì)直方圖
圖7 block統(tǒng)計(jì)直方圖流水線結(jié)構(gòu)
cell單元以3×3大小劃分成block塊,采用流水線結(jié)構(gòu)進(jìn)行設(shè)計(jì),如圖7所示。上一級(jí)生成的cell單元統(tǒng)計(jì)直方圖h,依次流入下一級(jí)寄存器單元。文獻(xiàn)[10]提出了一種分段法近似法,對(duì)歸一化過(guò)程進(jìn)行了簡(jiǎn)化。該方法的主要思想是將式(9)中的歸一化分母近似為以2為底的指數(shù)冪和的形式,將除法運(yùn)算轉(zhuǎn)化成移位運(yùn)算,在一定誤差范圍內(nèi),大大提高了算法的速度。為了節(jié)約硬件資源,將歸一化后的直方圖二值化,二值化后每個(gè)block統(tǒng)計(jì)直方圖只需9×8bit即可表示。
分類器的設(shè)計(jì)過(guò)程分為離線學(xué)習(xí)和硬件實(shí)現(xiàn)兩個(gè)階段。在設(shè)計(jì)中,分類器的離線學(xué)習(xí)過(guò)程在MATLAB上完成。每次學(xué)習(xí)過(guò)程,分別統(tǒng)計(jì)正負(fù)樣本每個(gè)block塊單元HOG特征值的累加權(quán)重分布,選出正負(fù)樣本中HOG特征值的累積分布差值最大時(shí)對(duì)應(yīng)的特征值H和塊坐標(biāo)B作為當(dāng)前迭代輸出的弱分類器。經(jīng)過(guò)500次迭代訓(xùn)練,并剔除重復(fù)的弱分類器后,得到了61個(gè)弱分類器Cw={B,H}。 將所有的弱分類器級(jí)聯(lián)構(gòu)成一個(gè)強(qiáng)分類器Cs。 強(qiáng)分類器通過(guò)待檢測(cè)圖像與訓(xùn)練好的弱分類器匹配成功的統(tǒng)計(jì)個(gè)數(shù)來(lái)判斷當(dāng)前檢測(cè)窗口是否存在行人,當(dāng)統(tǒng)計(jì)值低于某閾值時(shí)判斷為沒(méi)有行人,高于該閾值則判斷為有行人。為了確定該閾值,圖8給出了本設(shè)計(jì)采用的NICTA行人庫(kù)的ROC曲線圖,該曲線描述了閾值從10到50之間的系統(tǒng)誤檢率和召回率之間的關(guān)系,越接近圖表的左上方,系統(tǒng)的檢測(cè)效果更好[10],選取24作為分類器的閾值,此時(shí)檢測(cè)效果最好。
圖8 NICTA行人庫(kù)ROC曲線
分類器的設(shè)計(jì)模塊如圖9所示。系統(tǒng)上電后,PS端將待檢測(cè)的圖像數(shù)據(jù)通過(guò)AXI總線送至HOG特征提取電路。特征提取電路工作時(shí),每一級(jí)流水線輸出待檢測(cè)圖像當(dāng)前block塊的HOG特征值Hvbin,坐標(biāo)生成電路輸出當(dāng)前的塊坐標(biāo)Bnorm,其中塊坐標(biāo)Bnorm的數(shù)據(jù)格式與弱分類器塊坐標(biāo)B的格式相同。根據(jù)當(dāng)前電路輸出的塊坐標(biāo)Bnorm,利用查找表的方式,一個(gè)時(shí)鐘周期就可以找出固化在FPGA的BRAM中具有相同坐標(biāo)Bwi所對(duì)應(yīng)的弱分類器的HOG特征值Hwi,而在PC端實(shí)現(xiàn)的算法找出該特征值,則需要在消耗多個(gè)時(shí)鐘周期下遍歷所有弱分類器才能找出。將找到的弱分類器的HOG特征值Hwi與特征提取電路模塊輸出的HOG特征值Hvbin匹配判斷,統(tǒng)計(jì)匹配成功的弱分類器的個(gè)數(shù)。統(tǒng)計(jì)結(jié)果通過(guò)AXI總線送回PS端,PS端根據(jù)統(tǒng)計(jì)結(jié)果和訓(xùn)練階段得到的分類器的閾值關(guān)系,判斷當(dāng)前待檢測(cè)圖像是否存在行人,并輸出相應(yīng)的檢測(cè)結(jié)果。
圖9 分類器的設(shè)計(jì)
本實(shí)驗(yàn)硬件平臺(tái)采用基于ZYNQ-7000的黑金ALINX7010開(kāi)發(fā)板,其中ARM主頻667MHz,F(xiàn)PGA主頻250 MHz,開(kāi)發(fā)環(huán)境使用VIVADO 2018.1和Xilinx SDK 2018.1,編程語(yǔ)言使用Verilog HDL和C;分類器的學(xué)習(xí)在MATLAB R2016a實(shí)現(xiàn)。
實(shí)驗(yàn)使用NICTA行人數(shù)據(jù)庫(kù)[11],樣本數(shù)據(jù)大小80×60,隨機(jī)選取2000個(gè)正樣本和2000個(gè)負(fù)樣本構(gòu)成訓(xùn)練樣本集,另外選取3000個(gè)正樣本和3000個(gè)負(fù)樣本作為測(cè)試樣本集。圖10給出了正負(fù)樣本的示例,第一行為正樣本,第二行為負(fù)樣本。
圖10 正樣本和負(fù)樣本示例
在AdaBoost分類算法中,訓(xùn)練樣本集經(jīng)過(guò)500次迭代,得到了61個(gè)弱分類器。分類器的閾值為24。為了減低FPGA的資源消耗,在特征提取階段,對(duì)Block塊特征值進(jìn)行二值化,二值化的閾值取0.03[10]。
實(shí)驗(yàn)中,采用召回率、精度、誤檢率作為評(píng)價(jià)行人檢測(cè)系統(tǒng)檢測(cè)性能的技術(shù)指標(biāo)。設(shè)TP、TN、FP、FN分別表示正樣本分類為正樣本,負(fù)樣本分類為負(fù)樣本,負(fù)樣本分類成正樣本和正樣本分類為負(fù)樣本的樣本數(shù)。則召回率TPR、精度P、誤檢率FPR可以分別表示為
(18)
(19)
(20)
召回率TPR、精度P和誤檢率FPR是衡量算法檢測(cè)性能的重要技術(shù)指標(biāo),TPR和P越高,F(xiàn)PR越小,檢測(cè)性能越好[4]。表1給出了本文算法在3種不同的實(shí)現(xiàn)方式下的各項(xiàng)性能指標(biāo)的比較。
表1 不同實(shí)現(xiàn)方式下算法檢測(cè)率的比較
從表1可以看出,基于MATLAB和基于ZYNQ平臺(tái)ARM方式實(shí)現(xiàn)的檢測(cè)系統(tǒng),各項(xiàng)性能指標(biāo)相同。而采用基于FPGA+ARM實(shí)現(xiàn)方式,由于在設(shè)計(jì)過(guò)程中為了簡(jiǎn)化計(jì)算,提高檢測(cè)速度,采用了近似計(jì)算的方式,召回率、精度和誤檢率均有所降低,但與前兩種實(shí)現(xiàn)方式相當(dāng),基本達(dá)到同等性能。
FPGA占用資源主要包括LUT、LUTRAM、FF、BRAM和DSP。表2給出了本文方法和基于PS實(shí)現(xiàn)方法在資源利用和時(shí)間消耗兩個(gè)性能指標(biāo)的對(duì)比。
表2 資源和時(shí)間消耗對(duì)比
從表2可以看出:
(1)PS實(shí)現(xiàn)方法中,特征提取算法和分類器的設(shè)計(jì)都是通過(guò)軟件在ARM核中實(shí)現(xiàn),所設(shè)計(jì)的系統(tǒng)主要硬件資源消耗在顯示模塊VDMA的IP核的實(shí)現(xiàn)上;
(2)本文采用的PS+PL方法,除了VDMA上的資源消耗,還有為了提高算法的速度,移植到FPGA上的特征提取模塊和分類器模塊所需的硬件資源消耗;
(3)本文算法占用的各項(xiàng)硬件資源相比要多于PS方法,但對(duì)于本設(shè)計(jì)中采用的ZYNQ-7000平臺(tái),能夠完全滿足所需的資源要求;
(4)本文方法的運(yùn)算速度相對(duì)于PS方法提高了44倍以上,每秒可檢測(cè)83張(80×60)以上,完全滿足實(shí)時(shí)檢測(cè)的要求。
本文針對(duì)戶外場(chǎng)景下行人檢測(cè)系統(tǒng)對(duì)實(shí)時(shí)性、便攜性和低功耗等性能要求,提出了一種基于ZYNQ的行人檢測(cè)算法。利用FPGA的特性,對(duì)HOG算法和AdaBoost分類器的結(jié)構(gòu)設(shè)計(jì)和實(shí)現(xiàn)方法上進(jìn)行優(yōu)化,大大提高算法的效率;結(jié)合ARM部分(PS)完成顯示和控制工作,提高了系統(tǒng)設(shè)計(jì)的靈活性。在保持同等檢測(cè)性能的條件下,運(yùn)算速度上得到了大幅提升,能夠很好地滿足實(shí)際需求。