Computer Vision/opencv(python)

[52] 5)캐스케이드 분류기: 얼굴 검출

jwjwvison 2021. 3. 24. 11:31
  • Viola - Jones 얼굴 검출기
    • Positive영상 (얼굴 영상)과 negative 영상(얼굴 아닌 영상)을 훈련하여 빠르고 정확하게 얼굴 영역을 검
    • 기존 방법과의 차별점
      • 유사 하르(Haar-like) 특징을 사용
      • AdaBoost에 기반한 강한 분류 성능
      • 캐스케이드(cascade) 방식을 통한 빠른 동작 속도
    • 기존 얼굴 검출 방법보다 약 15배 빠르게 동작

 

  • 유사 하르 특징 (Haar-like features)
    • 사각형 형태의 필터 집합을 사용
    • 흰색 사각형 영역 픽셀 갑스이 합에서 검정색 사각형 영역 픽셀 값을 뺀 결과 값을 추출

 

  • 캐스케이드 분류기(Cascade classfier)
    • 일반적인 영상에는 얼굴이 한 두개 있을 뿐, 나머지 영역은 대부분 non-face영역
    • Non-face 영역을 빠르게 skip하도록 다단계 검사 수행

 

github.com/opencv/opencv/tree/master/data/haarcascades

 

opencv/opencv

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

 

  • CascadeClassifier 멀티스케일 객체 검출 함수
cv2.CascadeClassfier.detectMultiScale(image,scaleFactor=None,minNeighbors=None,flags=None,
                                   minSize=None,maxSize=None) -> result

 • image: 입력 영상 (cv2.CV_8U)
 • scaleFactor : 영상 축소 비율 . 기본값은 1.1. 

   --> 내부에서 검출하는 사각형의 크기를 몇배씩 키워줄것인지... 1.2로 변경하면 키우는것을 좀더 듬성듬성하게 키우는 것이다
 • minNeighbors : 얼마나 많은 이웃 사각형이 검출되어야 최종 검출 영역으로 설정할지를 지정 . 기본값은 3.
 • flags: (현재) 사용되지 않음
 • minSize : 최소 객체 크기 . (w, h) 튜플
 • maxSize : 최대 객체 크기 . (w, h) 튜플
 • result: 검출된 객체의 사각형 정보 (x, y, w,h) 를 담은 numpy.ndarray .shape=(N,4).dtype=numpy.int32

 

  • 정면 얼굴 검출 예제
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,scaleFactor=1.2,minSize=(100,100))

for (x,y,w,h) in faces:
    cv2.rectangle(src,(x,y,),(x+w,y+h),(255,0,255),2)

cv2.imshow('src',src)
cv2.waitKey()
cv2.destroyAllWindows()