HoG 논문이다. 이 역시 SIFT처럼 학교 강의에서 다룬 바가 있고, SIFT보다 페이지 수도 확연히 적어서 읽기 수월했다.(그렇다고 완벽히 이해했단 건 아니지만)
아래 포스트를 먼저 읽으면 이해에 도움이 될 것 같다.
앞서 다룬 SIFT처럼 HoG 또한 object detection을 위해 이용되는 descriptor다. 이 논문에서는 주로 인간, 그것도 보행자(pedestrian)를 탐지하기 위한 descriptor로써 사용된다.
HoG는 그렇게 특별한 개념이 아니다. SIFT에서도 이미 비슷한 접근을 사용했는데, 이미지에서 gradient 분포를 histogram으로 표현하는 것이다. 논문에서는 0도에서 180도까지를 9개로, 즉 20도 간격으로 나누어 9개의 bin을 만들어 해당 각도에 속하는 gradient의 크기를 합해 descriptor 벡터를 만들었다.
HoG의 순서를 좀 더 따져보면
1. Gamma/Colour Normalization
2. Gradient Computation
3. Spatial / Orientation Binning
4. Normalization and Descriptor Blocks
5. Detector Window and Context
6. Classifier (SVM)
이 된다.
Gamma/Colour Normalization은 일종의 전처리로써 픽셀 밝기를 조정하는 것이다. 논문에 따르면 이 단계는 그닥 효과가 뛰어나진 않는 것 같은데, 이후의 descriptor normalization 과정에서 비슷한 역할을 하기 때문이라고 논문에서는 추측한다.
Gradient computation은 말 그대로 픽셀 gradient를 계산하는 것이다. 논문에서는 Gaussian smoothing을 먼저 하고 그 다음 여러 필터를 사용해서 계산을 해보는데, 그중 간단한 1 dimension [−1, 0, 1] masks at σ=0가 가장 뛰어난 성능을 보인다고 한다. 오히려 큰 필터일수록 성능이 저하됐다고 한다.
Spatial / Orientation Binning 단계에서는 각 gradient 방향을 토대로 bin에 'vote'를 한다. SIFT에서는 0-360도(signed)를 범위로 삼고 HoG도 그렇게 해도 되긴 하지만 이 논문에서는 pedestrian을 대상으로 하기 때문에 0-180도(unsigned)를 범위로 잡아 performance를 높였다. car, motorbike등 다른 object를 감지할 때는 sign information이 더 도움이 될 수도 있다고 한다. 아무튼 vote는 cell을 단위로 시행되는데, 논문에서는 8x8 pixel을 하나의 cell로 잡았다. 각 cell의 gradient의 크기를 해당하는 bin에 더해서 합산하는 것이 vote다. 이때gradient 크기를 square하거나 square root할 수도 있지만 그냥 그대로 더하는 것이(itself) 더 성능이 좋다고 한다. 논문에서는 이렇게 cell마다 (9개의 bin을 가진) 하나의 histogram을 만들어 준다.
Normalization and Descriptor Blocks에선 앞서 합산한 historgram을 block 단위로 normalization해준다. block은 cell을 여러개 묶은 단위인데, 직사각형 모양(R-HOG)으로 묶을 수도 있고 원형(C-HOG)으로 묶을 수도 있다. 일단 R-HOG기준으로 설명하자면 block은 16x16 pixel, 즉 2x2의 cell로 이루어진다. normalization을 하는 이유는 사진의 위치마다 빛의 밝기나 foreground-background contrast로 인해 gradient 크기가 제각각일 수 있기 때문에 보정을 해주는 것이다. normalization 방법으로는 4가지를 제안하는데 이는 앞서 소개한 포스트의 사진을 도용하겠다(...)
L1 norm의 성능은 좀 뒤떨어지고 나머지 셋의 성능은 비슷하게 좋다고 한다. 분모에 엡실론을 더하는 이유는 분모가 0이 되는 것을 방지하기 위함이다.
논문에서는 block normalization 대신 Centre-surround normalization의 효과도 조사해본다. 그러나 (아마 'no longer any overlapping blocks so each cell is coded only once in the final descriptor' 라는 이유 때문에) block normalization보다 효과는 좋지 못했다. cell 하나가 여러개의 (논문의 parameter에 따르면 4개의) block에서 계산되기 때문에 block normalization이 일종의 surrounding informaiton을 내포해서 성능이 좋다는 것 같다.
Detector Window and Context에서는 Window 내의 HoG를 모두 모아 descriptor을 만든다. 논문에서는 64×128 pixel을 window로 이용한다.
마지막으로 Classifier단계에서는 SVM을 이용해 descriptor을 classify한다. 논문에서는 SVMLIGHT라는 linear SVM을 사용했다.
gradient의 분포를 지표로 사용하려는 시도는 이전의 descriptor들도(SIFT라던가) 이용한 것 같지만 이 논문의 의의라면
반대로 논문을 읽으면서 한계와 의문점도 여럿 생각이 났는데