📌 Intro
이번에는 OpenCV의 얼굴 검출 기능에 대해 정리할 것이다. 이 기능은 비올라와 존스라는 사람이 발표한 부스팅기반의 캐스케이드 분류기 알고리즘을 기반으로 만들어졌다. 이 알고리즘은 특히 얼굴 검출에 적용될 때 속도와 정확도가 좋다고 알려져있다.
📌 유사 하르 필터(Haar-like Filter)
먼저 알아야 할 정보로 유사 하르 필터가 있다. 유사 하르 필터란 흑백 사각형이 서로 붙어 있는 형태로 구성된 필터다. 유사 하르 필터 형태에서 흰색 영역 픽셀 값은 모두 더하고, 검은색 영역 픽셀 값은 모두 빼서 하나의 특징 값을 얻을 수 있다. 사람의 정면 얼굴 형태가 전형적으로 밝은 영역(이마, 미간, 볼 등)과 어두운 영역(눈썹, 입술 등)이 정해져 있기 때문에 유사 하르 필터로 구한 특징 값은 얼굴을 판별하는 용도로 사용할 수 있게 되는 것이다.
아래 그림은 유사 하르 필터의 예시다.
이 유사 하르 필터를 통해 얼굴 검출을 진행하는데 이 과정이 조금 흥미롭다. 보통 Object Detection에서는 객체가 있을만한 위치를 찾고, 객체가 있는지를 판별하지만 비올라-존스 알고리즘은 유사 하르 필터를 사용하여 얼굴이 아니라고 판단되면 이후 유사 하르 필터 계산을 진행하지 않는 방식이다. 즉, 얼굴이 아닌 곳을 지워나가면서 얼굴을 찾는 방식인 것이다.
앞서 설명한 것 처럼 몇 단계를 걸쳐 유사 하르 필터를 적용한 뒤 얼굴이 아닌 것들을 모두 골라내면 남은 것은 얼굴이 된다. 이렇게 여러 단계를 거치기 때문에 cascade 분류기라고 불린다.
📌 캐스케이드 분류기(Cascade Classifier)
캐스케이드 분류기는 Object Detection이 가능한 OpenCV의 API다. OpenCV에서 얼굴 인식에 대한 훈련된 데이터를 XML형태로 제공한다. 아래 링크로 따라 들어가면 XML파일들을 살펴볼 수 있다. 초기에는 얼굴 인식이 목적이었지만 최근에는 대부분의 물체까지 인식이 가능한 것으로 알려져있다.
https://github.com/opencv/opencv/tree/master/data/haarcascades
나는 haarcascade_frontalface_default.xml 파일을 다운 받았고, 아래 첨부된 소스코드를 실행할 폴더에 같이 넣어주었다.
📌 소스코드
from matplotlib import pyplot as plt
import cv2
import sys
src = cv2.imread('test.png')
# 객체 생성
classfier = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
# 분류기가 제대로 생성되었는지 확인
if classfier.empty():
print('XML load failed')
sys.exit()
# 입력 이미지에서 얼굴 검출
faces = classfier.detectMultiScale(src)
for (x, y, w, h) in faces:
cv2.rectangle(src, (x, y, w, h), (255, 0, 255), 2)
cv2.imshow('Result', src)
cv2.waitKey()
cv2.destroyAllWindows()
detectMultiScale()
result = cv2.CascadeClassifier.detectMultiScale(image, scaleFactor=None, minNeighbors=None, minSize=None, maxSize=None)
- image : 입력 영상 (만약 입력 영상이 3채널 컬러 영상이라면 함수 내부에서 그레이스케일 형식으로 변환하여 객체를 검출한다.)
- scaleFactor : 영상 축소 비율
- minNeighbors : 얼마나 많은 이웃 사각형이 검출되어야 최종 검출 영역으로 설정할지 지정 default=3
- minSize : 최소 객체 크기 (w,h) 튜플 형태
- maxSize : 최대 객체 크기 (w,h) 튜플 형태
- 반환 값 : 검출된 객체의 사각형 정보(x, y, w, h)를 담은 numpy.ndarray.shape=(N, 4), dtype=numpy.int32
결과화면
📌 정리
OpenCV 라이브러리는 원래 객체 검출을 위한 분류기 XML파일을 생성하는 프로그램을 제공했지만 4.0.0버전부터는 분류기 학습 프로그램이 제공되지 않는다. 만약 분류기를 학습시키고 싶다면 OpenCV 3.4.x 버전에 들어있는 opencv_createsamples.exe, opencv_traincascade.exe 프로그램을 이용하여 진행할 수 있다.
하지만 딥러닝을 통한 객체 검출이 캐스케이드 분류기에 의한 객체 검출보다 더 좋은 성능을 보여주기 때문에 딥러닝을 공부하는 것이 좋을 듯 하다.
📌 참고
[1] https://github.com/opencv/opencv/tree/master/data/haarcascades
[2] https://dsbook.tistory.com/164
[3] https://deep-learning-study.tistory.com/244
[4] https://thebook.io/006939/ch13/02-07/