圖像特徵:方向梯度直方圖 HOG


參考資料


簡介

方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和圖像處理中用來進行物體檢測的特徵描述子,是通過計算和統計圖像 局部區域 的梯度方向直方圖來構成特徵。最早由法國研究員Dalal等在CVPR-2005上提出,用於解決人體目標檢測問題。

主要思想:
一幅圖像中局部目標的表象和形狀(appearance and shape)能夠很好地被邊緣或輪廓的 方向密度分佈 來描述,而梯度信息正處於邊緣或輪廓附近。因此考慮將圖像分成多塊局部區域(cell),採集其中各像素點的梯度方向直方圖或邊緣的方向直方圖,組合得到的直方圖來構建特徵描述器。

優點:

  1. HOG表示的是邊緣(梯度)的結構特徵,因此可以描述局部的形狀信息
  2. 位置和方向空間的量化一定程度上可以抑制平移和旋轉帶來的影響;
  3. 採取在局部區域歸一化直方圖,可以部分抵消光照變化帶來的影響。
  4. 由於一定程度忽略了光照顏色對圖像造成的影響,使得圖像所需要的表徵數據的維度降低了。
  5. 而且由於它這種分塊分單元的處理方法,也使得圖像局部像素點之間的關係可以很好得到的表徵。

缺點:

  1. 描述子生成過程冗長,導致速度慢,實時性差;
  2. 很難處理遮擋問題;
  3. 由於梯度的性質,該描述子對噪點相當敏感;
  4. 只使用灰度圖像,未考慮顏色信息。

算法流程

主要步驟:灰度化和gamma校正 -> 計算梯度 -> 統計cell的梯度方向直方圖 -> Block 塊內歸一化 -> 生成HOG特徵
在這裏插入圖片描述

灰度化和gamma校正

爲了減少光照影響,處理光線太暗或太強的情況,需要將整個圖像進行歸一化處理:灰度化和Gamma校正。在圖像的紋理強度中,局部的表層曝光貢獻的比重較大,這種處理能夠有效地降低圖像局部的陰影和光照變化。

灰度化:
HOG特徵考慮的是代表邊緣和形狀特性的梯度信息,色彩幾乎沒有貢獻,作用不大,可直接轉化爲灰度圖。
Gray=0.3×R+0.59×G+0.11×B Gray = 0.3 \times R + 0.59 \times G + 0.11 \times B

Gamma校正:
爲了降低圖像局部的陰影和光照變化,首先需要對整個圖像進行Gamma校正,將圖像整體亮度提高或降低。在實際中可以採用兩種不同的方式進行Gamma標準化:平方根或對數法。平方根法的公式如下(其中 γ=0.5γ=0.5 ):
I(x,y)=I(x,y)γ I(x,y) = I(x,y)^{\gamma}
在這裏插入圖片描述

計算梯度

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

梯度算子:水平邊緣算子[1,0,1][-1, 0, 1],垂直邊緣算子 [1,0,1]T[-1, 0, 1]^T
值得說明的是:

HOG的提出者嘗試了其他一些更復雜的模板,如3×3 Sobel 模板,或對角線模板(diagonal masks),但是在行人檢測實驗中,複雜模板的表現都較差,作者總結到:模板越簡單,效果反而越好
.
同時嘗試了在使用微分算子前加入高斯平滑濾波,但加入後的檢測效果變得更差,原因是:許多有用的圖像信息是來自變化劇烈的邊緣,而高斯濾波會模糊邊緣。如果需要濾波,則應考慮 保邊去噪 算法。

計算梯度幅值與方向:
在這裏插入圖片描述

統計cell的梯度方向直方圖

將圖像劃分成若干個 cell 單元格,相鄰的cell互不重疊。在每個cell內,將所有梯度方向劃分爲n個bin(一般取n=9n=9),作爲直方圖的橫軸,角度範圍所對應的梯度值累加值作爲直方圖縱軸,進行統計即得到梯度方向直方圖。

假設每個cell爲 6×66\times 6 個像素,採用9個bin的直方圖來統計,也就是將cell的梯度方向由360度分成9個方向塊,如圖所示:
在這裏插入圖片描述
如果某像素的梯度方向是20-40度,則直方圖第2個bin的計數就加一。這樣,對cell內每個像素用梯度方向在直方圖中進行加權投影(映射到固定的角度範圍),就可以得到這個cell的梯度方向直方圖了,即一個9維的特徵向量。

值得說明的是:
上述的梯度角度是0-180度,不是0-360度,這稱爲"unsigned"梯度,即認爲正負梯度角是一樣的,梯度的箭頭旋轉180度之後保持不變。那爲什麼不用0-360度的表示呢?因爲HOG的提出者表示在行人檢測任務中發現unsigned gradients 比 signed gradients 效果更好。對於其他任務,則可以自行指定是否使用"unsigned"梯度

單元格Cell中的每一個像素點都爲某個基於方向的直方圖通道(orientation-based histogram channel)投票,投票是採取加權投票(weighted voting)權值由梯度幅值計算得到,可以是幅值本身或者其函數值,投票結果就是該cell的特徵向量。
C=[x1,x2,,x9]C=[x_1,x_2,\cdots,x_9]

實際測試表明: 使用幅值來表示權值能獲得最佳的人體檢測效果。

Block 塊內歸一化(重點)

由於局部光照的變化以及前景-背景對比度的變化,使得梯度強度的變化範圍非常大,這就需要對梯度強度做歸一化。歸一化能夠進一步地對光照、陰影和邊緣進行壓縮。

但不能進行全局歸一化,否則容易模糊細節或邊緣,考慮把 mm 個cell組合成一個大的、空間上連通的 block 區塊(一般取m=4m=4)。這樣,一個block內就含有多個cell的特徵向量,歸一化後,將其串聯起來得到的高維特徵向量即是該block的HOG特徵:
B=[C1,C2,C3,C4]B=[C_1, C_2,C_3,C_4]

在這裏插入圖片描述
所有block的大小都必須相同,相鄰block之間的距離(稱爲跨距)是一個自由參數,但通常設置爲塊大小的一半,在這種情況下,將得到重疊塊,即其他文章所說的 “overlap”分割問題,對應地有“non-overlap”:區塊不交疊,cell不重複計算。實踐表明:一般選用“overlap”分割,其擁有更好的表徵能力,即使計算量較大
在這裏插入圖片描述

有關歸一化方法,值得說明的是:
不同於常見的Min-Max 歸一化,有 參考文章 中提出了下述方法:
在這裏插入圖片描述

組合爲HOG特徵

ll個Block的特徵向量組合起來,hh取決於圖像的寬高尺寸,這樣就得到了最終的HOG特徵:
HOG=[B1,B2,,Bl]HOG=[B_1, B_2,\cdots,B_l]

維數計算:
dims=l×m×n=l×36 dims = l \times m \times n = l\times36

分塊計算:
l=(W/S1)×(H/S1) l = (W/S-1) \times (H/S-1)

其中,步長SS一般取 Block像素數的一半

HOG特徵與可視化

可視化結果表示HOG特徵的主要方向捕捉了人體的外形,特別是軀幹和腿。
在這裏插入圖片描述

OpenCV 算法實現

接口代碼

在這裏插入圖片描述

Default Value Comment
_winSize Size(64,128) Size of detection window in pixels (width, height). Defines the region of interest. Must be an integer multiple of cell size.
_blockSize Size(16,16) Block size in pixels (width, height). Defines how many cells are in each block. Must be an integer multiple of cell size and it must be smaller than the detection window. The smaller the block the finer detail you will get.
_blockStride Size(8,8) Block stride in pixels (horizontal, vertical). It must be an integer multiple of cell size. The block_stride defines the distance between adjecent blocks, for example, 8 pixels horizontally and 8 pixels vertically. Longer block_strides makes the algorithm run faster (because less blocks are evaluated) but the algorithm may not perform as well.
_cellSize Size(8,8) Cell size in pixels (width, height). Determines the size fo your cell. The smaller the cell the finer detail you will get.
_nbins 9 Number of bins for the histograms. Determines the number of angular bins used to make the histograms. With more bins you capture more gradient directions. HOG uses unsigned gradients, so the angular bins will have values between 0 and 180 degrees.
_derivAperture 1 /
_winSigma -1 Gaussian smoothing window parameter. The performance of the HOG algorithm can be improved by smoothing the pixels near the edges of the blocks by applying a Gaussian spatial window to each pixel before computing the histograms.
_histogramNormType L2Hys histogram normalization type
_L2HysThreshold FALSE L2-Hys (Lowe-style clipped L2 norm) normalization method shrinkage. The L2-Hys method is used to normalize the blocks and it consists of an L2-norm followed by clipping and a renormalization. The clipping limits the maximum value of the descriptor vector for each block to have the value of the given threshold (0.2 by default).
_gammaCorrection TRUE Flag to specify whether the gamma correction preprocessing is required or not. Performing gamma correction slightly increases the performance of the HOG algorithm.
_nlevels 64 Maximum number of detection window increases.
_signedGradient FALSE sets signedGradient with given value
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/objdetect/objdetect.hpp"

using namespace std;

int main(int argc, char* argv[])
{
    cv::Mat src = cv::imread("../src.png");

    cv::Size winSize(64, 128);      // ROI
    cv::Size cellSize(8, 8);        // cell
    cv::Size blockSize(16, 16);     // block
    cv::Size blockStride(8, 8);     // 步長
    int nbins(9);                   // bins number
    cv::HOGDescriptor hog(winSize, blockSize, blockStride, cellSize, nbins);

    std::vector< float > feature;
    hog.compute(src(cv::Rect(0, 0, 64, 128)), feature);  // 只取第一個窗口的HOG特徵
    cout << "feature dims: " << feature.size() << endl;  // 3780

    return 0;
}

每個Block中4個Cell,每個Cell統計9個bins,則HOG維數計算如下:

m×n=4×9=36 m \times n = 4 \times 9 = 36

一般步長取Block區塊的一半,則

dims=(W/S1)×(H/S1)×36=3780 dims = (W/S-1) \times (H/S-1) \times 36 = 3780

關於特徵維數值得說明的是:
特徵維數越多,表徵能力越強,但肯定存在冗餘,增大計算量。這就需要考慮“特徵降維”,如PCA,這也是 OpenCV-KCF 中存在PCA參數的原因。

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