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 검출을 실행해보면 보행자들을 잘 검출하지만
간간히 놓치고 크게 보이는 경우도 있기때문에 후처리 보정을 해줘야 한다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 특징점 검출과 매칭 _ 코너 검출 (0) | 2022.06.19 |
---|---|
[Open CV] 영상 분할과 객체 검출 _ 실전코딩 ( 스노우앱 ) (0) | 2022.06.18 |
[Open CV] 영상 분할과 객체 검출 _ 캐스케이드 분류기 ( 얼굴검출 ) (0) | 2022.06.16 |
[Open CV] 영상 분할과 객체 검출 _ 템플릿매칭 ( 인쇄체 숫자 인식 ) (0) | 2022.06.15 |
[Open CV] 영상 분할과 객체 검출 _ 템플릿 매칭 (0) | 2022.06.14 |