HOG(Histogram of Oriented Gradients) 란?
- 영상의 지역적 그래디언트 방향 정보를 특징 벡터로 사용
- 2005년 CVPR학회에서 보행자 검출 방법으로 소개되어 널리 사용되기 시작함
- 이후 다양한 객체 인식에서 활용됨
HOG 알고리즘
전체 영상에서 부분 영상을 추출해서 부분 영상의 특징을 추출하여 전신을 판단하는 알고리즘이다.
작동 순서
- 임의의 크기의 사각형을 정의해서 부분 영상을 추출
- 추출한 부분 영상의 크기를 정규화 (64X128)
- 64X128 영상의 그래디언트를 계산하여 방향 성분과 크기 성분을 파악
- 64X128 영상을 8X8 크기의 셀(cell)로 분할
- 각 셀마다 방향과 크기 성분을 이용하여 방향 히스토그램을 계산
- 각각의 셀에서 방향 성분을 9개로 구분하여 9가지 방향에 대한 히스토그램을 생성
(180도를 20도씩 9가지 방향, 대칭하면 360도)
블록 히스토그램 구하기
8X8 셀 4개를 하나의 블록으로 지정한다.
즉, 블록 하나의 크기는 16X16이며, 8픽셀 단위로 이동한다. (stride = 8) (블록 반칸씩 겹쳐서 이동)
각 블록의 히스토그램 빈(bin) 개수는 4X9 = 36개 이다. (방향 성분 조합 36가지)
특징 벡터의 차원
하나의 부분 영상 패치에서의 특징 백터 크기는 7 X 15 X 36 = 3780이 되며, 여기에 특징 벡터이므로 또 4를 곱하게 된다.
✔︎ HOG 기술자 객체 생성 및 보행자 검출을 위해 학습된 분류기 계수 불러오기 - cv2.HOGDescriptor
cv2.HOGDescriptor() -> <HOGDescriptor object>
retval = cv2.HOGDescriptor_getDefaultPeopleDetector()
- retval : 미리 훈련된 특징 벡터. numpy.ndarray.
shape=(3781, 1). dtype=numpy.float32.
✔︎ SVM 분류기 계수 등록하기 - cv2.HOGDescriptor.setSVMDetector
cv2.HOGDescriptor.setSVMDetector(svmdetector) -> None
- svmdetector: 선형 SVM 분류기를 위한 계수
✔︎ HOG 멀티스케일 객체 검출 함수 - cv2.HOGDescriptor.detectMultiScale
foundLocations, foundWeights = cv2.HOGDescriptor.detectMultiScale(img,
hitThreshold=None,
winStride=None,
padding=None,
scale=None,
finalThreshold=None,
useMeanshiftGrouping=None)
- img : 입력 영상 . cv2.CV_8UC1 또는 cv2.CV_8UC3.
- hitThreshold: 특징 벡터와 SVM 분류 평면까지의 거리에 대한 임계값
- winStride: 셀 윈도우 이동 크기 . (0, 0) 지정 시 셀 크기와 같게 설정
- padding: 패딩 크기
- scale: 검색 윈도우 크기 확대 비율 . 기본값은 1.05.
- finalThreshold : 검출 결정을 위한 임계값
- useMeanshiftGrouping : 겹쳐진 검색 윈도우를 합치는 방법 지정 플래그
- foundLocations (출력) 검출된 사각형 영역 정보
- foundWeights : (출력) 검출된 사각형 영역에 대한 신뢰도
💬 HOG 보행자 검출 예제
import sys
import numpy as np
import cv2
src = cv2.imread('lenna.bmp')
if src is None:
print('Image load failed!')
sys.exit()
classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
if classifier.empty():
print('XML load failed!')
sys.exit()
faces = classifier.detectMultiScale(src)
for (x, y, w, h) in faces:
cv2.rectangle(src, (x, y, w, h), (255, 0, 255), 2)
cv2.imshow('src', src)
cv2.waitKey()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 특징점 검출과 매칭 : 특징점 검출 (0) | 2022.02.05 |
---|---|
[OpenCV with Python] 특징점 검출과 매칭 : 코너 검출 (0) | 2022.02.05 |
[OpenCV with Python] 영상 분할과 객체 검출 : 캐스케이드 분류기 - 얼굴 검출 (0) | 2022.02.05 |
[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭2 - 인쇄체 숫자 인식 (0) | 2022.02.04 |
[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭 1 (0) | 2022.02.04 |