HOG原理学习笔记
文章目錄
- 特征描述子( Feature Descriptor)
- 如何計算梯度方向直方圖
- 步驟一、預處理
- 步驟二、計算梯度圖
- 步驟三、在8×8的cell中計算梯度直方圖
- 步驟四、16×16 Block標準化
- 步驟五、計算HOG特征向量
來源:learnopencv.com
參考博客:對應翻譯
特征描述子( Feature Descriptor)
特征描述子就是描述圖像特征的一種方式,是觀察圖像的一種視角,這種視角能夠提取出我們想要關注的特征并剔除掉多余的特征來簡化圖像信息。特征描述子需要盡可能的提取出圖像中的有用信息。通常,特征描述子將一張大小為width×height×3 (通道數)的圖片化成一個長度為n的特征向量/數組。以HOG特征為例,輸入圖像的大小是64×128×3,輸出是一個長度為3780的特征向量。它對圖像識別和目標檢測這樣的任務很有用。將由這些算法生成的特征向量作為支持向量機等分類算法的輸入可以得到不錯的結果。
對于不同的分類任務,不同的特征對我們的分類任務是有用的,因此選擇的特征描述子也不同,如:在一張圖片中檢測紐扣,由于紐扣通常是圓形的,所以通過對圖片進行邊緣檢測來判斷是否為紐扣是可行的。在這個例子中,邊緣信息就是有用的特征,而圖像的顏色信息就是冗余(無用)的特征。同時一個好的特征也要具有區分能力(如區分紐扣與車輪)。
HOG特征描述子選擇梯度方向分布作為特征,其原因在于圖像的梯度包含了目標的邊緣信息。一張圖像的梯度(x、y方向的導數)在邊緣和拐點處這類強度變化劇烈的區域幅值變化很大。而目標的邊緣和拐點往往包含更多的目標信息,是我們需要關注的重點區域。
如何計算梯度方向直方圖
步驟一、預處理
在原始圖像中裁減出一塊圖片塊(patch)并修改成64*128大小,圖片塊作為我們的ROI區域,我們的目的就是對該區域的圖片信息利用特征描述子進行描述,提取出我們感興趣的特征。
步驟二、計算梯度圖
首先要計算水平和垂直方向上的梯度,此步驟可以通過下圖所示的核對原圖像進行濾波得到。
使用openCV中的sobel算子也能達到同樣的效果,代碼如下:
// C++ gradient calculation. // Read image Mat img = imread("bolt.png"); img.convertTo(img, CV_32F, 1/255.0);//轉化為32位浮點數,順便完成了歸一化操作 // Calculate gradients gx, gy Mat gx, gy; Sobel(img, gx, CV_32F, 1, 0, 1);// 只對x方向求一階導數,且kernel大小為1 Sobel(img, gy, CV_32F, 0, 1, 1); //只對y方向求一階導數關于sobel算子的簡單描述參考CSDN上的兩篇博客:sobel算子原理與實現、Sobel邊緣檢測算法
接下來需要計算梯度的幅度值和梯度方向(二者共同組成了該點處的梯度段),計算公式如下:
g = g x 2 + g y 2 θ = arctan ? g y g x g = \sqrt{g^2_x+g^2_y}\\ \theta=\arctan\frac{g_y}{g_x} g=gx2?+gy2??θ=arctangx?gy??
在opencv中實現代碼如下:
cartToPolar函數返回mag代表梯度幅值,angle代表梯度相角(0~ π \pi π)。具體函數信息參考文檔。
梯度幅值代表了該點處梯度變化的大小,梯度角代表了梯度變化最快的方向。
下圖展示了對x方向和y方向梯度操作分別提取出的x方向邊緣信息和y方向邊緣信息,以及二者結合得到的總體邊緣信息。
對于本例子中的圖像,我們進行求梯度操作后的結果如下:
? 左:X方向梯度幅值圖;中:Y方向梯度幅值圖;右:梯度幅值圖
基于梯度的HOG描述子忽略了冗余的信息(如不變的背景信息),突出了輪廓信息,因為僅僅通過輪廓信息我們就能進行目標檢測。
原始圖像中的每一個像素都得到了該像素點處的梯度賦值和梯度角(梯度方向)信息。而對于三通道彩色圖像,需要分別計算3個通道的梯度(如上圖所示)。而該像素點的幅值是這3個通道梯度幅值的最大值,方向是最大梯度幅值對應的角度。
步驟三、在8×8的cell中計算梯度直方圖
cell操作的本質是(用梯度方向直方圖)統計本cell中梯度在各個方向上的強度,該強度信息(向量)用于描述當前cell中的圖像信息。
在本步驟中,圖像將會被分割為8*8單位的很多cell,在這些cell中我們將計算梯度方向直方圖。下圖就是將我們的目標區域(patch)切分成數個cell的例子。
那么我們首先要了解一下為什么要將圖片切分成好多個8*8像素形式的cell。這個操作的本質就是對圖片信息進行降維。
通過步驟二中的梯度計算,我們得到了每一個像素點的梯度大小以及梯度方向信息,雖然通過這些信息我們能獲得目標的全部邊緣信息,但是存在兩點問題:
- 維數太高:對于本例所示的ROI區域,其尺寸為 64 × 128 64\times128 64×128,其中每一個像素攜帶該點處梯度大小與方向兩個信息,所以對于一個目標區域,我們會得到 64 × 128 × 2 = 16284 64\times128\times2=16284 64×128×2=16284維的向量(我們將所有像素信息依次排列成一個向量),向量維數太高,運算成本太昂貴。
- 某些像素點攜帶的信息是錯誤的:圖像中存在噪點,對于這些噪點我們需要剔除。
綜合上述兩點我們希望能找到一種方式,其具有下述特征:
綜上,我們創造了一種新的圖像基本單位cell,一個cell對應原圖像的一個8*8像素區,一個cell對應64個像素信息,這樣可以起到很好的降維作用。由pixel向cell轉換的方式采用基于統計學的梯度(幅值)-(梯度)方向直方圖,這樣對一個 8 × 8 8\times8 8×8區域的統計操作可以降低算法對噪點的敏感度。而選擇一個 8 × 8 8\times8 8×8區域作為一個cell的原因在于,HOG描述子最初被用于行人檢測,8×8的cell在一張64×128的行人圖片塊中的足以捕捉感興趣的特征(如人臉、頭頂等),當然cell尺寸的選擇可以根據目標的不同而改變。
在規定完成cell的尺寸之后,我們詳細講解一下用一個cell表征64個pixel信息的方法——梯度方向直方圖。
首先,我們觀察一下在劃分cell之后,每個cell中包含的梯度幅度/相角信息,以運動員頭部的cell為例:
中間紅色框選的區域十分清晰的描述了一個cell中每個元素同時攜帶的梯度幅值與方向信息——箭頭的指向表示了梯度的方向而箭頭的長度表示了梯度的大小。箭頭的長短表明了該點處圖像強度的變化大小,而箭頭的方向指向了該點處強度變化最大的方向。
在右上角的梯度幅值圖中我們可以發現位于目標邊緣的像素梯度值更大,而背景區以及目標內部的梯度值更小。而對于右下角的梯度相角圖,我們發現其值域位于[0~180]而非中間圖的 [0~360],這種表述方式將方向相反的兩個梯度(角)方向表述為同一個梯度方向,這種方式叫做“無符號梯度”,根據經驗,無符號梯度表示法比有符號梯度效果更好。一些HOG的實現代碼會允許你選擇是否使用有符號梯度。
在直觀的觀察完每個cell中的像素信息之后,我們根據上圖右側梯度幅值圖和梯度方向圖創建統計直方圖,而創建這個直方圖的目的在于:我們希望統計出在一個cell中梯度在某幾個方向上的分布累計值,用梯度在這幾個方向上的累計分布情況來替代64個像素攜帶的梯度值-梯度角信息,從而完成圖像基本單位從pixel——>cell的轉換。
我們以梯度方向角為x軸,并且取值為離散的0°、20°、40°、… 160°共計9個方向值。梯度累計值為y軸,而梯度累計值采用加權累加的方法進行,過程如下:
對于藍圈中的像素,其梯度方向為80,其梯度值為2,所以在梯度分布直方圖的80坐標處加上2即可。對于紅圈中的像素,其梯度方向為10度,位于0-20正中間,所以該像素所對應的梯度以1:1加權,一分為二分配到0與20的直方圖橫坐標上。
下圖是一個更具普遍性的例子:
上圖所示的像素梯度角為 16 5 ° 165^{\circ} 165°,梯度值為 85 85 85。對于大于160度的梯度角,他們實際是位于0度和160度之間,我們將該像素點處的梯度信息按照如下形式加權分配到0刻度與160刻度上:
for?0?:???? 165 ? 160 20 × 85 = 21.25 for?160?:???? 180 ? 165 20 × 85 = 63.75 \text{for 0 : }\ \ \ \frac{165-160}{20}\times85=21.25\\ \text{for 160 : }\ \ \ \frac{180-165}{20}\times85=63.75\\ for?0?:????20165?160?×85=21.25for?160?:????20180?165?×85=63.75
最終,將8×8的cell中所有像素處的梯度按照方向將梯度大小累加到9個bin以創建最后的梯度直方圖。該直方圖概括了該cell中梯度值在9個方向上的統計特征(分布特性)。
上圖中的cell對應的梯度直方圖如下
觀察這個直方圖我們發現,這個cell中的梯度方向在0或180度附近分布的權重最大,這從另外一個角度說明了在這個cell中大部分梯度方向要么朝上要么朝下。到此,我們可以用一個包含九個元素的向量來描述一個cell中的梯度分布情況。
步驟四、16×16 Block標準化
直方圖標準化就是對在更大尺度上對直方圖向量信息標準化一下,目的是消除光照的影響。
光照對圖片的影響可分為兩種:一種是亮度變化,體現為像素強度值的加性偏移;另一種則是對比度變化,體現為像素強度值的乘性偏移。對于亮度變化,由于他對像素值的變化是加性的,所以對圖像梯度的影響不大。而對于對像素強度進行乘性操作的對比度變化,圖像梯度值會受到很大的影響。因此需要削圖像對比度的影響。標準化可以消除對比度的影響。我們采用L2范數(曼哈頓距離)來對圖像進行標準化操作。L2范數的詳細內容請參考:這篇博客
在HOG中我們選擇在一個更大的尺度上進行標準化操作,我們劃分出一個 16 ? 16 16*16 16?16的block,這個block中包含 2 ? 2 = 4 2*2=4 2?2=4個cell。對于每個cell我們可以把它看作一個九元素的向量,將這些元素按照向量順序依次排序,我們針對于一個block就可以獲得 4 ? 9 = 36 4*9=36 4?9=36個元素的向量,我們對該36元向量進行L2標準化即可。同時,我們以16*16元素作為一個窗口,以8pixels作為步長來滑動窗口,對窗口區域內的cell進行標準化。如下圖所示:
步驟五、計算HOG特征向量
本步驟其實就是將整個圖片patch中的block中的直方圖向量信息連接起來就行了。
將標準化后的直方圖中包含的向量信息按照順序(從左到右、從上到下)連接起來即可得到輸入SVM分類器的樣本向量。我們計算以下經過上述步驟后的樣本區域向量維度。首先我們已知一個block的向量長度是36,而一張 64 ? 128 64*128 64?128像素的圖像包含 (64-8)/8=7 個水平的位置和 (128-8)/8=15 個豎直的位置,總計7×15=105個block。所以樣本區的向量長度最終可以表征為一個36*105=3780維度的向量。相比于原來的16284維向量維數降低了=77%,起到了很好的降維效果。
==至此我們得到了通過HOG特征描述子描述的目標樣本區域。==我們可以看出HOG描述子本身并沒有對圖像進行檢測、分配、匹配等操作,僅僅是對圖像強度信息進行運算,得到了一個用以描述樣本區域某個特征(在HOG中是邊緣)的向量(特征描述子)。再次印證了開篇對特征描述子的定義:特征描述子就是描述圖像特征的一種方式,是觀察圖像的一種視角。
HOG行人檢測的后續部分將在SVM分類器中進行。
總結
- 上一篇: up squared这么有名是有道理的,
- 下一篇: 《营销5.0后互联网时代的企业战略营销》