캐스케이드 분류기란?
캐스케이드는 직렬로 연결되어 있다는 것을 의미한다. 얼굴 검출 용도로 많이 쓰이며 눈, 보행자, 자동차 번호판까지 검출 가능하다.
Viola – Jones 얼굴 검출기
수 천개의 얼굴 영상(Positive)과 얼굴이 아닌 영상(Negative)을 훈련하여 분류 모델을 구현하고 해당 모델을 이용해서 입력 영상 속 얼굴을 검출하는 방식
- AdaBoost에 기반하여 강한 분류 성능을 갖고있다. (간단한 형태의 분류기를 여러개 모아서 강한 형태의 분류기를 만듦)
- 유사 하르(haar-like) 특징을 사용
- 캐스케이드(cascade) 방식을 통한 빠른 동작 속도를 갖고있다.
- 기존 얼굴 검출 방법보다 약 15배 빠르게 동작
유사 하르 특징 Haar-like features
- 사각형 형태의 필터 집합을 사용
- 흰색 사각형 영역 픽셀 값의 합에서 검정색 사각형 영역 픽셀 값을 뺀 결과 값을 추출
- 최종적으로 + 값인지 - 값인지를 기준으로 얼굴의 특징이 있는지 판단
- 사람의 눈쪽은 눈썹과 눈동자 등으로 인해 어둡고, 그 아래 콧등 부분은 밝게 표시되는 특징들을 추출
캐스케이드 분류기(Cascade classifier)
- 특징을 모으는 작업은 에이다 부수트 알고리즘으로인해 수행되며 평균적으로 6000개의 특징을 추출하는데, 모두 비교하기에는 비효율적
- 또한 영상 파일에서 보통 얼굴이 한 두개 있을 뿐 나머지 부분은 얼굴이 아닌 non-face 영역
- non-face인 영역을 빠르게 skip 하도록 다단계 (cascade) 검사 수행
✔︎ cv2.CascadeClassifier 객체 생성 및 학습 데이터 불러오기
cv2.CascadeClassifier( ) -> <CascadeClassifier object>
cv2.CascadeClassifier(filename) -> <CascadeClassifier object>
retval = cv2.CascadeClassifier.load(filename)
- filename - 얼굴을 검출하도록 특징을 지정해논 파일이며 미리 학습된 모델
- 객체를 생성할 때 생성자를 이용해서 filename 값으로 XML 파일을 지정
- 또는 객체 생성 후 load 함수를 이용하여 학습된 모델 데이터 (XML) 삽입
미리 학습된 XML 파일
- OpenCV 깃허브 사이트에서 다운로드 가능 OpenCV github
GitHub - opencv/opencv: Open Source Computer Vision Library
Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.
github.com
✔︎ 멀티스케일 객체 검출 함수 - cv2.CascadeClassifier.detectMultiScale
result = cv2.CascadeClassifier.detectMultiScale(image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
- image - 입력영상
- scaleFactor - 영상 축소 비율 (기본값 1.1.)
박스를 조금씩 키워주면서 연산한다. 기본값이 아닌 1.2배로 하면 속도가 훨씬 빨라지지만 특정 크기 얼굴을 검출 못할 가능성이 있다. - minNeighbors - 얼마나 많은 이웃 사각형이 검출되어야 최종 검출 영역으로 설정할지를 지정 (기본값 3)
- flags - (현재)사용되지않음
- minSize - 최소 객체 크기(w, h)
- maxSize - 최대객체크기(w,h)
- result - 검출된 객체의 사각형 정보(x, y, w, h)를 담은 numpy.ndarray. shape=(N, 4)
💬 캐스케이드 분류기를 이용해서 정면 얼굴 검출 예제
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] 영상 분할과 객체 검출 : HOG 알고리즘 - 보행자 검출 (0) | 2022.02.05 |
[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭2 - 인쇄체 숫자 인식 (0) | 2022.02.04 |
[OpenCV with Python] 영상 분할과 객체 검출 : 템플릿 매칭 1 (0) | 2022.02.04 |
[OpenCV with Python] 영상 분할과 객체 검출 : 모멘트 기반 객체 검출 (0) | 2022.02.04 |