1. 程式人生 > >HOG(方向梯度直方圖)

HOG(方向梯度直方圖)

出自2005 Dalal CVPR用於行人檢測
思想:邊緣、紋理等特徵資訊可被梯度或邊緣的方向密度分佈很好地描述

方向梯度

1.計算影象梯度方向與幅值
對於影象畫素點(i,j):其對x方向的梯度Hx(i,j)及對y方向的梯度Hy(i,j)

Hx(i,j)=I(i+1,j)I(i,j)
Hy(i,j)=I(i,j)I(i,j+1)

可使用梯度運算元sobel,Laplacian對影象patch卷積計算。
從而可以求得梯度幅值M(x,y)與梯度方向θ(x,y):

M(x,y)=H2x+H2y
θ(x,y)=tan1HyHx

2. 計算bin值


梯度方向θ為[0,360°],將其劃分成n個bins。例如OpenCV中n=9,即將一個圓均分成9部分,每一部分割槽間對於bin值,如0≤θ<40對應bin=0,那麼當某個梯度方向在[0,40)範圍內時,對應著bin=0加1,而幅值是計算bin個數時的權重,接著上面例子,如果M=2,那麼bin=0加1*2=2。這樣就可以得到每個bin的計數。
3. 統計bin個數構成HOG描述符
該統計是在影象的視窗區域進行的,它使用了cellSize(胞元大小)、blockSize(塊大小)、blockStride(塊增量大小)、winSize(視窗大小)這些引數決定區域大小及滑動方式。在OpenCV構造HOGDescriptor時會用到。下面給出示意圖

1).winSize
winSize
視窗大小實質是檢測窗大小
2).blockSize
blockSize
3).cellSize
cellSize

而block劃分成cell時有兩種方法overlap和non-overlap,overlap方法是相鄰cell之間有重疊,non-overlap方法是相鄰cell之間沒有重疊,overlap方法好處是避免了一些重要的物體分成兩個patch,但計算量大。而non-overlap方法計算量小,與影象金字塔結合,速度更快。
所以OpenCV使用的是non-overlap。
對每個block內的所有cell統計bin的直方圖,並歸一化,得到塊HOG描述符。
直方圖
再在檢測窗中所有block串聯得到視窗的HOG特徵向量。

行人檢測HOG+SVM

總體思路:
1、提取正負樣本hog特徵
2、投入svm分類器訓練,得到model
3、由model生成檢測子
4、利用檢測子檢測負樣本,得到hardexample
5、提取hardexample的hog特徵並結合第一步中的特徵一起投入訓練,得到最終檢測子。

總結

優點:
1.HOG對影象的幾何和光照能夠保持很好的不變性。
2.可容許行人中細微的動作,所以HOG很適合用於行人檢測。
缺點:
特徵維度大,OpenCV中HOG描述符引數winSize(64,128),blockSize(16,16),blockStride(8,8),cellSize(8,8),nbins(9),這樣有3780(=9*(2*2)(7*15))維,其中檢測視窗有((128-16)/8+1) ((64-16)/8+1)=7*15個block,每個block有(16/8)*(16/8) =2*2個單元。這樣的話計算大很大,對於使用AdaBoost+HOG做行人檢測,訓練到後面每一級弱分類器個數達到了幾百個,這樣在訓練和檢測過程運算時間很大。針對這個情況,可以考慮減少bin的種類,剔除不太關聯的bin,保留重要的bin,從而降低HOG描述符維度。
注:
ICF(integral-channel-features)積分通道特徵是HOG的變形,其有10個bins,其中6個bin是HOG梯度方向,1個bin是梯度幅值,還有3個bins是LUV顏色空間的三個顏色通道。這樣對於顏色特徵效果比較明顯的物體檢測是個不錯的選擇。