計算機視覺基礎系列(python與opencv的操作與運用/tensorflow的基礎介紹)(二十三)---Hog特徵

特徵?特徵是某個像素經過某種運算得到的結果

 Hog特徵:

1.模塊的劃分   2.根據Hog特徵計算梯度和方向(模板特徵)  3.bin投影    4.每個模塊的Hog特徵

1.模塊的劃分

這裏有四個需要知道的知識點:image:圖像模塊;windows窗體(可以看作和圖像模塊大小一樣,實際上是要小一些的);block模塊,cell模塊(下面的藍色(image,windows窗體),紅色(block模塊)綠色(cell模塊))

每個模塊都有一個size,我們重點分析它們的size和它們之間的關係。 

image>windows>block>cell,都是包含關係,包含若干個模塊。在窗口(windows)滑動的時候會有一個win step步長,在block滑動的時候也有一個步長block step,在cell中會出現一個bin。

窗體windows是特徵計算最頂層的單元,比如說我們做車輛檢測的時候,一個窗口會覆蓋所有的車輛信息,即包含一個obj,這個obj包含了所有的圖像信息,這些圖像信息是通過計算得到的所有特徵,這所有的特徵加起來才能描述這個obj。

窗體的大小windows是任意大小的,一般來說,推薦的窗體大小是64x128,比如說車輛識別,行人識別等等。一般來說block的size必須比窗體要小,且窗體的size必須是block的大小的整數倍。一般來說是16x16。block step描述的是如何在窗體中進行移動,一般來說是8x8。計算block cout = ((64-16)/(8+1)*((128-16)/(8+1))=105block。cell的大小一般推薦爲8x8,那麼一個block中包含多少個cell呢?cell是和block不一樣的,不是滑動的,而是並列放置的,每個cell之間是不能重合的,不可滑動的,那麼一個block中可以包含4個cell,給它們一個標籤cell1,cell2,cell3,cell4。

2.Bin的含義

cell和bin是緊緊關聯的。

每個像素都有一個梯度,梯度有兩個屬性,第一個是大小,第二個是方向。當前的bin的大小和方向相關,0-360度劃分爲9塊,每一塊爲40度即爲9個bin,1個bin=40度。在cell中必須完整包含360度的信息,我們就需要包含9個bin就行了。所以一個cell中包含了9個bin。如上圖的圓形座標系所示。

3.Hog特徵的維度

harr特徵得到的是一個值,因爲是幾個矩陣相乘,而hog特徵得到的是一個向量,那麼這個向量的維度是什麼呢?

hog特徵是爲了進行分類來用的,所以它必須完全描述一個obj,必須完全包含obj的所有信息,而窗體又是包含了obj所有的信息,那麼這個hog特徵一定和窗體windows有關的,hog特徵的維度等於窗體中所有block的個數乘以每個block中cell的個數再乘以bin的個數。這裏設置的block爲105,一個block是含有4個cell的,每個cell對應着9個bin。

維度=105*4*9=3780

4.梯度問題

梯度有大小和方向。如何計算?

每一個像素都有梯度,所以必須要以像素爲單位計算,所有的這些像素構成了hog特徵,總共有多少個像素呢?需要windows窗體下的所有像素共同在一起構成hog特徵。窗體,block,cell這些都需要計算,那麼計算量就很大。在harr講解的時候,我們知道harr是利用模板來計算的,所以hog的梯度也可以利用模板來計算,這裏就有特徵模板了,和harr相似,有水平和豎直兩種模型。在水平方向上的模板是:[1  0  -1];[[1]  [0]  [-1]]。對於水平模板來說,就是拿左中右三個像素分別與模板相乘。

a = p1*1+p2*0+p3*(-1) = 相鄰像素之差

b=上下像素值之差 

這樣可以得到幅值爲f=根號下(a*a+b*b),方向爲angle=arctan(a/b)

5.bin的投影

bin的投影和梯度有關,在bin中,將一個cell(360度)劃分爲9個,每個bin爲40度,,其實這40度並不是連續的範圍,一般來說是20度是連續的,比如說bin1的範圍是0-20;180-200,就是一個180度對稱的過程。

如果一個像素點的幅值爲10,則它在bin1上,或者它爲190,也在bin1上,但是如果幅值爲25,則它的幅值可以重新計算。

6.整個窗體

整個窗體中包含的block和cell怎麼組合在一起,它們的複用原理

整個特徵爲3780維,整體的特徵描述的就是3780維的向量,我們通過其中一個維度的計算來推導其他3779維的計算。

這個3780維的向量來自哪裏?

來源於windows窗體,這個窗體包含了block和cell以及bin,所以每一個維度就是其中的一個bin,所以計算的這個維度,就是某個窗體下的某個block下的某個cell下的某個bin。

我們把某一個block分解,我們把block下的第一個cell即cell1(cell1,cell2,cell3,cell4)進行分解爲9份,分別爲bin1-bin9。

cell1有九個bin:bin1-bin9,同理cell2,cell3,cell4也一樣有九個bin

若某個像素(i,j)投影在了cell1下的bin1上,根據它的梯度,我們可以計算梯度的方向和它的幅值,它的幅值是f,它的方向是一個角度,這個角度投影在了cell1下的bin1上,那麼這個時候bin1的內容變成了f1,bin1中描述了這個像素的梯度,所以bin1=f1。

第二個像素(i+1,j)這些像素都位於cell1上的,如果也投影在了bin1上,這時bin1=f2。

同時有很多個像素點,全部遍歷完,遍歷完後,我們利用sum累加的形式,將所有的bin1累加在一起(f1+f2+f3...)=bin1。實際上像素點(i,j)不僅僅只影響bin1,其實還可以影響到其他的bin,我們在計算bin1的時候不僅僅只是(f1+f2+f3..)還需要加上當前像素在其他像素的投影。即權重的累加。

cell的複用:在一個block中,存在着4個cell,一般情況下是並列排序的,比如說是cell1,cell2,cell3,cell4。對於cell1來說對應着自己的bin1-bin9。其實在正在的計算的過程中,我們還會進行另外一個維度的劃分。例如cellx0,cellx2,cellx4

比如說在cellx0上,(i,j)計算出來的bin只對當前的這個cell起作用,雖然它會分解爲bin1和bin2,無論是bin1還是bin2,還是隻是對當前的cell起作用,cellx2,(i,j)計算出來的bin不只是對當前的cell1起作用,還對當前的cell3起作用,只通用在兩個cell上,而每一個cell,又由兩個bin進行分解,所以有(bin,bin+1,bin,bin+1)4個bin起作用,cellx4會分解爲8個bin。

這就是其中的一維的分解,進行原理解釋

 那麼,把這個維度,將它們和4個cell組合在一起,共同構成了9維(9個bin),這9維又和block中的4個cell組合在一起,共同構成了36維,然後再和105個block組合在一起共同構成3780維。

這個就是所有的特徵維度,那麼怎麼進行判決呢?

這就涉及到了SVM的相關知識,例如用SVM中的線性分類器來說,首先經過訓練,會得到3780維的向量,用hog特徵乘以3780維的向量,會得到一個具體的值,和最終的判決值進行比較。如果大於這個判決值就是目標,如果小於這個判決值就不是目標。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章