전공지식정리/영상처리(Image Signal Processing)

HOG(histograms of oriented gradients)

TimeSave 2022. 1. 20. 21:14

[Dalal05] N. Dalal and B. Triggs, "Histograms of oriented gradients for human detection," CVPR 2005.

 

HOG는 대상 영역을 일정 크기의 셀로 분할하고, 각 셀마다 edge 픽셀(gradient magnitude가 일정 값 이상인 픽셀)들의 방향에 대한 히스토그램을 구한 후 이들 히스토그램 bin 값들을 일렬로 연결한 벡터이다. 즉, HOG는 edge의 방향 히스토그램 템플릿으로 볼 수 있다.  

 

사각형 block을 사용하는 R-HOG와 원형 block을 사용하는 C-HOG가 있는데

R-HOG의 경우만 정리한다.

 

1. cell

 - cell은 gradient 계산 단위로 보면 된다. 

 - rules of thumb으로, 6x6의 cell이 최적이다.

 

2. gradient(magnitude, orientation) & cell histogram

 - 수직엣지(y축 변화량), 수평엣지(x축변화량)을구한다

 - atan2()를 이용하여 orientation을 계산.  

   => PI ~ PI 이므로, 음수를 +PI 해줘서 0~180으로 만들어준다.

 - 제곱루트를 이용하여 magnitude 계산.

 - cell chistogram을 구한다.

 

3. block

 - cell에서 계산한 값을 이용하여 histogram을 이어붙이는 단계

 - block은 histogram을 이어붙인 단위로 보면 되겠다.

 - rules of thumb에서 3X3사이즈가 최적임

 

4. normalization

 - contrast등에 영향을 받지 않도록, gradient를 magnitude로 나누면 

  크기 1로 정규화된다.

 => 벡터의

    각 절대치의 합 = L-1 norm,  제곱 루트한 것 = L-2 norm이라 한다.

    from http://karmainearth.tistory.com/162

 

5. overlapping block

 - 계산을 overlapp해준다.

 

참고 http://hamait.tistory.com/508

 

 

 

 

 

from http://darkpgmr.tistory.com/116

1. 이미지를 일정 크기로 분할한다.

2. 각 셀마다 gradient계산

 - x( [-1.0.1] ), y([-1,0,1]의 transpose), => x y미분

 - 미분한 것을 arctan()를 이용하여 각도계산.

 - magnitude = sqrt(dx^2+dy^2) 를 이용하여 magnitude 계산

 - quantization(bin)하여 int형 안에서 커버할 수 있게 하자 

3. 계산한 Gradient를 이용하여 분할한 영역마다 histogram을 만든다.

4. 모든 영역을 이어 붙인다.

 

 

참고 http://jangjy.tistory.com/163

 

bin이란 

histogram의 interval을 cell 또는 bin이라 한다.

 

참고 http://www.aistudy.co.kr/math/histogram.htm

 

 

http://web.eecs.umich.edu/~girasole/teaching/451/2014fall/gradprojects/EECS451_project_report_kyuseok_Lee.pdf

 

1. 이미지 일정크기 분할 선택 ex) 8x8 cell 

2. 각 pixel의 gradient와 magnitude를 구한다.

 - 1D 기울기 커널 사용

 - 64개의 gradient가 구해짐

3. histogram bin을 정한다 bin = 9

4. 40도씩 각도를 잘라서 quantize한다.

5. 이 셀(8x8)에 한정하여 histogram을 구한다.

6. 이미지 전체에서 모든셀의 histogram을 구한다.(겹쳐서 하는법 /그냥 8x8로 나눠서하는 법 이있음)

 

 

//gradient histograms

// 탐지윈도우 64X128 pixel

// HOG계산 cell size = 8X8 pixel

// 셀 안의 각 pixel gradient 계산 = 64개

// 64 => 9bin histogram 만들기 : 0~180도, 20도간격

 

//gradient Normalizing

//gradient를 magnitude로 나눠서 크기를 1로 normalize한다.

//이렇게 하면 orientation 영향없이 normalize된다. => float로 하는거 생각해야함

 

//히스토그램 일반화

//histogram도 gradient의 magnitude를 기준으로함.

//이거 역시 normalize 해줘야함.

 

//블럭일반화

//히스토그램마다 normalize하지말고

//cell을 묶어서 block으로 정하고,

// block전체의 histogram을 normalize 하자.

// 4cell = 1block으로 정하기. + 4 cell의 histogram 연결하기.

// 9bin * 4 = 36 bin(?)의 histogram 이 나온다

// 이 histogram을 크기로 나눠서 normalize한다.

// overlap 할 경우 :