• 沒有找到結果。

第二章 HOG 區域特徵描述子與各種基於 HOG 之人形分類器

2.1 梯度方向直方圖(HOG)

本研究採用的梯度方向直方圖(Histograms of Oriented Gradients,HOG),是在 2005 年由 N. Dalal 與 B. Triggs 等人提出的一種用來進行人形偵測的特徵描述子,

11

其概念是以 36 個維度向量來代表一個影像區塊(Block)內物體的輪廓與外觀的資訊。

區塊的形狀分為兩種,分別為圓形(Circle-HOG)與矩形(Rectangular-HOG)。C-HOG 與 R-HOG 效果差異不大,但是 R-HOG 在實作上比較方便。因此本研究採用 R-HOG 進行系統實作。在不同應用的情況之下,區塊的長寬可以介於 12x12 至 64x128 之 間,其長寬比例可以為 1:1、1:2 與 2:1,即區塊之間的移動步數若為 1 個 Pixel,那 麼在一張偵測視窗中的區塊數量最大為 291997 個。

我們的人形偵測系統中採用 1:1 大小的區塊,並且區塊大小固定為 16x16。其 中在一張影像畫格(Frame)中包含若干個偵測視窗,一個偵測視窗中包含若干個區 塊,一個區塊中包含四個單元(Cell),如圖 2-1 所示。

Frame

Detecting Window 128

64 640

480

1:1

Block 16

16

Cells 8

8

圖 2-1 HOG 名詞示意圖

計算一個 Block 的 36 維向量(36D Vector)稱為一個 HOG 的計算。共需經過五 個步驟,分別是:梯度分量、梯度大小、梯度方向、累積直方圖與直方圖正規化,

將在底下分別介紹。

Step.1 梯度分量(Gradient Components)

計算 HOG 特徵向量的第一個步驟是計算區塊內每個像素的水平方向梯度分量 Gx與垂直方向的梯度分量 Gy。即經由公式(2-1),使用遮罩 [-1, 0, 1]與[-1, 0, 1]T行影像旋積(Convolution Operation),如圖 2-2 所示,即可計算出 Gx與 Gy。若影像

12

的色階為 8-bit,則 Gx與 Gy值的範圍將會落在-255 與+255 之間。雖然 HOG 原作 者也有測試過其他較複雜的遮罩去計算 Gx與 Gy的值,例如 Sobel 等。但經實驗所 表現的效果很差,所以得到結論為遮罩越簡單效果越好。

( , ) ( 1, ) ( 1, ) ( , ) ( , 1) ( , 1)

x y

G x y f x y f x y G x y f x y f x y

   

    (2-1)

-1 0 +1 Gy

Gx -1 0 +1

圖 2-2 水平與垂直方向分量 Convolution 遮罩

Step.2 梯度大小(Gradient Magnitude)

接著進行第二個步驟的計算,使用步驟一所計算完成的水平與垂直方向的梯 度分量 Gx與 Gy,並使用公式(2-2)進行梯度大小的計算。其計算方式為平方相加後 開根號,若影像的色階為 8-bit,將 Gx與 Gy的最大值+255 帶入公式(2-2),可以計 算得到梯度大小的最大值為 360.62,即梯度大小結果值的範圍將會落在 0~360.62 之間。

2 2

( , ) x( , ) y( , ) f x y G x y G x y

   (2-2)

Step.3 梯度方向(Gradient Orientation)

接著進行第三個步驟的計算,使用步驟一所計算完成的水平與垂直方向的梯 度分量 Gx與 Gy,並使用公式(2-3)進行梯度方向的計算。依照該公式計算完畢的結 果為徑度(Radian),將結果換算為角度(Degree)後,因為 HOG 使用的是 Unsigned

13

Gradient,所以換算成角度後若其為負角度則加上 180 度,使其結果介於 0~180 度 之間。Signed Gradient 與 Unsigned Gradient 的示意圖如圖 2-3 所示。

1

( , )

Unsigned gradient

Signed gradient

圖 2-3 Signed Gradient 與 Unsigned Gradient 示意圖

Step.4 累積直方圖(Accumulated Histogram)

經過步驟二與步驟三的計算之後會得到梯度大小與梯度方向。梯度方向以 20 度的範圍作為 1 個區間(Bin)來做分割,Unsigned Gradient 的範圍為 0~180 度之間,

因此共有 9 個角度區間,如圖 2-4 所示。

X Y

20°

unsigned gradient 40°

60°

80°

120°100°

140°

14

將每一個區塊區分為 4 個單元(Cell),每個 Cell 中的每個像素位置均有其對應 的梯度大小與方向,依序將其梯度大小累積至其梯度方向區間,1 個 Cell 中的每個 像素位置全部累積完畢之後可以得到一個直方圖,如圖 2-5 的圖中是使用一個像素 進行累積示意,一個 Cell 累積完畢的直方圖也可稱為一個 9 維的向量(9D Vector) 或 9 維的直方圖(9D Histogram)。一共 4 個單元,將 4 個單元所累積出的 4 組 9 維 向量串接(Concatenate)為 36 維向量。如圖 2-6 所示。

9D Vector Bins Magnitude

Accumulation

1 2 3 4 5 6 7 8 9

偵測視窗 (Detecting Window)

64

16

128 16

區塊 (16x16 Block)

Cell 1 Cell 2

Cell 3 Cell 4

8

8

Magnitude = 74.8 Orientation = 172.96 172.96 => Bin 9

74.8

0

………

圖 2-5 HOG 之 9D Vector 累積示意圖

15 偵測視窗

(Detecting Window) 64

16

128 16

區塊 (16x16 Block)

Cell 1 Cell 2

Cell 3 Cell 4

9D Vector 1~4

9D Vector 1~4 Concatenated into 36D Vector.

圖 2-6 HOG 之 9D Vector 與 36D Vector 示意圖

Step.5 直方圖正規化(L2-Normalization)

將步驟四累積完成的直方圖,即 36 維向量,進行正規化(Normalization)使其 每維向量數值均介於 0 到 1 之間。HOG 原作者在此步驟測試了四種方法:L2-norm、

L1-norm、L1-sqrt、L2-Hys,結論是 L2-norm、L1-sqrt、L2-Hys 三種方法的效果都 很好,而 L1-norm 表現出一點不可靠性,但相對於沒有正規化,四種方法都很有 效。我們使用 L2-norm,如公式(2-4)。其中(||v||2)2 = v02

+v12+…+v352

,𝜀:𝐸𝑃𝑆𝐼𝐿𝑂𝑁,

是一個極小的常數(a small constant),其存在意義是為了避免分母為 0 的情形發生。

在我們的程式中將其定義為 0.000001。

2 2

2

, 0 ~ 35 ( )

i i

v v i

v

 

(2-4)

16

經過五個步驟的計算之後得到的經過正規化的 36 維向量,也就是一次完整的 HOG 計算,即為一個區塊的 HOG 特徵。圖 2-7 是為了將 HOG 視覺化,實際由偵 測視窗中的一些區塊所實際計算出的 HOG 繪製成直方圖的示意圖。

圖 2-7 HOG 視覺化直方圖繪製示意圖

在純軟體程式中我們藉由撰寫 C 語言模組化程式的方式,將一個 HOG 的計算 以一個 oneHOG 主模組實現,主模組函式名稱為 compute_oneHOG_36D_vector(),

其函式模組架構圖如圖 2-8 所示。圖 2-9 與圖 2-10 分別為 oneHOG 主模組測試專 案函式呼叫架構圖與流程圖。

oneHOG主模組

梯度計算子模組

梯度分量子模組

梯度大小子模組

梯度方向子模組

直方圖統計子模組

直方圖累加子模組

直方圖正規化子模組

圖 2-8 oneHOG 主模組與子模組架構圖

17

main()

oneHOG_vote_histograms() block_vote_36D_vector() L2normalization_36D_vector()

36D Vector,

即oneHOG

間並填入Block寬高與像素 End

輸入BMP為4的倍數?

18