본문 바로가기
OpenCV/OpenCV-Chapter

CH08 OpenCV-Python HOG 보행자 검출

by kiimy 2021. 12. 24.
728x90
728x90

HOG(Histogram of Oriented Gradients)란?

• 영상의 지역적 그래디언트 방향 정보를 특징 벡터로 사용

• 2005년 CVPR 학회에서 보행자 검출 방법으로 소개되어 널리 사용되기 시작함

• 이후 다양한 객체 인식에서 활용됨

HOG는 edge 정보를 이용하고, Haar, LBP는 영역과 영역의 밝기차를 이용

HOG 알고리즘

1. 부분영상 추출

2. 크기 정규화

3. Gradient 계산(방향과 크기를 알 수 있다)

4. 8*8 크기의 셀(cell)분할(한 cell당)

5. 방향 히스토그램의 bin 개수 = 9

==> 360도를 9개 구간으로 나눴다

[블록 히스토그램 구하기]

• 8x8 셀 4개를 하나의 블록을 지정

→ 즉, 블록 하나의 크기는16x16

→ 8픽셀 단위로 이동: stride = 8

→ 각 블록의 히스토그램 빈(bin) 개수는 4x9=36개

[특징 벡터의 차원]

하나의 부분 영상 패치에서의 특징 벡터 크기

(stride= 8, (세로-1) * (가로-1) * histogram bin)

→ 7 x 15 x 36 = 3780

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

if not cap.isOpened():
    print(('video open failed'))
    sys.exit()

# 보행자 검출을 위한 HOG 기술자 설정
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
'''
cv2.HOGDescriptor_getDefaultPeopleDetector()
# retval : 미리 훈련된 특징 벡터. numpy.ndarray. shape=(3781, 1)
'''

while True:
    ret, frame = cap.read()

    if not ret:
        break

    # 매 프레임마다 보행자 검출
    detected, _ = hog.detectMultiScale(frame)
    '''
    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
    # 영역, 신뢰도
    '''

    # 검출 결과 bbox 생성
    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, 2, cv2.LINE_AA)

    cv2.imshow('frame', frame)
    if cv2.waitKey(10) == ord('q'):
        break

728x90

댓글