opencv Hog学习总结
一、方向梯度
梯度:在向量微積分中,標(biāo)量場(chǎng)的梯度是一個(gè)向量場(chǎng)。標(biāo)量場(chǎng)中某一點(diǎn)上的梯度指向標(biāo)量場(chǎng)增長最快的方向,梯度的長度是這個(gè)最大的變化率。更嚴(yán)格的說,從歐幾里得空間Rn到R的函數(shù)的梯度是在Rn某一點(diǎn)最佳的線性近似。在這個(gè)意義上,梯度是雅可比矩陣的一個(gè)特殊情況。
在單變量的實(shí)值函數(shù)的情況,梯度只是導(dǎo)數(shù),或者,對(duì)于一個(gè)線性函數(shù),也就是線的斜率。
在圖像中梯度的概念也是像素值變換最快的方向,把邊緣(在圖像合成中單一物體的輪廓叫做邊緣)引入進(jìn)來,邊緣與梯度保持垂直方向。
方向梯度中的方向是如何確定的?P0到P1的梯度方向:
具體在HOG中方向梯度的實(shí)現(xiàn):首先用[-1,0,1]梯度算子對(duì)原圖像做卷積運(yùn)算,得到x方向(水平方向,以向右為正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子對(duì)原圖像做卷積運(yùn)算,得到y(tǒng)方向(豎直方向,以向上為正方向)的梯度分量gradscaly。然后再用以下公式計(jì)算該像素點(diǎn)的梯度大小和方向。
二、算法基本流程
在一幅圖像中,方向梯度直方圖(Histogram of Oriented Gradient, HOG)能夠很好地描述局部目標(biāo)區(qū)域的特征,是一種常用的特征提取方法,HOG+SVM在行人檢測(cè)中有著優(yōu)異的效果。在HOG中,對(duì)一幅圖像進(jìn)行了如下劃分: ?
圖像(image)->檢測(cè)窗口(win)->圖像塊(block)->細(xì)胞單元(cells)?
流程圖如下: ?
大概過程:
大概過程:
HOG特征提取方法就是將一個(gè)image(你要檢測(cè)的目標(biāo)或者掃描窗口):
1)灰度化(將圖像看做一個(gè)x,y,z(灰度)的三維圖像);
2)采用Gamma校正法對(duì)輸入圖像進(jìn)行顏色空間的標(biāo)準(zhǔn)化(歸一化);目的是調(diào)節(jié)圖像的對(duì)比度,降低圖像局部的陰影和光照變化所造成的影響,同時(shí)可以抑制噪音的干擾;
3)計(jì)算圖像每個(gè)像素的梯度(包括大小和方向);主要是為了捕獲輪廓信息,同時(shí)進(jìn)一步弱化光照的干擾。
4)將圖像劃分成小cells(例如6*6像素/cell);
5)統(tǒng)計(jì)每個(gè)cell的梯度直方圖(不同梯度的個(gè)數(shù)),即可形成每個(gè)cell的descriptor;
6)將每幾個(gè)cell組成一個(gè)block(例如3*3個(gè)cell/block),一個(gè)block內(nèi)所有cell的特征descriptor串聯(lián)起來便得到該block的HOG特征descriptor。
7)將圖像image內(nèi)的所有block的HOG特征descriptor串聯(lián)起來就可以得到該image(你要檢測(cè)的目標(biāo))的HOG特征descriptor了。這個(gè)就是最終的可供分類使用的特征向量了。
(1)標(biāo)準(zhǔn)化gamma空間和顏色空間
? ? ?為了減少光照因素的影響,首先需要將整個(gè)圖像進(jìn)行規(guī)范化(歸一化)。在圖像的紋理強(qiáng)度中,局部的表層曝光貢獻(xiàn)的比重較大,所以,這種壓縮處理能夠有效地降低圖像局部的陰影和光照變化。因?yàn)轭伾畔⒆饔貌淮?#xff0c;通常先轉(zhuǎn)化為灰度圖;
? ? ?Gamma壓縮公式:
? ? ?比如可以取Gamma=1/2;
歸一化的目的:就是使得預(yù)處理的數(shù)據(jù)被限定在一定的范圍內(nèi)(比如[0,1]或者[-1,1]),從而消除奇異樣本數(shù)據(jù)導(dǎo)致的不良影響 梯度直方圖由梯度大小、方向生成 光照變化無非就是強(qiáng)度和方向變化,你嘗試從以下幾點(diǎn)去理解: 1、光照強(qiáng)度會(huì)不會(huì)影響梯度強(qiáng)度,歸一化能不能消除這個(gè)差異 2、光照方向變化會(huì)不會(huì)影響梯度的方向變化,需不需要?dú)w一化消除,還是本身就不會(huì)影響到?
(2).計(jì)算圖像梯度
對(duì)數(shù)字圖像而言,每個(gè)像素水平和垂直方向的梯度,可以通過下圖的kernels計(jì)算:?
?
即可寫為:?
?
每個(gè)像素梯度大小和方向可表示為:?
?
其中,I(x,y)是圖像在點(diǎn)(x,y)處的像素值。?
梯度圖像移除了不必要的信息,但是高亮了輪廓線。在每一個(gè)像素上,梯度都有大小和方向。對(duì)于彩色圖像,3個(gè)通道的梯度都將被計(jì)算出來,然而圖像素的梯度值為3個(gè)通道中最大的梯度值,角度也是最大角度。
(3)為每個(gè)細(xì)胞單元構(gòu)建梯度方向直方圖
? ? ? ? 第三步的目的是為局部圖像區(qū)域提供一個(gè)編碼,同時(shí)能夠保持對(duì)圖像中人體對(duì)象的姿勢(shì)和外觀的弱敏感性。
我們將圖像分成若干個(gè)“單元格cell”,例如每個(gè)cell為8*8個(gè)像素。假設(shè)我們采用9個(gè)bin的直方圖來統(tǒng)計(jì)這8*8個(gè)像素的梯度信息。也就是將cell的梯度方向360度分成9個(gè)方向塊,如圖所示
例如:如果這個(gè)像素的梯度方向是20-40度,直方圖第2個(gè)bin的計(jì)數(shù)就加一,這樣,對(duì)cell內(nèi)每個(gè)像素用梯度方向在直方圖中進(jìn)行加權(quán)投影(映射到固定的角度范圍),就可以得到這個(gè)cell的梯度方向直方圖了,就是該cell對(duì)應(yīng)的9維特征向量(因?yàn)橛?個(gè)bin)。
梯度大小就是作為投影的權(quán)值的。
這邊的加權(quán)投影所用的權(quán)值為當(dāng)前點(diǎn)的梯度幅值。例如說:某個(gè)像素的梯度方向是20-40度,其梯度幅值是4,那么直方圖第2個(gè)bin的計(jì)數(shù)就不是加1了,而是加4。這樣就得到關(guān)于梯度方向的一個(gè)加權(quán)直方圖。之前提到過,cell的中方向范圍的個(gè)數(shù)由bins來決定,還是以9為例:所以,一個(gè)cell中的向量為9個(gè)。以上面的例子,在一個(gè)尺寸為64×64的檢測(cè)窗中,描述子的維數(shù)就應(yīng)該為:9×4×49=1764 。其中4為一個(gè)block中cell的個(gè)數(shù),49為一個(gè)win中block的個(gè)數(shù)。?
?
細(xì)胞單元可以是矩形的(rectangular),也可以是星形的(radial)。
?
(4)把細(xì)胞單元組合成大的塊(block),塊內(nèi)歸一化梯度直方圖
? ? ? ?由于局部光照的變化以及前景-背景對(duì)比度的變化,使得梯度強(qiáng)度的變化范圍非常大。這就需要對(duì)梯度強(qiáng)度做歸一化。歸一化能夠進(jìn)一步地對(duì)光照、陰影和邊緣進(jìn)行壓縮。
? ? ? ? 作者采取的辦法是:把各個(gè)細(xì)胞單元組合成大的、空間上連通的區(qū)間(blocks)。這樣,一個(gè)block內(nèi)所有cell的特征向量串聯(lián)起來便得到該block的HOG特征。這些區(qū)間是互有重疊的,這就意味著:每一個(gè)單元格的特征會(huì)以不同的結(jié)果多次出現(xiàn)在最后的特征向量中。我們將歸一化之后的塊描述符(向量)就稱之為HOG描述符。
?
區(qū)間有兩個(gè)主要的幾何形狀——矩形區(qū)間(R-HOG)和環(huán)形區(qū)間(C-HOG)。R-HOG區(qū)間大體上是一些方形的格子,它可以有三個(gè)參數(shù)來表征:每個(gè)區(qū)間中細(xì)胞單元的數(shù)目、每個(gè)細(xì)胞單元中像素點(diǎn)的數(shù)目、每個(gè)細(xì)胞的直方圖通道數(shù)目。
例如:行人檢測(cè)的最佳參數(shù)設(shè)置是:2×2細(xì)胞/區(qū)間、8×8像素/細(xì)胞、9個(gè)直方圖通道。則一塊的特征數(shù)為:2*2*9;
?
(5)收集HOG特征
? ? ? 最后一步就是將檢測(cè)窗口中所有重疊的塊進(jìn)行HOG特征的收集,并將它們結(jié)合成最終的特征向量供分類使用。
?
三、HOG的win ,block ,cell
對(duì)于圖像中檢測(cè)窗口的尺寸為64×64,假設(shè)給出塊的尺寸為16×16,塊步長為(8,8),經(jīng)過計(jì)算:檢測(cè)窗口中共滑動(dòng)7×7=49個(gè)block。在一個(gè)塊中選擇細(xì)胞單元不再滑動(dòng),給出細(xì)胞單元的尺寸為(8,8),所以一個(gè)塊中一共有2×2=4個(gè)cell。
那么一個(gè)圖像的HOG特征維數(shù)是多少呢?
?
把樣本圖像分割為若干個(gè)像素的單元(cell),把梯度方向平均劃分為9個(gè)區(qū)間(bin),在每個(gè)單元里面對(duì)所有像素的梯度方向在各個(gè)方向區(qū)間進(jìn)行直方圖統(tǒng)計(jì),得到一個(gè)9維的特征向量,每相鄰的4個(gè)單元構(gòu)成一個(gè)塊(block),把一個(gè)塊內(nèi)的特征向量聯(lián)起來得到36維的特征向量,用塊對(duì)樣本圖像進(jìn)行掃描,掃描步長為一個(gè)單元。最后將所有塊的特征串聯(lián)起來,就得到了人體的特征。例如,對(duì)于64X128的圖像而言,每16X16的像素組成一個(gè)cell,每2X2個(gè)cell組成一個(gè)塊,因?yàn)槊總€(gè)cell有9個(gè)特征,所以每個(gè)塊內(nèi)有4X9=36個(gè)特征,以8個(gè)像素為步長,那么,水平方向?qū)⒂?個(gè)掃描窗口,垂直方向?qū)⒂?5個(gè)掃描窗口。也就是說,64X128的圖片,總共有36X7X15=3780個(gè)特征。
?
注意
上面舉例說的是64X128圖像對(duì)應(yīng)的HOG特征。但是64X128可能是一個(gè)更大圖片的滑動(dòng)窗口,這個(gè)滑動(dòng)窗口用于物體檢測(cè),
?
單獨(dú)將其中一個(gè)8*8的小格拿出來,方向梯度中指的方向范圍為2π,360°,為了畫直方圖我們還需要選取合適的組距也就是bin,這里組距選取2π/9,也就是最后的直方圖組數(shù)為9。下圖為8*8像素的cell對(duì)應(yīng)的方向梯度(未全部畫出,共有8*8=64個(gè))。
圖5
將上面的64個(gè)方向梯度,按著直方圖的參數(shù)設(shè)置進(jìn)行畫圖,其中梯度的大小在統(tǒng)計(jì)數(shù)量中呈線性關(guān)系,比如梯度大小為2(上述公式可以計(jì)算梯度大小),則直方圖對(duì)應(yīng)增加2個(gè)單位,
畫出的對(duì)應(yīng)直方圖假設(shè)如下所示:
圖6
把上圖中單個(gè)cell對(duì)應(yīng)的方向直方圖轉(zhuǎn)換為單維向量,也就是按規(guī)定組距對(duì)對(duì)應(yīng)方向梯度個(gè)數(shù)進(jìn)行編碼,(8,10,6,12,4,5,8,6,14 和為),得到單個(gè)cell的9個(gè)特征,每個(gè)block(掃描窗口)包含2*2個(gè)cell也就是2*2*9=36個(gè)特征,一個(gè)64*128大小的圖像最后得到的特征數(shù)為36*7*15=3780個(gè)。這樣將一幅直觀的梯度圖通過分解提取變?yōu)橛?jì)算機(jī)容易理解的特征向量。
以上工作為HOG提取的主要內(nèi)容,最后得到對(duì)應(yīng)的行人的由方向梯度直方圖HOG提取到的特征向量,但是計(jì)算機(jī)還是不知道這個(gè)數(shù)據(jù)數(shù)組代表了什么意思,什么時(shí)候這組向量代表行人,什么時(shí)候代表其他東西,怎樣train,最后通過不斷地學(xué)習(xí),而后在檢測(cè)積累的基礎(chǔ)上對(duì)對(duì)未知圖像檢測(cè)識(shí)別有沒有行人呢?那就是后一步SVM要做的事了。
參考自:https://blog.csdn.net/akadiao/article/details/79685323
https://blog.csdn.net/LUFANGBO/article/details/82491680
總結(jié)
以上是生活随笔為你收集整理的opencv Hog学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python CV2裁剪图片并保存
- 下一篇: springboot jpa sql打印