Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 캐스케이드 분류기를 이용해서 정면 얼굴 검출하기 - cv2.CascadeClassifier, detectMultiScale, Haar-like features

AI 꿈나무 2020. 10. 13. 22:57
반응형

1. 캐스케이드 분류기

 캐스케이드는 직렬로 연결되어 있다는 것을 의미합니다.

 얼굴 검출 용도로 많이 쓰이며 눈, 보행자, 자동차 번호판까지 검출 가능합니다.

 

2. Viola - Jones 얼굴 검출기

 머신러닝을 이용한 방식입니다.

 Positive 영상(얼굴 영상)과 negative 영상(얼굴 아닌 영상)을 훈련하여 빠르고 정확하게 얼굴 영역을 검출합니다.

 

 기존 방법과의 차별점은 다음과 같습니다.

 

(1) AdaBoost에 기반하여 강한 분류 성능을 갖습니다. (간단한 형태의 분류기를 여러개 모아서 강한 형태의 분류기를 만듭니다.)

(2) 유사 하르(haar-like) 특징을 사용합니다.

(3) 캐스케이드(cascade) 방식을 통한 빠른 동작 속도를 갖습니다.

 

 기존 얼굴 검출 방법보다 약 15배 빠르게 동작합니다.

 

3. 유사 하르 특징 - Haar-like features

 검정색과 흰색으로 구성된 사각형 형태의 필터 마스크를 이용하여 입력 영상을 필터링합니다.

 흰색 사각형 영역 픽셀 값의 합에서 검정색 사각형 영역 픽셀 값을 뺀 결과 값을 추출합니다.

 

 

 

 대부분 눈쪽은 어둡고 눈 아래쪽은 밝게 나오는 것이 일반적입니다.

 눈 사이는 밝게 나오고 눈부분은 어둡게 나옵니다.

 이러한 음영의 특징을 자동으로 모아서 캐스케이드 분류기가 작동하게 됩니다.  

 

4. 캐스케이드 분류기 - Cascade classifier

 중요한 특징을 모우는 것은 AdaBoost를 이용합니다.

 음영 특징 6000개 정도를 모아서 취합을 합니다.

 6000개 특징이 얼굴과 부합하는지 확인하기 위해 6000장을 부분 영상 하나하나에 테스트를 해야하지만 이는 시간이 너무 오래걸립니다.

 

 따라서 단계별로 테스트를 해서 얼굴 특징이 아닌 것을 걸러내는 방법을 이용합니다.

 

 

 한단계 한단계 나아가는 것을 캐스케이드 분류기라고 합니다.

 다단계 형태로 추출합니다.

 

캐스케이드 분류기 얼굴 검출 과정 시각화

출처 : https://www.youtube.com/watch?v=hPCTwxF0qf4

 

 얼굴을 검출할 때 마킹을 합니다.

 박스가 얼굴을 지나갈 때 얼굴 딱 하나만 검출하는 것이 아니라 얼구 좌 우 위 아래 1~2픽셀 정도 떨어진 곳도 마킹을 하게 됩니다.

 이 알고리즘은 얼굴 근방에 박스가 3개 이상 되어야지 얼굴로 판단합니다.

 

 얼굴의 크기가 다양하게 나타날 수 있기 때문에 박스의 크기를 키워가면서 검출을 여러번 합니다.

 

 박스가 커지면 시간이 오래 걸릴 수 있는데 시간 단축 방법 논문이 발표되었습니다.

 적분 영상을 만들어서 흰색과 검정색 사각형 부분에 픽셀 값의 합과 차를 빠르게 계산하는 방법입니다.

 

5. 캐스케이드 분류기 함수 - cv2.CascadeClassifier, detectMultiScale

 사전에 학습된 데이터를 불러오고 그 데이터를 이용하여 객체를 검출하게 됩니다.

 

(1) 객체 생성 및 학습 데이터 불러오기 함수 - cv2.CascadeClassifier 

 이 함수는 미리 학습되어 있는 정보를 불러와서 내가 찾고자 하는 객체를 검출하는 기능을 제공합니다.

 filename으로 저장된 객체의 특징을 담고 있는 파일을 불러올 수 있습니다.

 

cv2.CascadeClassifier( ) -> <CascadeClassifier object>
cv2.CascadeClassifier(filename) -> <CascadeClassifier object> 
# filename을 지정했으면 .load를 안해도 됩니다.

cv2.CascadeClassifier.load(filename) -> retval

• filename: XML 파일 이름

• retval: 성공하면 True, 실패하면 False

 OpenCV 깃허브 사이트에서 캐스케이드 학습되어진 특징 자료를 다운받을 수 있습니다.

 얼굴검출함수를 4가지 지원하는데 하나하나 테스트 해보고 잘 되는 것을 이용하면 됩니다.

 보통 alt2가 잘 되는 것으로 알려져 있습니다.

 

미리 학습된 XML 파일 다운로드 github

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

 

 

(2) 멀티스케일 객체 검출 함수 - cv2.CascadeClassifier.detectMultiScale

 detectmultiscale 함수로 특정 영상에서 내가 찾고자 하는 객체를 검출할 수 있습니다.

 입력 영상에서 멀티 스케일을 구성해서 내가 찾고자 하는 객체를 찾게 해줍니다.

 입력 영상 하나만 지정해도 동작합니다. 나머지는 디폴트 값으로 지정되어 있습니다.

 나머지 인자를 지정하면 빠르게 연산이 가능합니다.

 

cv2.CascadeClassifier.detectMultiScale(image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None) -> result

• image: 입력 영상 (cv2.CV_8U)

• scaleFactor: 영상 축소 비율. 기본값은 1.1.

• minNeighbors: 얼마나 많은 이웃 사각형이 검출되어야 최종 검출 영역으로 설정할지를 지정. 기본값은 3.

• flags: (현재) 사용되지 않음

• minSize: 최소 객체 크기. (w, h) 튜플.

• maxSize: 최대 객체 크기. (w, h) 튜플.

• result: 검출된 객체의 사각형 정보(x, y, w, h)를 담은 numpy.ndarray. shape=(N, 4). dtype=numpy.int32.

scale factor

 박스를 조금조금씩 키워주면서 연산합니다.

 기본값이 아닌 1.2배로 하면 속도가 훨씬 빨라집니다.

 하지만 특정 크기 얼굴을 검출 못할 가능성이 있습니다.

 

minsize, maxsize

 이 인자를 지정하면 속도가 훨씬 빠르게 작동합니다.

 

6. 캐스케이드 분류기를 이용해서 정면 얼굴 검출 예제

예제 코드 출처 :  황선규 박사님 github홈페이지

 

『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

예제 소스 코드는 아래 링크를 참고하세요

sunkyoo.github.io

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) # 스케일팩터를 1.2로 지정해도 잘 작동함 더 빨라짐

# 각각의 행마다 (x,y,w,h) 받아와서 사각형을 그리는 코드
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()

 

 

 캐스케이드 분류기를 이용해서 얼굴 검출하는 것을 추천하지 않습니다.

 얼굴이 가려지면 검출을 잘 못하기 때문입니다.

 

 딥러닝 기반 얼굴 검출을 사용하는 것이 더 정확도가 노습니다.

 싱글샷 디텍터(SSD, YOLO) 라고 하는 얼굴 검출 방법이 더 정확하고 검출 속도도 빠릅니다.


OpenCV 튜토리얼과 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

OpenCV 튜토리얼 출처 : docs.opencv.org/4.3.0/db/d28/tutorial_cascade_classifier.html

 

OpenCV: Cascade Classifier

Goal In this tutorial, We will learn how the Haar cascade object detection works. We will see the basics of face detection and eye detection using the Haar Feature-based Cascade Classifiers We will use the cv::CascadeClassifier class to detect objects in a

docs.opencv.org

반응형