HOG特徵原理(二)

一、HOG特徵:html

       方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和圖像處理中用來進行物體檢測的特徵描述子。它經過計算和統計圖像局部區域的梯度方向直方圖來構成特徵。算法

Hog特徵結合SVM分類器已經被普遍應用於圖像識別中,尤爲在行人檢測中得到了極大的成功。須要提醒的是,HOG+SVM進行行人檢測的方法是法國研究人員Dalal在2005的CVPR上提出的,app

而現在雖然有不少行人檢測算法不斷提出,但基本都是以HOG+SVM的思路爲主。ide

(1)主要思想:函數

       在一副圖像中,局部目標的表象和形狀(appearance and shape)可以被梯度或邊緣的方向密度分佈很好地描述。(本質:梯度的統計信息,而梯度主要存在於邊緣的地方)。性能

(2)具體的實現方法是:編碼

       首先將圖像分紅小的連通區域,咱們把它叫細胞單元。而後採集細胞單元中各像素點的梯度的或邊緣的方向直方圖。最後把這些直方圖組合起來就能夠構成特徵描述器。spa

(3)提升性能:orm

       把這些局部直方圖在圖像的更大的範圍內(咱們把它叫區間或block)進行對比度歸一化(contrast-normalized),所採用的方法是:先計算各直方圖在這個區間(block)中的密度,htm

而後根據這個密度對區間中的各個細胞單元作歸一化。經過這個歸一化後,能對光照變化和陰影得到更好的效果。

(4)優勢:

       與其餘的特徵描述方法相比,HOG有不少優勢。首先,因爲HOG是在圖像的局部方格單元上操做,因此它對圖像幾何的和光學的形變都能保持很好的不變性,

這兩種形變只會出如今更大的空間領域上。其次,在粗的空域抽樣、精細的方向抽樣以及較強的局部光學歸一化等條件下,只要行人大致上可以保持直立的姿式,能夠允許行人有一些細微的肢體動做,

這些細微的動做能夠被忽略而不影響檢測效果。所以HOG特徵是特別適合於作圖像中的人體檢測的。

 

二、HOG特徵提取算法的實現過程:

大概過程:

HOG特徵提取方法就是將一個image(你要檢測的目標或者掃描窗口):

1)灰度化(將圖像看作一個x,y,z(灰度)的三維圖像);

2)採用Gamma校訂法對輸入圖像進行顏色空間的標準化(歸一化);目的是調節圖像的對比度,下降圖像局部的陰影和光照變化所形成的影響,同時能夠抑制噪音的干擾;

3)計算圖像每一個像素的梯度(包括大小和方向);主要是爲了捕獲輪廓信息,同時進一步弱化光照的干擾。

4)將圖像劃分紅小cells(例如6*6像素/cell);

5)統計每一個cell的梯度直方圖(不一樣梯度的個數),便可造成每一個cell的descriptor;

6)將每幾個cell組成一個block(例如3*3個cell/block),一個block內全部cell的特徵descriptor串聯起來便獲得該block的HOG特徵descriptor。

7)將圖像image內的全部block的HOG特徵descriptor串聯起來就能夠獲得該image(你要檢測的目標)的HOG特徵descriptor了。這個就是最終的可供分類使用的特徵向量了。

 

 

 

具體每一步的詳細過程以下:

(1)標準化gamma空間和顏色空間

     爲了減小光照因素的影響,首先須要將整個圖像進行規範化(歸一化)。在圖像的紋理強度中,局部的表層曝光貢獻的比重較大,因此,這種壓縮處理可以有效地下降圖像局部的陰影和光照變化。

由於顏色信息做用不大,一般先轉化爲灰度圖;

     Gamma壓縮公式:

     好比能夠取Gamma=1/2;

 

(2)計算圖像梯度

        計算圖像橫座標和縱座標方向的梯度,並據此計算每一個像素位置的梯度方向值;求導操做不只可以捕獲輪廓,人影和一些紋理信息,還能進一步弱化光照的影響。

圖像中像素點(x,y)的梯度爲:

 

       最經常使用的方法是:首先用[-1,0,1]梯度算子對原圖像作卷積運算,獲得x方向(水平方向,以向右爲正方向)的梯度份量gradscalx,而後用[1,0,-1]T梯度算子對原圖像作卷積運算,

獲得y方向(豎直方向,以向上爲正方向)的梯度份量gradscaly。而後再用以上公式計算該像素點的梯度大小和方向。

 

(3)爲每一個細胞單元構建梯度方向直方圖

        第三步的目的是爲局部圖像區域提供一個編碼,同時可以保持對圖像中人體對象的姿式和外觀的弱敏感性。

咱們將圖像分紅若干個「單元格cell」,例如每一個cell爲6*6個像素。假設咱們採用9個bin的直方圖來統計這6*6個像素的梯度信息。也就是將cell的梯度方向360度分紅9個方向塊,如圖所示:

例如:若是這個像素的梯度方向是20-40度,直方圖第2個bin的計數就加一,這樣,對cell內每一個像素用梯度方向在直方圖中進行加權投影(映射到固定的角度範圍),

就能夠獲得這個cell的梯度方向直方圖了,就是該cell對應的9維特徵向量(由於有9個bin)。

        像素梯度方向用到了,那麼梯度大小呢?梯度大小就是做爲投影的權值的。例如說:這個像素的梯度方向是20-40度,而後它的梯度大小是2(假設啊),

那麼直方圖第2個bin的計數就不是加一了,而是加二(假設啊)。

         細胞單元能夠是矩形的(rectangular),也能夠是星形的(radial)。

 

(4)把細胞單元組合成大的塊(block),塊內歸一化梯度直方圖

       因爲局部光照的變化以及前景-背景對比度的變化,使得梯度強度的變化範圍很是大。這就須要對梯度強度作歸一化。歸一化可以進一步地對光照、陰影和邊緣進行壓縮。

        做者採起的辦法是:把各個細胞單元組合成大的、空間上連通的區間(blocks)。這樣,一個block內全部cell的特徵向量串聯起來便獲得該block的HOG特徵。這些區間是互有重疊的,

這就意味着:每個單元格的特徵會以不一樣的結果屢次出如今最後的特徵向量中。咱們將歸一化以後的塊描述符(向量)就稱之爲HOG描述符。

        區間有兩個主要的幾何形狀——矩形區間(R-HOG)和環形區間(C-HOG)。R-HOG區間大致上是一些方形的格子,它能夠有三個參數來表徵:每一個區間中細胞單元的數目、

每一個細胞單元中像素點的數目、每一個細胞的直方圖通道數目。

       例如:行人檢測的最佳參數設置是:3×3細胞/區間、6×6像素/細胞、9個直方圖通道。則一塊的特徵數爲:3*3*9;

 

(5)收集HOG特徵

      最後一步就是將檢測窗口中全部重疊的塊進行HOG特徵的收集,並將它們結合成最終的特徵向量供分類使用。

    

(6)那麼一個圖像的HOG特徵維數是多少呢?

        順便作個總結:Dalal提出的Hog特徵提取的過程:把樣本圖像分割爲若干個像素的單元(cell),把梯度方向平均劃分爲9個區間(bin),

在每一個單元裏面對全部像素的梯度方向在各個方向區間進行直方圖統計,獲得一個9維的特徵向量,每相鄰的4個單元構成一個塊(block),把一個塊內的特徵向量聯起來獲得36維的特徵向量,

用塊對樣本圖像進行掃描,掃描步長爲一個單元。最後將全部塊的特徵串聯起來,就獲得了人體的特徵。例如,對於64*128的圖像而言,每8*8的像素組成一個cell,每2*2個cell組成一個塊,

由於每一個cell有9個特徵,因此每一個塊內有4*9=36個特徵,以8個像素爲步長,那麼,水平方向將有7個掃描窗口,垂直方向將有15個掃描窗口。也就是說,64*128的圖片,總共有36*7*15=3780個特徵。

HOG維數,16×16像素組成的block,8x8像素的cell

 

註釋:

行人檢測HOG+SVM

整體思路:
一、提取正負樣本hog特徵
二、投入svm分類器訓練,獲得model
三、由model生成檢測子
四、利用檢測子檢測負樣本,獲得hardexample
五、提取hardexample的hog特徵並結合第一步中的特徵一塊兒投入訓練,獲得最終檢測子。

深刻研究hog算法原理:
1、hog概述

Histograms of Oriented Gradients,顧名思義,方向梯度直方圖,是目標的一種描述的方式,既是描述子。
2、hog提出
hog是05年一位nb的博士提出來的,論文連接 http://wenku.baidu.com/view/676f2351f01dc281e53af0b2.html
3、算法理解
        終於到10月了,終於能夠鬆一口氣了,整理一下hog的算法流程。
首先要有一個總體的認識,每個目標都對應一個一維特徵向量,這個向量一共有n維,這個n不是憑空瞎猜的,是有理有據,打個比方,爲何opencv自帶的hog檢測子是3781維的?
這個問題在初期確實比較頭疼,糾結了好長的時間,不過彆着急,
咱們先來看一下opencv裏的HOGDescriptor這個結構的構造函數HOGDescriptor(Size winSize,Size blocksize,Size blockStride,Size cellSize,...(後面的參數在這裏用不到)),
去查一下opencv默認的參數咱們能夠看到,winSize(64,128),blockSize(16,16),blockStride(8,8),cellSize(8,8),很顯然hog是將一個特徵窗口win劃分爲不少的塊block,
在每個塊裏又劃分爲不少的細胞單元cell(即胞元),hog特徵向量既是把這些全部的cell對應的小特徵串起來獲得一個高維的特徵向量,
那麼這個窗口對應的一維特徵向量維數n就等於窗口中的塊數 x 塊中的胞元數  x 每個胞元對應的特徵向量數。
寫到這裏,咱們計算一下3781如何獲得的,窗口大小64x128,塊大小16x16,塊步長8x8,那麼窗口中塊的數目是((64-16)/8+1)*((128-16)/8+1) = 7*15 =105個塊,塊大小爲16x16,胞元大小爲8x8,
那麼一個塊中的胞元cell數目是 (16/8)*(16/8) =4個胞元,到這裏咱們能夠看到要求最後須要的維數n,只須要計算每個胞元對應的向量,這個參數在哪呢?
別急,咱們把每個胞元投影到9個bin(如何投影?這裏卡了很長一段時間,後面會說),那麼每個胞元對應的向量就是9維,每一個bin對應該9維向量的一個數,
如今看一下是否是計算窗口維數的三個需求量都知道了,n = 窗口中的塊數 x 塊中的胞元數  x 每個胞元對應的特徵向量數,帶入看一下n= 105x4x9 = 3780,這就是這個窗口對應的特徵了。
有人會說,爲何opencv裏的getDefaultPeopleDetector()獲得的是3781維呢?這是由於另一維是一維偏移,(很崩潰是吧,我也崩潰好久。。。,下一段解釋)。
咱們利用hog+svm檢測行人,最終的檢測方法是最基本的線性判別函數,wx + b = 0,剛纔所求的3780維向量其實就是w,而加了一維的b就造成了opencv默認的3781維檢測算子,
而檢測分爲train和test兩部分,在train期間咱們須要提取一些列訓練樣本的hog特徵使用svm訓練最終的目的是爲了獲得咱們檢測的w以及b,在test期間提取待檢測目標的hog特徵x,
帶入方程是否是就能進行判別了呢?
**************************************************************************************************
相關文章
相關標籤/搜索