車輛檢測技術看似神秘,本質上是通過數學公式,計算出圖片上指定區域內的像素特征,進而根據特征判斷物體所屬類別。物體檢測方法可以總結為特征提取與類別判定兩步,常用方法為支持向量機, Support Vector Machine(SVM)與方向梯度直方圖, Histograms of Oriented Gradients(HOG)相互配合。 本文將從以下幾個方面介紹這種常用的車輛檢測算法,揭開其神秘面紗,也讓讀者通過閱讀對機器學習過程有清晰的了解。 應用場景簡介 詳述HOG特征的計算方法 簡述SVM的工作過程 對比及總結 應用場景簡介 現實生活中車輛檢測技術應用廣泛,下面舉例說明車內裝置的應用。我們平時開的私家車里有時會有后置車載攝像頭,后方一定距離內有車將要超過該車時,此系統便會啟動,檢測出后方車輛以后發出警報,提示駕駛員減速駕駛(圖1)。另一個例子便是在自動駕駛領域的應用,通過對周邊車的定位,分析他車車速、距離等干擾因素,從而改變該車的行駛軌道。 ![]() 圖1:后視車載攝像頭檢測出車輛在圖像上用矩形框定位 車輛檢測系統還廣泛用于交通管制和路況監控(圖2),例如在隧道口安置此系統,則會統計每天各個時段的車流量,適當實施限行政策,減少交通事故的發生,并且提醒駕駛員,哪里是擁擠路段,哪里交通較為順暢,進而方便駕駛員選擇出行線路,起到疏散交通的目的。此外車流量的統計也會應用在機場或火車站的停車場,經過大數據分析出車位緊張的時段,以便工作人員合理調度資源。 附帶車輛檢測系統的信號燈可以通過與其他技術相結合,探測信號燈周圍車流量,工作人員通過大數據人工智能進行統計,通過計算設定紅綠燈交替變換的合理時間間隔。 ![]() 圖2:車輛檢測系統在路況監控場景下的應用 HOG 與 SVM相結合的算法 ( 40 −16 )/ 8 +1 =4 利用HOG與SVM相結合的行人檢測方法最初是由法國研究人員Dalal于2005年在CVPR上提出的,如今演變成以HOG+SVM為主要思路對各類物體進行檢測,包括車輛以及車道的定位。 步驟如下(圖3)所示: ![]() 圖3:SVM與HOG結合做車輛檢測的流程圖。 HOG特征計算 HOG是一個局部提取特征的算法,如果是包含復雜背景的大圖,就算提取再多的特征也不會達到檢測物體的目的。我們需要將圖片剪裁得到目標,經實驗證明,車輛作為目標物體占圖片比重必須大于80%才會得到好的效果。在剪裁好的局部圖像上將圖像分區(block),每個區域以細胞(cell)為單位提取特征。(圖像中的多個像素為一個細胞cell,多個cell組成區域塊block。) 我們以下(圖4)為例,解釋HOG特征的計算過程。 首先剪裁得到一張40*40的圖片(以像素為單位),之后我們要定義如下幾個變量: ![]() 圖4:block在剪裁圖片上的移動過程,由圖可知4個cell組成一個邊長為16個像素值block,圖片經剪裁得到長寬均為40個像素值。步長為1, 即每次移動一個像素值。 定義移動步長s, 例如:s=1。 定義cell大小,以像素為單位,例如:8*8。 定義block大小,例如:由2*2=4個cell組成。 定義bin的數量取值,根據需要設定數量,例如bin=9,每個bin用來存放計算出的直方圖的梯度方向累加值,其原理下文將具體講解。 對輸入的圖像及顏色進行標準化處理,減少光照或陰影對圖像中物體檢測準確性的干擾,具體做法是進行gemma顏色矯正后改為灰度圖(Gemma顏色矯正原理在此不做介紹)。 梯度大小的計算。以一個細胞部分區域為例做計算方法講解(圖5),下文為計算像素值為25的中間點的公式。 ![]() 圖5:一個細胞的部分區域大小及像素值 采用一個合理的卷積核方式的定義,實驗表明[-1,0,1]效果最好。卷積核 [-1,0,1] 可以理解為一個矩陣,用于計算每個像素點的梯度幅值方向,因此我們可以橫向(x軸正方向,向右)采用[-1,0,1] 的卷積核,縱向(y軸正方向,向上)采用〖[-1,0,1]〗^T,對于圖像區域中的每一個像素點做橫向,縱向的梯度分量計算,二者平方和開根號得到該點的梯度方向,因此計算公式如下: ![]() 所以像素為25的點水平方向的計算方法如下(圖6)所示: ![]() 圖6:像素值為25的中間點水平方向的像素值的計算過程 計算公式: ![]() 所以像素為25的點垂直方向計算方法如下(圖7)所示: ![]() 圖7:像素值為25的中間點水平方向的像素值的計算過程 計算公式: ![]() 梯度方向的計算采用以下公式: ![]() 對每個細胞(cell)中的所有像素點重復3-4的計算過程,再將數值相加,我們就得到了一個細胞(cell)內9個梯度方向上的梯度積分圖(圖8)。 求解圖像分區(block)的HOG特征,即:將所包含的細胞(cell)特征串聯到一起。 求解整個圖片的HOG特征,即:將所包含的圖像分區(block)特征串聯到一起。 特征維度的計算方法: 以上例子中block塊沿著x,y軸分別移動4步: (40-16)/8+1=4 每個block中包含4個cell: 2*2=4 特征維度的計算公式: ![]() 因此該圖例中通過計算得到特征維度是576。 將求得的梯度向量正則化。正則化的重要目的是為了防止過擬合,過擬合會造成在對訓練集的分類效果過于理想,但是測試集檢測率極其偏低,這顯然是我們不能接受的。跟一般的機器學習特征正則化的道理相同,例如得到的特征值在(0, 200)之間分布,我們要求防止200以內的數字對特征整體分布造成影響(模型在訓練中會為了迎合200而偏離整體趨勢,造成過擬合),因此要將特征分布規范化到一定區間,Dalal在論文中提到采用L2-norm得到的效果非常理想。(這里0,200指特征值所在的范圍) 將特征與標簽一起送往SVM中對分類器進行訓練。 直方圖的梯度方向及bin的取值 Dalal在論文中提到,“這一步驟的目的是為局部圖像區域提供一個指示函數量化梯度方向的同時,能夠保持對圖像中檢測對象外觀的弱敏感性”。 梯度大小要根據梯度方向插入到對應的bin中,方向分為兩種。 第一種無方向的方法(unsighed)適用于車輛或其他目標檢測,第二種有方向的方法(sighed)經實驗證明,不適用于車輛或其他目標檢測,這種方法在圖片放大、縮小、或經過旋轉后,像素點要恢復到原位置時會有應用,可以點擊參考文獻的第5個鏈接進行深入了解。 無方向。 (0 , π) 下面我們詳細了解無方向插值法. 本文將使用三張表格去做講解,每張表格中第一行為計算出的幅值,第二行為規定好的bin的方向取值,由180度除以定義的bin個數得來。第三行為bin的序號,從0開始. 根據實際需要分成若干個bin, 例如分成9個,即每個細胞內統計9個方向的梯度直方圖,每個bin的覆蓋方向為20度。將幅值(上文中計算的 G(x, y) )插入到bin中,最終bin中幅值的累加和即為直方圖的縱軸,橫軸則是bin的取值范圍,該例中取(0, 8) 的數字。 插入值的方法: 若某個像素點的幅值為80,方向為20度,則插入到(表格1)藍色區域的位置: ![]() (表格1) 若幅值為80,方向為10度,則分別插入到(表格2)藍色填充的兩個位置: ![]() (表格2) 若幅值為60,方向為165度,則分別插入到表格3藍色的兩個位置: (180度和0度在方向上等價,所以幅值按1:3分別插入兩個bin) ![]() (表格3) 上述(表格1)介紹的方向值恰好為bin對應值的插入方法,表格2介紹了方向值介于兩個bin值之間的插入方法,表格3介紹了方向值大于最大bin值的插入方法。根據三種方法的原理,以cell為單位計算,一個cell中所有像素點遍歷后的幅值累加,例如上面我們在0號bin的位置得到了兩個幅度值分別為40和15,因此我們到目前為止0號bin的直方圖累加到55。以此類推,計算每個cell 的1-8號bin幅度分別累加。最終我們會得到類似于下面(圖8)的直方圖,橫坐標X為梯度方向,縱坐標Y為梯度幅值: ![]() 圖8:梯度直方圖實例。橫軸為bin序號,縱軸為計算出的幅值。本圖縱軸對應的數字僅為舉例說明,例如,上圖三張表格中的bin1幅值加和得到80+40+0=120作為最終結果,則直方圖縱坐標得到120,繼續做計算,bin1 的值會繼續累加。 實驗證明目標檢測時用9個bin,單向插入會得到最佳效果。 有方向。(0, 2π) 方向前加了正負號,若也定義9個bin, 則每一個bin所分配到的角度范圍是(0, π/9 °) 例如,第二個bin,其正值插入到范圍在20-40(藍色的扇形區域),負值應插入到200-220的bin中(藍色的扇形區域)。(圖9) ![]() 圖9:有方向的插值方法,每一個扇形區域代表一個bin覆蓋角度范圍值。紅色為一號bin,覆蓋0-20度。順時針方向依次標號,綠色為終點,340-360度。藍色區域為相對應的兩個方向的bin. 簡述SVM的工作過程 SVM (Support Vector Machine) 全稱為支持向量機 ,在空間中將兩個類別通過一個超平面分開,二維空間可簡單理解成為了找到 y 而 y 滿足 ![]() y的值決定了樣本是正類還是負類。但是如何確定最優超平面,這里就引入了支持向量和最大 間隔。我們的目標是引入超平面,使得距離超平面最近的點之間有最大間隔(圖10)。 ![]() 圖10:紅色的線為超平面,落 在兩側的虛線上的點為支持向量,計算得到的𝑦值即1(正類)或-1(負類),藍色的點為正 樣本,綠色的點為負樣本,目的是找到虛線之間的距離最大的𝑤值,因為距離越大表示二分類 模型效果越好。 (來源: https://en.wikipedia.org/wiki/Support-vector_machine) 由于現實情況中的數據復雜度高,有時會根據需要引入核函數,作用是將低維度映射到高維度 中,通過找到㇐個最優超平面使線性不可分(圖11)的數據變得線性可分。 ![]() 圖11:紅色圈內的點與藍色的點二維空間中線性不可分,因此需要通過核函數將各個點映射 到高維度的空間坐標系中 SVM的計算量大,訓練耗時,因為對于每個點都要計算㇐遍與其他每㇐個點的相似度。因此S VM適用于數據量較小的二分類模型訓練,若為多個類別,則通常分別訓練多個模型。此外, 臺灣大學教授研發的兩款開源工具當下深受科學家的喜愛,㇐個是LibSVM,另㇐個是基于SV M開發、適用于大數據量的liblinear。 SVM對參數也極其敏感。libSVM或LibLinear訓練過程中要注意懲罰項C,和權重系數w. C 即懲罰項,越大,代表訓練過程分類效果越好,但是C過大會造成過擬合,即訓練樣本分類 正確率極其高但是測試準確率極其底。因為數據中不可避免的出現㇐些遠離集中群體的點,C 的大小表明了你是否愿意放棄這些離群點。越大表示不愿意放棄,因此模型會特別好的擬合訓 練集但非測試集, W即權重代表正負樣本的系數,如果想讓更多的目標被檢測出來,就將正樣本權重加大,但 是這樣誤檢率(FP)會特別高。反之,負樣本權重加大,會控制誤檢率(FP),當然目標檢測率 (TP)就會降低。 經過筆者親自實驗發現,㇐百萬個數據,1152維特征,在2個CPU,60G內存的 Windows10 操作系統下,開18個線程程訓練耗時20分鐘。因此作者建議大家使用liblinear庫訓練超大文 本,或增加計算機內存。 對比及總結 本文重點解析了車輛檢測的特征計算部分,以及簡要介紹SVM的分類策略。建議HOG特征用 于車輛檢測時,采用大于1000維度特征,9個bin的無方向插值法,特征分布不均勻務必采用 正則化處理;SVM可根據需要選擇核函數,必要時可以選用LibSVM庫訓練基于超大數據量的 模型。 SVM 的內核函數機制將低維度空間映射到高維度空間有效解決了線性不可分的難題,SVM的 計算復雜度由支持向量的個數決定,而幸運的是,最終決策函數由少量支持向量決定。SVM 同樣有其局限性,如果不使用LiBSVM/Liblinear開源庫,單純的SVM對大型數據的處理非常 困難,因為SVM在計算過程中涉及矩陣計算,其行數列數由樣本數量決定,大型樣本在計算 過程中消耗大量時間和空間。同理,實踐過程中,對于是否選擇HOG也要雙向考慮優缺點優 點。這里對其優缺點做總結以便讀者做參考: 優點:HOG是在局部的單元上做檢測,能較好地捕捉局部形狀信息,而忽略光照,色 彩等因素,例如車輛檢測中可以忽略車的色彩因素,從而降低所需要的特征維度,而 且因為對光照的若敏感度,即使車輛存在遮擋的部分也可以檢測出。 缺點:HOG不擅長處理遮擋問題,車輛方向改變也不易檢測;因為梯度的性質,HOG 對噪點相當敏感,因此在實際應用中,在 block 和 cell分割成局部區域單元之后,通常 有必要做㇐次高斯平滑去除噪點。對特征維度的確定(細胞,塊,步長的確定)要求 高,實際工作中需反復設計方案實驗得出最優解。 以上是本文的主要內容,希望給讀者㇐個清晰的思路。盡管SVM與HOG的結合計算量大,但 是成本較低,模型的訓練也基于CPU就可以進行,深受中小型產品研發企業的青睞,例如車 載攝像頭等小部件的研發與產出,在保證可用性的前提下價格方面會親民許多。 參考文獻 https://blog.csdn.net/u011285477/article/details/50974230 https://www.learnopencv.com/histogram-of-oriented-gradients/ https://www.stat.purdue.edu/~pan ... _HumanDetection.pdf https://www.csie.ntu.edu.tw/~cjlin/libsvm/ https://blog.csdn.net/u011448029/article/details/11709443 文章來源:貿澤電子 作者簡介:王晶是一名機器學習算法工程師,目前在汽車檢測領域工作。熱衷于技術文章的創作。她希望她的文章能引起讀者們對人工智能的興趣,以激勵更多的專業人員致力于這個領域,將AI與云技術和大數據結合起來,以使人們的生活更加安全便捷。 |