Program/OPEN_CV

[Open CV] 영상 분할과 객체 검출 _ HOG 보행자 검출

사막여유 2022. 6. 17. 08:14
728x90

2022.06.17 금일은 HOG 보행자 검출에  관한 강의였다.

 

 

HOG ( Histogram of Oriented Gradients ) 란?

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

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

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

 - HOG 특징벡터 추출 방법에다 SVM 머신러닝 알고리즘을 결합해서 사용했을 때 보행자 검출이 잘됨.

 

 

* 전체 영상에서 부분 영상을 추출하여 그 부분영상에서 특징을 추출해서

그 부분 영상이 사람이 몸인지를 판단하는 알고리즘으로 동작

 * 분할된 Cell 내부에서 전체 360도 방향에서 20도씩 9방향으로 나눈 뒤 히스토그램 계산

 

그런데 실제 8x8 크기의 셀로 분할하여 그냥 사용하게 되면

사람이 조금 shift 되면 방향 히스토그램의 변화가 생길 수 있다.

어떤 셀에 들어가는지 안들어가는지에 따라서 히스토그램의 정보가 급격히 변할 수 있기때문에

이런 부분을 방지하고자 블록 히스토그램을 구한다.

 

블록 히스토그램 구하기

 - 8x8 셀 4개를 하나의 블록으로 지정
   * 즉, 블록 하나의 크기는 16 x16
   * 8 픽셀 단위로 이동 : stride = 8
   * 각 블록의 히스토그램 빈(bin) 개수 ( 방향벡터 ) 는 4x9=36개

 

 

8픽셀 단위로 이동하기때문에 블록이 반절(8픽셀)정도 겹쳐지면서 이동한다.

따라서 해당 사진을 보게되면 가로방향의 셀은 8개이지만
블럭은 7개 ( 겹쳐지면서 이동하기때문 )
세로방향의 셀은 16개이지만 블럭은 15개이다.따라서 특징 벡터의 크기는7 x 15 x 36 ( bin 개수 ) = 3780 

그런데 각각의 특징 벡터가 실수이기때문에 x4 를해주게되면

15120 byte 를 사용한다.

조금 과한 부분이 있지만 어떤 객체의 모양이 미세하게 변하더라도 풀바디를

잘 잡아내기 때문에 지금까지도 많이 사용되고 있는 방법 중 하나이다.

 

 

실제로 위 알고리즘을 OpenCV에서 어떻게 사용하는지 코드 작성방법에 대해 설명한다.

HOG 기술자 객체 생성 및 보행자 검출을 위해 학습된 분류기 계수 불러오기

cv2.HOGDescriptor() -> <object>

cv2.HOGDescriptor_getDefaultPeopleDetector() -> retval

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

 

SVM 분류기 계수 등록하기

cv2.HOGDescriptor.setSVMDetector( svmdetector ) -> None

 - 아래와같은 사진들을 모두 잘라낸 뒤 해당 사진이 Positive 인지 Negative 인지를 구분한 알고리즘
   ( Positive : 중앙에 사람이 서있는 영상 , Negative : Positive 가 아닌 모든 영상
     머신러닝을 사용하기 때문에 영상 수만장을 사용하여 알고리즘을 생성하였음)

 - 얼굴 검출 같은 경우는 외부 xml 파일을 이용하여 분류하였지만 HOG 검출의 경우는 
    SVM 계수가 OpenCV에 이미 들어가있기 때문에 외부 xml파일을 사용하지 않음

 


HOG 멀티스케일 객체 검출 함수

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

img : 입력영상. cv2.CV8UC1 또는 cv2.CV_8UC3.

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

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

padding : 패딩 크기

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

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

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

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

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


 

위 나와있는 대부분의 값들은 기본값들로 쓰면 되고 

속도 향상을 위해서 scale만 조절해주는 방식으로 사용하면 된다.

 

 

코드를 보게되면 위에서 설명했던 부분들이 모두 나온다.

일단 동영상을 불러온 뒤 보행자 검출을 위한 HOG 기술자를 설정해준다.
( SVM 분류기 불러오기 )

 

위와같이 실제 영상에 HOG 검출을 실행해보면 보행자들을 잘 검출하지만

간간히 놓치고 크게 보이는 경우도 있기때문에 후처리 보정을 해줘야 한다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90