Python/파이썬 OpenCV 공부

[파이썬 OpenCV] HOG 알고리즘을 이용해서 사람 검출하기 - cv2.HOGDescriptor

AI 꿈나무 2020. 10. 13. 23:43
반응형

1. HOG - Histogram of Oriented Gradients

 영상의 지역적 그래디언트 방향 정보를 히스토그램으로 표현해서 영상의 형태를 표현하는 방법입니다.

 HOG와 SVM 머신러닝을 결합하여 정형화된 객체를 검출하는 알고리즘입니다.

 

 

2. HOG 알고리즘

 전체 영상에서 부분 영상을 추출해서 부분 영상의 특징을 추출하여 전신을 판단하는 알고리즘입니다.

작동 순서

(1) 임의의 크기의 사각형을 정의해서 부분 영상을 추출합니다.

(2) 추출한 부분 영상의 크기를 정규화 합니다. (64X128)

 

 

(3) 64X128 영상의 그래디언트를 계산하여 방향 성분과 크기 성분을 파악합니다.

(4) 64X128 영상을 8X8 크기의 셀(cell)로 분할합니다.

 

 

(5) 각 셀마다 방향과 크기 성분을 이용하여 방향 히스토그램을 계산합니다.

(6) 각각의 셀에서 방향 성분을 9개로 구분하여 9가지 방향에 대한 히스토그램을 생성합니다. (180도를 20도씩 9가지 방향, 대칭하면 360도)

 

 

블록 히스토그램 구하기

 8X8 셀 4개를 하나의 블록으로 지정합니다.

 

 

 즉, 블록 하나의 크기는 16X16입니다.

 8픽셀 단위로 이동합니다. (stride = 8) (블록 반칸씩 겹쳐서 이동)

 각 블록의 히스토그램 빈(bin) 개수는 4X9 = 36개 입니다. (방향 성분 조합 36가지)

 

 하나의 부분 영상 패치에서의 특징 백터 크기는 7 X 15 X 36 = 3780이 됩니다.

 여기에 특징 벡터이므로 또 4를 곱하게 됩니다.

 용량이 엄청나지만 지금도 많이 사용하는 방법입니다.

 

 

3. OpenCV에서 HOG 보행자 검출 알고리즘 사용하기

(1) HOG 기술자 객체 생성 및 보행자 검출을 위해 학습된 분류기 계수 불러오기 - cv2.HOGDescriptor

 

 미리 학습된 데이터가 OpenCV 내부에 저장되어 있습니다.

 호그 보행자 검출은 캐스케이드분류기와 달리 따로 xml파일을 만들지 않고

cv2.HOGDesciptor_getDefaultPeopleDetector 함수로 미리 훈련된 특징 벡터를 가져옵니다.

 

cv2.HOGDescriptor()  ->  <HOGDescriptor object>

cv2.HOGDescriptor_getDefaultPeopleDetector() -> retval

• retval : 미리 훈련된 특징 벡터. numpy.ndarray. shape=(3781, 1). dtype=numpy.float32.

(2) SVM 분류기 계수 등록하기 - cv2.HOGDescriptor.setSVMDetector

 

cv2.HOGDescriptor.setSVMDetector(svmdetector) -> None

• svmdetector: 선형 SVM 분류기를 위한 계수

(3) HOG 멀티스케일 객체 검출 함수 - cv2.HOGDescriptor.detectMultiScale

 

 입력 영상을 조금씩 축소하면서 다양한 크기에 대해서 검출을 합니다.

 scale 값을 변경해서 속도를 향상시킬 수 있습니다.

 출력값은 foundlocations 사각형 영역 정보입니다.

 

cv2.HOGDescriptor.detectMultiScale(img, hitThreshold=None, winStride=None, padding=None, scale=None, finalThreshold=None, useMeanshiftGrouping=None) -> foundLocations, foundWeights

• img: 입력 영상. cv2.CV_8UC1 또는 cv2.CV_8UC3.

• hitThreshold: 특징 벡터와 SVM 분류 평면까지의 거리에 대한 임계값

• winStride: 셀 윈도우 이동 크기. (0, 0) 지정 시 셀 크기와 같게 설정.

• padding: 패딩 크기

• scale: 검색 윈도우 크기 확대 비율. 기본값은 1.05.

• finalThreshold: 검출 결정을 위한 임계값

• useMeanshiftGrouping: 겹쳐진 검색 윈도우를 합치는 방법 지정 플래그

• foundLocations: (출력) 검출된 사각형 영역 정보

• foundWeights: (출력) 검출된 사각형 영역에 대한 신뢰도

4. HOG 보행자 검출 예제

예제 코드 출처 :  황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/

 

# 동영상 불러오기
cap = cv2.VideoCapture('vtest.avi')

if not cap.isOpened():
    print('Video open failed!')
    sys.exit()
    
# 보행자 검출을 위한 HOG 기술자 설정
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

while True:
    ret, frame = cap.read()
    
    if not ret:
        break
        
    # 매 프레임마다 보행자 검출
    detected, _ = hog.detectMultiScale(frame) # 사각형 정보를 받아옴
    
    # 검출 결과 화면 표시
    for (x, y, w, h) in detected:
        c = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        cv2.rectangle(frame, (x, y, w, h), c, 3)
        
    cv2.imshow('frame', frame)
    if cv2.waitKey(10) == 27:
        break

cv2.destroyAllWindows()

 

HOG 보행자 검출

 

 보행자가 아닌 것도 보행자로 검출하는 경우가 있기 때문에 후처리가 필요합니다.

 


OpenCV 튜토리얼과 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

반응형