HOG特徵

來自專欄計算機視覺論文閱讀筆記5 人贊了文章

HOG全稱histogram of oriented gradients.如果翻譯成中文就是方向梯度直方圖。它可以用來表示圖像的物體特徵,因此能夠檢測出這類物體。

文章的內容將按照兩部分進行,如果只對HOG的詳細計算過程感興趣可以直接跳到第二部分進行閱讀。

  1. 論文筆記
  2. HOG實例講解

一.論文筆記

論文鏈接:Histogram of oriented gradients for human detection

這是一篇2005年CVPR論文,使用HOG+SVM做行人檢測。

不過我都這篇文章的時候感覺不是很懂,對裡面的細節都不是很清楚,可能是缺乏圖像處理這一塊的背景知識導致的。所以我只寫一下文章的大概內容以及我的看法吧。

1.文章內容

這篇文章的主要貢獻是提出了一個有效的提取行人特徵方法,使用線性SVM模型作為分類器,對比了目前主流的特徵描述子方法,做了大量的實驗得出合適的系統參數,以及公佈了一個更大的行人檢測資料庫。

這是HOG+SVM的工作流程。首先對輸入的圖片進行預處理,然後計算像素點的梯度值,然後形成梯度直方圖,然後對blocks進行normalize,最後收集到HOG feature(其實是一行高維的vector)放到SVM裏進行監督學習,從而實現行人的檢測。

作者使用了兩個數據集來測試,一個是MIT pedestrian database,還有一個是自己提出的測試集」INRIA「。其中INRIA數據集擁有更多更複雜的數據圖像。

以SVM分類器作為基礎,作者做了大量實驗來對比不同特徵提取方法,包括廣義Haar wavelets/PCA-SIFT/Shape Contexts。實驗表明,HOG具有很大的優越性。

作者做了大量的實驗來選擇系統參數,得到最好的系統性能表現。其中包括對圖像進行Gamma normalization/gradient的計算方法/cell大小/block大小/bin大小/不同的SVM等作了對比實驗。

2.我的感想

我很佩服作者提出的HOG這個想法。作者會想到對於行人檢測來說,圖像梯度是一個很重要的信息。利用圖像梯度,就可以只關注邊角信息,以此勾勒出的人的模樣還是可以分辨出來。

同時,作者的實驗也做得很充分,僅僅八頁就重點講解了特徵提出的方法,而對SVM則粗描淡寫。但是我還是看不懂HOG的提取計算過程,不過我通過查找其他資料,知道了HOG的細節。

二. HOG實例講解(以下所有的系統參數都是按照上述論文實驗得出的最佳結果確定的)

  1. 圖像預處理

包括伽馬校正和灰度化。這是可選的步驟,因為實驗證明做不做影響不大。伽馬校正是減少光度對實驗的影響。灰度化是將彩色圖片變成灰度圖。其實彩色圖片也可以直接處理。不過是分別對三通道的顏色值進行梯度計算,最後選擇梯度最大的那個。為簡單起見,假設輸入為灰度圖,同時大小是64*128(這個大小是上面論文的大小,也可以自己確定不同的大小,但是實驗效果就不能得到保證)。

2.計算每一個像素點的梯度值,得到梯度圖(規模和原圖大小一樣)

對於像素點A,要計算水平梯度和豎直梯度,如上圖,水平梯度 g_x =30-20=10,豎直梯度 g_y =64-32=32.

那麼總的梯度強度值g和梯度方向 	heta 將按照以下公式計算:

g=sqrt{g_x^2+g_y^2}

	heta=arctan{frac{g_x}{g_y}}

梯度方向將會取絕對值,因此梯度方向的範圍是0-180度。取絕對值的原因是這樣效果更好。

3.計算梯度直方圖

按照第二步的計算,每一個像素點都會有兩個值:梯度強度/梯度方向。

現在就計算梯度直方圖,這是一個關鍵步驟也是HOG能夠work的原因。

梯度直方圖是在一個8*8的cell裡面計算的。那麼在8*8的cell裡面就會有8*8*2=128個值,2是包括了梯度強度和梯度方向。通過統計形成梯度直方圖,128個值將會變成9個值,大大降低了計算量,同時又對光照等環境變化更加地robust。

首先,我將0-180度分成9個bins,分別是0,20,40...160。然後統計每一個像素點所在的bin。請看下圖:

左上圖是8*8的梯度方向值,右上圖是8*8的梯度強度值,下圖是9個bins。

先看兩個藍色圈圈。因為藍圈的方向是80度,大小是2,所以該點就投給80這個bin;

再看兩個紅色圈圈。因為紅色圈圈的方向是10,大小是4,因為10距離0點為10,距離20點為也為10,那麼有一半的大小是投給0這個bin,還有一半的大小(即是2)投給20這個bin。

那麼統計完64個點的投票數以後,每個bin就會得到一個數值,可以得到一個直方圖,在計算機裡面就是一個大小為9的數組。

從上圖可以看到,更多的點的梯度方向是傾向於0度和160度,也就是說這些點的梯度方向是向上或者向下,表明圖像這個位置存在比較明顯的橫向邊緣。因此HOG是對邊角敏感的,由於這樣的統計方法,也是對部分像素值變化不敏感的,所以能夠適應不同的環境。

4. 對16*16大小的block歸一化

歸一化的目的是降低光照的影響。

歸一化的方法是向量的每一個值除以向量的模長。

比如對於一個(128,64,32)的三維向量來說,模長是 sqrt{128^2+64^2+32^2}=146.64

那麼歸一化後的向量變成了(0.87,0.43,0.22)

那麼16*16大小的block是怎麼來的?

請看下圖:

綠色方塊是8*8大小的cell,藍色方塊就是由4個cell組成的block。作者提出要對block進行normalize。那麼由於一個cell就會有大小為9的vector,四個cell就有36大小的vector。對block進行normalize就是對這大小為36的vector進行歸一化。

而每一個block將按照上圖籃框移動的方式進行迭代截取。

5.得到HOG特徵向量

每一個16*16大小的block將會得到36大小的vector。那麼對於一個64*128大小的圖像,按照上圖的方式提取block,將會有7個水平位置和15個豎直位可以取得,所以一共有7*15=105個block,所以我們整合所有block的vector,形成一個大的一維vector的大小將會是36*105=3780。

得到HOG特徵向量,就可以用來可視化和分類了。對於這麼大的HOG特徵,SVM就排上用場了。

文章就寫到這裡,謝謝閱讀。

reference:

1.histogram-of-oriented-gradients

2.youtube.com/watch?


推薦閱讀:
查看原文 >>
相關文章