0. Hog란?
HOG는 사람, 특히 보행자를 검출(object tracking)하는데 사용되는 특징이다. 지역적 gradient를 이용하여 영상의 특징으로 이용한다.
다음은 HOG의 절차이다.
각 절차를 따라가면서 왜, 어떻게, 어떤것을 하는지를 트래킹 하고자 한다.
1. Normalize gamma & colour
우선 감마를 보정한다. 여기서 감마 값을 조정하는 것은 밝기(혹은 휘도)를 조절하는 기능으로, 픽셀 값을 비선형 적으로 보정한다. 다음과 같은 수식을 통해서 적용할 수 있다.
더 밝은 이미지를 가질 수 있다는데 효과는 미미하다고 한다.
2. Compute gradients
픽셀의 gradient를 구한다. 이 방법에 대해서는 다양한 것이 있다. 이전 SIFT에서 가우시안 필터를 이용한 미분 구하는 방식과는 다르게 HOG에서는 실제 미분의 정의를 이용한 방식을 사용할 수 있다. Sobel, Robert등 다양한 방법을 사용할 수 있겠지만, 실험적으로 가장 간단한 1D Kernel([-1, 0, 1]커널)을 사용하는 좋았다고 한다.
이와 같은 커널을 적용시켜, x와 y의 변화량에 대해서 구한다. 이렇게 얻은 변화량을 바탕으로 dy/dx값을 구하고 tan^-1 즉, arctangent를 거치면 gradient의 방향이 나오게 된다. 여기서 arctangent를 사용하는 이유는 sin과 cos는 대각의 값을 구해야 하고 그 과정에서 루트와 같은 비싼 연산이 등장하기 때문이라고 한다.
다음과 같은 방법으로 모든 픽셀에 대하여 gradient의 방향을 구할 수 있다. 다음은 그 결과이다.
두 방향에 대하여 변화량이 큰 값이 도드라 져서 윤곽선이 강조됨을 확인할 수 있다.
3. Weighted vote into spatial & orientation cells
나타난 gradient를 이제 병합할 차례이다. 우선 이미지를 8x8크기의 셀로 나눈다. 이렇게 셀로 나누어 표현하는 이유로는 표현이 컴팩트 해지고, 잡음에 강해지기 때문이다. 여기서 셀의 크기가 다른 크기로 설정될 수 있지만, 8x8 크기의 셀이 얼굴, 다리 등 사람의 특성을 충분히 표현할 수 있다고 판단했기 때문이다. (아래 그림의 얼굴을 포함하는 셀을 보자.) 다음은 셀을 나누고, 하나의 셀에 대한 gradient의 값과 방향을 표현한 이미지이다.
이 gradient를 각도의 범위 별로 나누어 경향성을 histogram에 vote할 것이다. 각도의 범위는 0~180으로 20도씩 나누는 것이 실험적으로 좋다고 하는데, 일반적으로 각도의 범위는 360도이지만, 180도와 360도는 같은 직선 내에 있기 때문에 0~360이 아닌 -180~180으로 보고 절대값을 취한 범위만 이용하면 되기 때문이다. 다음은 vote 과정이다.
여기서 각도가 10인 부분은 어디에 vote해야 하는지를 살펴봐야 한다. 10의 경우 0과 20 사이에 속한 각도이므로, (10-0) / 20 = ½ & (20-10)/20 = ½ 와 같이 vote 비율을 계산하여 적용한다. 이를 거치면 다음과 같은 결과가 나오게 된다.
4. Contrast normalize over overlapping spatial blocks
gradient는 조명에 민감하다. 만약에 값이 조금만 바뀌더라도 히스토 그램의 경향성이 급변하기 때문에 조명에 invariant하게 해주기 위해 Contrast Normalize를 한다.(히스토그램을 정규화 시켜준다.)
모두 제곱하고 더하여 루트하는 L2 Norm을 사용하는데, 이는 아무리 같은 배수로 모든 값이 변화하더라도 L2 Norm이 유지되는 특성 때문에 조명에 민감한 특성을 부여할 수 있기 때문이다.
8x8크기의 셀을 2x2개씩 이어붙여 (4x9x1개의) 히스토그램을 정규화 한다.
// 근데 왜 2x2크기지? 더 크게 하면 안될까?
5. Collect HOG’s over detection window
detection window에 대해서 HOG를 얻는다. 다음 예시에서는 (36크기의 히스토그램) x (가로 7개 x 세로 105개) = 3780차원 벡터를 얻는다.
결과적으로 사람의 몸통의 방향에 맞게 HOG가 모아짐을 확인할 수 있다.
6. Linear SVM
이렇게 묶은 벡터, 즉 특징을 바탕으로 분류기를 실행한다.
7. 코드 구현
특징이 잘 추출 되었음을 확인할 수 있다.
마음같아서는 SVM을 활용한 비교까지 하고싶지만 데이터가 너무 없다...ㅠㅠ
gradient를 이용하여 특징을 추출하는 방향에서 히스토그램으로 나타내어 경향성을 나타낸다는 점에서 이전에 알아봤던 SIFT와 꽤 유사하다고 생각했다.
https://do-my-best.tistory.com/77
이와 유사한 방식이 좋은 feature가 추출하나보다.
'ML' 카테고리의 다른 글
SOLOv2 Structured pruning (MMDetection, pytorch structured pruning) (1) | 2021.08.07 |
---|---|
Network pruning (0) | 2021.07.27 |
SIFT (Scale-Invariant-Feature TRansform)를 활용한 이미지 특징 추출 및 매칭 알고리즘 (1) | 2021.07.20 |
SOLOv2 논문 리뷰 (0) | 2021.07.18 |
SOLOv1 논문 리뷰 (0) | 2021.07.16 |