任亮樸,徐美華,陳高攀
(1.上海大學微電子研究與開發(fā)中心,上海200072;2.上海大學機電工程與自動化學院,上海200072)
針對汽車安全駕駛的智能駕駛輔助系統(tǒng)是現(xiàn)在的研究熱點,它需要檢測路面的環(huán)境信息。對路面的環(huán)境檢測有行人檢測、車輛檢測、車道線檢測等,其中前方車輛檢測是非常重要組成部分。
基于計算機視覺的車輛檢測是現(xiàn)在的主流方法,在早期研究過程中,一般采用車輛的對稱性[1]、邊緣特征、顏色信息[2]等來檢測車輛。在最近幾年,車輛的特征轉變?yōu)楦悠者m和更具魯棒性的特征,如Haar特征[3-5]和 HOG(Histograms of Oriented Gradients)特征[6]或混合特征HOG+Haar、Haar+對稱性等,對這些提取的特征分類的方法有支持向量機[7-8](Support Vector Machine,SVM)、人工神經網絡[9-10](Artificial Neural Network,ANN)、AdaBoost[11-12]等。為了使車輛檢測算法能夠真正用于汽車駕駛上,我們還需設計對應的車輛檢測嵌入式系統(tǒng)。文獻[13]采用FPGA來實現(xiàn)前方車輛檢測,但是它采用的是直觀的特征,準確性較差。文獻[14-15]采用GPU硬件平臺取得了比較好的效果,但是也很難應用于汽車嵌入式處理系統(tǒng)。
由于Haar特征相比HOG特征硬件實現(xiàn)更加簡單,SVM相對于人工神經網絡有更好的數(shù)學理論支持且針對未訓練過的樣本預測能力更強。文中設計完成了基于Haar+SVM前方車輛檢測系統(tǒng)中的Haar特征提取的IP核設計,通過部分積分圖結構、流水線結構、乒乓操作、數(shù)據(jù)復用等方法提高Haar特征的計算速度;并且針對提取到的Haar特征,采用AdaBoost進行降維操作,再用SVM進行分類訓練,提升了分類能力。最終,采用Xilinx公司的XC7Z020作為核心處理芯片將整個算法在嵌入式系統(tǒng)實現(xiàn)后,檢測精度為97.2%,系統(tǒng)處理速度平均為每秒21.6幀??梢詽M足前方車輛檢測的要求。
基于單目視覺的前方車輛檢測算法主要分為兩個部分,訓練部分和識別部分,結構圖如圖1所示。訓練部分包括圖像預處理、Haar特征提取、AdaBoost降維、SVM分類器訓練四個部分,用于生成識別過程用到的Haar特征以及分類器。識別部分是對攝像頭實時傳回的圖像進行處理來檢測車輛。圖像預處理過程包括幀預處理、感興趣區(qū)域提取等操作,為后面的Haar特征提取做準備。
圖1 前方車輛檢測算法結構圖
針對前方車輛檢測算法中Haar特征提取,本文提出Haar特征提取IP核設計,進行硬件加速,提高算法的運算效率。
本文提出的Haar特征提取IP核結構圖如圖2所示,主要包含3個模塊,積分圖計算模塊,Haar特征模塊,特征值計算模塊。積分圖計算模塊負責積分圖的計算,Haar特征模塊存儲所需的特征模塊類型和坐標信息,特征值計算模塊是將前兩個模塊輸入的信息進行計算,得到對應特征模塊Haar特征的值。
圖2 特征提取IP模塊結構圖
2.1.1 積分圖計算
對于一個大小為24×24像素的圖像子窗口,基本的4個Haar特征的總數(shù)就超過了16萬個,這樣巨大數(shù)量的特征將直接導致訓練和檢測的速度減慢,為了快速計算在不同尺度下的特征,引入了積分圖的概念。積分圖的定義為:
圖3 積分圖及灰度快速計算
在圖(a)中,黑色處點的積分數(shù)值為所有綠色像點的灰度和加上黑色處本身的灰度值。圖(b)表示一個矩形塊的內像素點灰度和計算示意圖,其公式為:Y=A+D-B-C,Y表示方框內灰度和,A、B、C、D分別為各處像素點對應的積分圖的數(shù)值。圖(c)為一個Haar特征的計算示意圖,其公式為:Y=A-B-2C+2D+2E-2F-G+H。用這種方法計算Haar特征時不必每次都計算塊內灰度和,大大提高了計算速度。
2.1.2 部分積分圖架構
對于Haar特征的積分圖計算,首先對積分圖數(shù)據(jù)采用芯片(ASIC或FPGA)內部的RAM資源進行存儲,但是芯片內部的RAM資源極為有限,不能采用全積分圖的架構,而文獻[16]中的部分積分存儲結構所使用的存儲容量依然太大,仍無法滿足要求。針對文獻[16]的思路,可以將部分存儲進一步的“部分化”,即積分圖只存儲一個掃描滑窗的積分圖數(shù)據(jù)。這樣雖然需求的存儲資源減少,但是在提取完Haar特征時每次都需要重新計算下一窗口積分圖,使計算速度極為緩慢。為解決此問題,采用行列分開計算存儲架構,將行積分與列積分分開來進行計算,先進行一次行積分,再進行列積分,列積分的結果同行積分一樣存儲在RAM中,完成后就是最終的積分圖。
2.1.3 流水線結構設計
在特征值計算模塊,我們采用流水線式結構。積分模板的地址信息存儲在ROM塊中,當列積分完成后,ROM表開始生成Haar模板地址,RAM讀到地址后,產生用于計算的數(shù)據(jù)。在加法器計算Haar特征時,由于需要的數(shù)據(jù)更多,導致RAM需要對不同的寄存器賦值,增加了尋址的邏輯資源;另外計算一個Haar特征所需周期數(shù)目也更多。為解決此問題,設計中采用了寄存器隊列結構和雙端口ROM、雙端口RAM。使用了雙口的RAM和ROM,一個周期可以取兩個數(shù)據(jù)到寄存器隊列中,與原來相比,雖然消耗的邏輯資源增多,但是計算速度加倍。另外寄存器每個周期都向下移位一次,這樣RAM就只需要對第一個寄存器不斷賦值就可以了,減少了不必要的尋址邏輯資源。
2.1.4 乒乓結構設計
對此存儲計算結構的進一步分析會發(fā)現(xiàn),當數(shù)據(jù)流向列計算的RAM時,從列積分流向行積分的計算處于停止狀態(tài),而從第二個RAM流向下一級寄存器處于活躍狀態(tài)。為了提高IP接口的利用率,引入乒乓操作,在數(shù)據(jù)輸入端增加了一個數(shù)據(jù)選擇器,同時RAM變?yōu)樵瓉淼膬杀?。計算時,當?shù)谝粋€列計算RAM塊滿時,利用數(shù)據(jù)選擇器對第二個列RAM塊輸入數(shù)據(jù),當?shù)诙€RAM滿時又切換到第一個RAM。
2.1.5 數(shù)據(jù)復用與擴展設計
為了提高檢測的準確率,滑窗會有部分重疊,對于這種情況,可以采用數(shù)據(jù)復用的設計,在每次移動滑窗后,使用前一次計算積分圖計算所留下的數(shù)據(jù),這樣做的好處是可以使計算一次積分圖的數(shù)據(jù)減半,提高計算速度。其計算與存儲結構如圖4所示。
圖4 數(shù)據(jù)復用結構圖
在圖4中,當B1RAM塊(包含B11和B12兩部分)內積分圖數(shù)據(jù)使用完畢時,滑窗向右移動。若需要使用滑窗內原始的部分數(shù)據(jù),直觀的方案是通過移位將原始滑窗右半邊的數(shù)據(jù)移到左半邊,然后更新左半邊的數(shù)據(jù)。但是在RAM內不能像寄存器那樣移位,這里提出虛擬的B13結構,即新的滑窗由新的B12和B13組成,這里無需改動RAM塊B12的數(shù)據(jù),直接更新B13塊中的數(shù)據(jù)。當下一次更新窗口時只需更新B12塊中的數(shù)據(jù)。在使用特征模板進行特征計算時,需要判斷此次積分圖為B11+B12模式還是B12+B13模式,然后對模板地址進行變換,而這只需要一個標志位即可解決。
在基本的Haar特征提取IP基礎上,如果增加RAM的數(shù)量(A1-An,B1-Bn),就可實現(xiàn)需要更多的Haar特征應用情況下的擴展型IP設計。
針對設計的IP核,用Verilog寫出具體的數(shù)字電路,IP接口定義如表1所示。
表1 IP接口定義
對此IP編寫testbench,并用Synopsys的VCS進行仿真,這里選取的特征模板為圖3(c)所示,其中各個點坐標為 A(0,0)、B(0,10)、C(1,0)、D(1,10)、E(2,0)、F(2,10)、G(3,0)、H(3,10),輸入的像素一直為1,根據(jù)公式可得最終的結果應該為10。仿真結果如圖5所示,從圖中可以看出,data_in端口的數(shù)據(jù)一直為1;輸入到Rom表中的數(shù)據(jù)lut_in為:x800,0x80a,0x820,0x82a,0x840,0x84a,0xc60,0xc6a;在Haar_ready拉高時,data_out端輸出0x000a;Haar_ready每四個時鐘周期拉高一次且會一直持續(xù)下去。這些都符合我們的預期,其中l(wèi)ut_in的高兩位為標志位,后面十位為地址位,由此可知IP功能符合設計需求。
圖5 VCS仿真
AdaBoost算法是一種提升樹的方法,先對一個訓練集訓練出不同的弱分類器,然后把這些弱分類器集合起來構成一個強分類器。每一個弱分類器識別錯誤率小于1/2(即準確率僅比隨機猜測略高的學習算法),但是將這些弱分類器以一定的權重組合成一個強分類器就能使得分類能力提高。
支持向量機(Support Vector Machine,SVM)是一種在高維特征空間使用線性函數(shù)假設空間、有監(jiān)督的學習方法,廣泛應用于統(tǒng)計分類和回歸分析。SVM的訓練過程是找到一個超平面,或在高或無限維空間,這個超平面可以根據(jù)輸入的Haar特征將圖像分為兩類:車輛與非車輛,超平面的函數(shù)為:
其中x表示輸入的Haar特征值向量,ωT和b為分類器參數(shù)。SVM分類的過程就是代入x求值,這樣就可以把車輛和非車輛圖像分開來。
文中采用AdaBoost對訓練集中樣本特征進行降維,用SVM對經過降維的前方車輛檢測樣本庫進行分類訓練,這里通過Haar特征將二者有機結合起來。如圖6所示是AdaBoost訓練和測試結果,可以看到訓練結果為500輪時,測試錯誤率區(qū)域穩(wěn)定,平均錯誤為3.9%。采用降維后的特征信息作為SVM分類器訓練的樣本庫,在4 764個樣本中隨機選擇3 334個樣本作為訓練集,1 430個樣本作為測試集。采用libsvm對樣本進行訓練,相對于純粹采用AdaBoost的方法對Haar特征進行訓練,采用AdaBoost+SVM的方法將正確率從96.10%提高到了97.26%。
圖6 AdaBoost訓練和測試結果
根據(jù)前面提到的車輛檢測算法,將軟件和硬件在 Xilinx ZC702 SOC(System On a Chip)上實現(xiàn)。該芯片是采用FPGA+CPU的嵌入式SOC。將MATLAB代碼移植到嵌入式Linux操作系統(tǒng)中,并將Haar特征提取的IP核移植在可編程邏輯上。
前方車輛檢測系統(tǒng)硬件系統(tǒng)由核心板、主板外設3個部分組成,系統(tǒng)圖如圖7所示。
圖7 前方車輛檢測系統(tǒng)硬件系統(tǒng)
軟件的開發(fā)環(huán)境為嵌入式Linux,系統(tǒng)的開發(fā)語言選擇的是Python,由于Python的執(zhí)行效率要低于C或者C++,為彌補此不足,使用OpenCV庫來進行開發(fā)。因為OpenCV庫的核心為C++,只是接口部分用Python來連接,所以采用Python+OpenCV的方案使得算法最終的執(zhí)行效率并沒有明顯的降低,但開發(fā)速度提高。
圖8 實物圖與測試結果
整個前方車輛檢測系統(tǒng)設計實現(xiàn)后,我們對一個視頻進行前方車輛檢測,圖8是系統(tǒng)測試平臺的實物圖與前方車輛檢測的部分截圖,從圖中我們可以看出,前方的車輛基本都可以檢測出來。據(jù)統(tǒng)計,系統(tǒng)的檢測精度為97.2%,系統(tǒng)處理速度平均為21.6幀每秒??梢詽M足前方車輛檢測的要求。
文中提出基于Haar+SVM前方車輛檢測系統(tǒng)中的Haar特征提取的IP核設計,通過部分積分圖結構、流水線結構、乒乓操作、數(shù)據(jù)復用等方法提高Haar特征的計算速度;并且針對提取到的Haar特征,我們采用AdaBoost進行降維操作,再用SVM進行分類訓練,提升了分類能力。將整個算法在嵌入式系統(tǒng)實現(xiàn)后,實驗結果表明,檢測精度為97.2%,系統(tǒng)處理速度平均為每秒21.6幀,驗證了所設計的算法和系統(tǒng)的正確性和有效性。