1. hog運算元
2. hog引數簡介及hog特徵維數的計算
3.hog引數簡介及hog特徵維數的計算
梯度直方圖特徵(hog)
是一種對影象區域性重疊區域的密集型描述符
, 它通過計算區域性區域的梯度方向直方圖來構成特徵。
hog特徵結合
svm分類器已經被廣泛應用於影象識別中,尤其在行人檢測中獲得了極大的成功。需要提醒的是,
hog+svm
進行行人檢測的方法是法國研究人員
dalal
在2005
的cvpr
上提出的,而如今雖然有很多行人檢測演算法不斷提出,但基本都是以
hog+svm
的思路為主。
hog特徵是一種區域性區域描述符
,它通過計算區域性區域上的梯度方向直方圖來構**體特徵
,能夠很好地描述人體的邊緣。它對光照變化和小量的偏移不敏感。
影象中畫素點(x,y)
的梯度為:
dalal提出的hog特徵提取的過程:把樣本影象分割為若干個畫素的單元(cell
),把梯度方向平均劃分為9
個區間(
bin),在每個單元裡面對所有畫素的梯度方向在各個方向區間進行直方圖統計,得到乙個
9維的特徵向量,每相鄰的
4個單元構成乙個塊(
block
),把乙個塊內的特徵向量聯起來得到
36維的特徵向量,用塊對樣本影象進行掃瞄,掃瞄步長為乙個單元。最後將所有塊的特徵串聯起來,就得到了人體的特徵。例如,對於
64*128
的影象而言,每
2*2的單元(
16*16
的畫素)構成乙個塊,每個塊內有
4*9=36
個特徵,以
8個畫素為步長,那麼,水平方向將有
7個掃瞄視窗,垂直方向將有
15個掃瞄視窗。也就是說,
64*128
的,總共有
36*7*15=3780
個特徵。
在行人檢測過程中,除了上面提到的hog特徵提取過程,還包括彩圖轉灰度,亮度校正等步驟。總結一下,在行人檢測中,hog特徵計算的步驟:
(1)將輸入的彩圖轉換為灰度圖;
(2)採用gamma
校正法對輸入影象進行顏色空間的標準化(歸一化); 目的是調節影象的對比度,降低影象區域性的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾;
(3)計算梯度;主要是為了捕獲輪廓資訊,同時進一步弱化光照的干擾。
(4)將梯度投影到單元的梯度方向;目的是為區域性影象區域提供乙個編碼,
(5)將所有單元格在塊上進行歸一化;歸一化能夠更進一步對光照、陰影和邊緣進行壓縮,通常,每個單元格由多個不同的塊共享,但它的歸一化是基於不同塊的,所以計算結果也不一樣。因此,乙個單元格的特徵會以不同的結果多次出現在最後的向量中。我們將歸一化之後的塊描述符就稱之為hog
描述符。
(6)收集得到檢測空間所有塊的hog
特徵;該步驟就是將檢測視窗中所有重疊的塊進行
hog特徵的收集,並將它們結合成最終的特徵向量供分類使用。
hog建構函式
cv_wrap hogdescriptor() :winsize(64,128), blocksize(16,16), blockstride(8,8),
cellsize(8,8),nbins(9), derivaperture(1), winsigma(-1),
histogramnormtype(hogdescriptor::l2hys),l2hysthreshold(0.2),
gammacorrection(true), nlevels(hogdescriptor::default_nlevels)
cv_wrap hogdescriptor(size_winsize, size _blocksize, size _blockstride,
size _cellsize, int _nbins, int_derivaperture=1, double _winsigma=-1,
int _histogramnormtype=hogdescriptor::l2hys,double _l2hysthreshold=0.2,
bool _gammacorrection=false, int_nlevels=hogdescriptor::default_nlevels) :
winsize(_winsize),blocksize(_blocksize), blockstride(_blockstride),
cellsize(_cellsize),nbins(_nbins), derivaperture(_derivaperture),
winsigma(_winsigma),histogramnormtype(_histogramnormtype),
l2hysthreshold(_l2hysthreshold),gammacorrection(_gammacorrection), nlevels(_nlevels)
cv_wrap hogdescriptor(const string&filename)
hogdescriptor(const hogdescriptor& d)
我們看到hogdescriptor一共有4個建構函式,前三個有cv_wrap字首,表示它們是從dll裡匯出的函式,即我們在程式當中可以呼叫的函式。
hog基本概念
在建構函式中,有幾個引數非常重要,分別為winsize(64,128), blocksize(16,16), blockstride(8,8), cellsize(8,8), nbins(9)。在此,用幾個示意圖來表示。
a) 視窗大小winsize
b) 塊大小blocksize
c) 胞元大小cellsize
d) 梯度方向數
nbins代表在乙個胞元中統計梯度的方向數目。如:nbins=9表示乙個胞元內統計9個方向的梯度直方圖。
hog特徵維數的計算
首先給出乙個hog
hogdescriptor* hog = newhogdescriptor(cvsize(64, 48), cvsize(8, 6), cvsize(8, 6), cvsize(4, 3), 9);
根據上面的概念可知,cvsize(64,48)表示視窗的大小,cvsize(8, 6)表示塊(block)大小,cvsize(8,6)表示塊滑動增量(blockstride)大小,cvsize(4, 3)表示胞元(cell)大小,9表示每個胞單元中梯度直方圖的數量。
注:輸入的尺寸為640×480。
據此,可知:乙個塊(block)包含a=(blocksize.width/cellsize.width)*(blocksize.height / cellsize.height)個胞元(cell),所以乙個塊(block)含有9a個梯度直方圖。按照所給出的資料,可得結果為36。
乙個視窗包含b=((windowsize.width-blocksize.width)/(blockstridesize.width)+1)* ((windowsize.height-blocksize.height)/(blockstridesize.height)+1)個塊(block),所以乙個視窗包含9ab個梯度直方圖。
按照所給出的資料,可得結果為2304。
其次,計算特徵向量hog->compute(trainimg,descriptors, size(64, 48), size(0, 0))
此處,trainimg代表輸入的(此處尺寸為640×480),descriptors表示儲存特徵結果的vector,size(64,48)表示windows的步進,第四個為padding,用於填充以適應大小。
當padding以預設狀態size(0,0)出現,滑動視窗window來計算時,
結果不一定為整數。
此時,檢視compute()函式發現,其中有一段**如下:
padding.width = (int)alignsize(std::max(padding.width,0), cachestride.width);
padding.height = (int)alignsize(std::max(padding.height,0), cachestride.height);
這段**就是用來將padding的大小來適應stride的大小。
在我的例項中,由於取得數都事先設計好,都是整數。而當若結果不為整數時,則將其取值為比其大的最小整數。如若padding.width計算為7.8時,就取8.
所以一幅640×480的,按照前面的引數,則可以取的特徵數為230400維。
HOG特徵理解
hog histogram of oriented gradient 表示的是影象區域性方向梯度直方圖,主要用來進行複雜影象中的行人檢測,並且比較通用的模型是hog svm。基本思想 在影象中,區域性區域的特徵能夠 被梯度或邊緣的方向密度資訊很好的表示 本質就是邊緣的梯度資訊 思想思路 將待分析影象...
HOG特徵學習
hog方向梯度直方圖 histogram of oriented gradient,hog 特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。它通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。其主要步驟 顏色空間歸一化 梯度計算 梯度方向直方圖 重疊塊直方圖歸一化 hog特徵。...
HOG特徵檢測
hog特徵檢測,它是通過計算區域性區域的梯度方向直方圖來構成特徵。其中檢測視窗win 塊block 單元格cell的基本資訊 1 大小 a 檢測視窗 winsize 128 64畫素,在影象中滑動的步長是8畫素 水平和垂直都是 b 塊 blocksize 16 16畫素,在檢測視窗中滑動的步長是8畫...