데이터분석/Vision Recognition

OpenCV 빠르게 이용해서 얼굴 판별

늘근이 2015. 11. 10. 21:10

출처 :

Face Recognition With Python, in Under 25 Lines of Code

https://realpython.com/blog/python/face-recognition-with-python/

 

참고 :

바나나 이미지센싱 (^^;;)

http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

 

Localising Organs of the Fetus in MRI Data Using Python

http://www.slideshare.net/kevinkeraudren/pydata-london-2015

 

Setup OpenCV for Python in Windows

http://luugiathuy.com/2011/02/setup-opencv-for-python/

 

 

 

얼굴탐색은 이미지에대한 컴퓨터의 연속적인 판별계산식이다.

 

만약 모든 이미지에 대해서 몇천개가 되는 검사를 계속하게 된다면 컴퓨터는 계산하느라 터져버릴수 있으므로, 사실은 몇가지 중요한 기준만 적용해서 얼굴을 검색하게 되는데, 대부분의 경우는 이 간단한 검사에도 통과하지 못하며 몇가지 부분만 남겨놓아 컴퓨팅 파워를 절약할수 있게 된다.

 

이미지 센싱의 대표적인 모듈인 OpenCV는 바로 이 cascade라는 방법을 사용해 대충 검사를 한 후 후보들을 걸러낸다.

 

 

 

일단, 윈도우즈용 openCV-python 다운로드는 다음과 같다.

 

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.0.0/

 

설치된 위치의 build/python/2.7에서 cv2.pyd 를 복사해다가

파이선 설치위치 아래 lib/site-packages에 붙여 넣는다.

 

아나콘다를 설치했을경우, 다음과 같은 이상한 위치에 있다.

 

C:\Users\사용자이름\Anaconda3\Lib\site-packages

 

근데, 사실 위의 상황에서 깔리면 대단한거다.

 

다음과 같은 에러메시지

 

'DLL load failed: 지정된 모듈을 찾을 수 없습니다..'

 

대부분 파이썬 2.7버전과 호환이 되어야 하는데 보통 최신버전을 다운로드 받고자 3이상버전을 설치했다면 openCV와 호환자체가 안된다. 2.7버전을 받아야 하며, 사실 깨끗한 순정에서부터 설치하고 싶다면, 위의 참고 링크를 참조하여 NUMPY와 SCIPY를 모두 설치하면된다.

 

이제 OpenCV로 만들어져 있는 오픈소스코드 (https://github.com/shantnu/FaceDetect/)를 통해, 간단한 얼굴분석기를 구현해볼수있다. 얼굴분석기는 간단한 콘솔형태로 다음과 같은 명령어로 실행할것이다. 물론 제대로된 분석기를 구현하기 위해서는 API형식이 아닌, 코드를 고쳐야 할것이다.

 

$ python face_detect.py abba.png haarcascade_frontalface_default.xml

 

이미지경로와 와 학습된 결과 XML을 인자로 받고 있는데 파이썬코드에서는 다음과 같이 쉽게 받아낼수 있다. (여기서는 학습된 결과인 XML이 미리 주어진다는것이 큰 단점이기는 하다)

 

cascPath = sys.argv[2]
import sys

 

imagePath = sys.argv[1]
cascPath = sys.argv[2]

 

그리고 이제 이미지를 그냥 냅다 읽으면 된다.

 

cascPath는 인텔 openCV에서 제공하는 얼굴 이미지 인식 xml 파일인데, 이 파일을 다음과 같이 CascadeClassifier() 메서드에 인자로 넣어주어서 세팅을 완료한다.

 

faceCascade = cv2.CascadeClassifier(cascPath)

 

그리고, 다른 이미지 로딩이 그렇듯, 이미지 로딩을 마친 후 그레이스케일로 바꿔준다. 왜 그레이스케일로 바꾸어야 하는지는 명백하다. 얼굴형태가 중요한거지 색깔이 중요한게 아니다. 흑형이고 황형이고 잘생기면 중요한것이 아니겠는가.

 

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

 

위와같이 변환된 이미지도 존재하므로, 아까 Classifier 로 작동하는 변수인 faceCascade안에 있는 메서드를 작동시킨다. detectMultiScale() 이라는 메서드안에 필요한 부분을 인자로 넣어주면 이제 시작된다.

 

faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

 

faces안에는 아마 얼굴들을 탐지한 얼굴배열이 올 것이므로, 이를 알맞게 출력을 해준 후,

 

print "Found {0} faces!".format(len(faces))

 

이제 모든 얼굴들의 좌표를 가지고 잘 사각형을 그려주면 된다.

 

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

cv2.imshow("Faces found", image)
cv2.waitKey(0)

 

 

잘 얼굴을 탐색해낼수있다.

 

여기까지는 사실 얼굴을 탐색할수있는 API를 이용한것밖에는 그 이상의 의미를 가지지 못한다. 얼굴을 탐색해내는 기술은 벌써 백만년전에 디지털카메라와 모바일 카메라 소프트웨어에 자동으로 장착되어있는 심플한 기능이다.

 

우리는 이 openCV등을 이용하여 얼굴말고 다른 물체를 구별하게 만들어야 한다.