오늘은 OpenCV로 이미지에서 얼굴을 검출해보도록 하겠습니다. 파이썬 (Python)을 이용해서 할 것이기 때문에 누구든 쉽게 따라하실 수 있습니다. OpenCV가 설치되지 않으신 분들은 아래의 포스팅을 통해 설치하시면 됩니다. 


2017/03/28 - [D 개발 이야기/Image Processing] - [OpenCV] 라즈베리파이(Raspberry Pi) 3에 OpenCV 설치하여 Python에서 사용하기

2017/04/12 - [D 개발 이야기/Image Processing] - [OpenCV] 라즈베리파이 (Raspberry Pi) 3에서 웹캠 (WebCAM) 영상 가져오기


Mac에서 설치해서 사용하실 분들은 아래 블로그를 참고하시기 바랍니다.


How to install Homebrew, OpenCV and Python for OS X El Capitan (10.11)


아래 코드는 Face Recognition With Python, in Under 25 Lines of Code 라는 포스팅에서 가져와서 몇줄만 제 편의에 맞게 편집한 것입니다.

# -*- coding: utf-8 -*-

import cv2
import sys

# 사용자 입력
imagePath = sys.argv[1]
# cascPath = sys.argv[2]
cascPath = "haarcascade_frontalface_default.xml"

# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)

from datetime import datetime
start_time = datetime.now()

# 계산 반복 횟수 (한번만 처리하려면 아래를 1로 하거나 for문을 제거하세요)
iteration_count = 100
for cnt in range(0, iteration_count):

    # Read the image
    image = cv2.imread(imagePath)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # Detect faces in the image
    faces = faceCascade.detectMultiScale(
		gray,
		scaleFactor=1.1,     # 이미지에서 얼굴 크기가 서로 다른 것을 보상해주는 값
		minNeighbors=5,    # 얼굴 사이의 최소 간격(픽셀)입니다
		minSize=(30, 30),   # 얼굴의 최소 크기입니다
	)

    # 검출된 얼굴 주변에 사각형 그리기
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

end_time = datetime.now()
elapsed_time = end_time - start_time
average_time = elapsed_time / iteration_count

print "Elapsed Time: %s sec" % elapsed_time
print "Average Time: %s sec" % average_time

# 얼굴을 검출한 이미지를 화면에 띄웁니다
cv2.imshow("Face Detected", image)

# 아무 키나 누르면 빠져나옵니다
cv2.waitKey(0)


위의 코드와 아래의 cascade 파일을 저장하신 후 아래와 같이 실행하시면 됩니다. 


haarcascade_frontalface_default.xml


python face_detect.py face.png


구글에서 검색한 고해상도 이미지를 적용한 결과입니다. 잘못 검출한 경우도 있고, 검출이 가능한 것 같은데도 검출은 못한 경우도 있습니다. Scale Factor나 Minmum Neighbor, Minimum Size 등을 적절히 조절하시면 더 나은 검출 결과를 보여줍니다.


위의 예제에서 사용한 Face Detection의 핵심은 사실 "haarcascade_frontalface_default.xml" 파일 입니다. 본래 예제에서는 argument로 받던 부분을 제가 반복해서 입력하기 싫어서 코드에 박아넣었습니다. 코드의 중간에 보시면 'faceCascade = cv2.CascadeClassifier(cascPath)'로 Cascade Classifier를 생성하는 부분이 있습니다. Cascade Classifier는 Object를 detection하기 위한 라이브러리로, 사람뿐만 아니라 미리 학습된 모든 사물에 대해 검출(detection)이 가능합니다. 우리는 사람의 얼굴을 구분하기 위해 사람 정면 얼굴에 대해 미리 학습된 "haarcascade_frontalface_default.xml"를 사용했지만, 만약 다른 사물을 학습시켜놓은 파일이 있다면 해당 파일을 이용하여 이미지에서 사물을 찾아낼 수 있습니다. '{OpenCV Install Directory}\share\OpenCV\haarcascades' 폴더를 보시면, 미리 학습된 cascade 파일들이 있습니다. 해당 파일들을 이용해서 검출을 시도해보실 수 있습니다.


OpenCV의 Haar Cascade에 대해 더 궁금한 내용은 아래 OpenCV Documentation에서 확인하실 수 있습니다.


OpenCV Tutorial: Face Detection


직접 Cascade Classifier를 학습 시키고 싶으신 분들은 아래 링크를 참고하시면 됩니다.


OpenCV Tutorial: Cascade Classifier Training


알고리즘 자체에 대해 궁금하신 분들은 아래 '다크프로그래머'님의 포스팅을 참고하시면 유용한 정보들을 찾아보실 수 있습니다. 사실 저도 영상처리에 대해 전문가가 아니고, 단순 취미로 하고 있기 때문에 알고리즘에 대해서는 자세히 알지 못합니다.


OpenCV Haar/cascade training 튜토리얼


블로그 이미지

키노코더

각종 이야기를 다루는 키노코더의 블로그입니다

,