티스토리 뷰

반응형
[Python] opencv로 얼굴인식 하기

Haar Feature

opencv 에서는 haar feature를 이용한 얼굴인식 코드를 제공한다. haar feature는 영상에서 object detection을 하기 위해 나온 것으로 2001년에 "Rapid Object Detection using a Boosted Cascade of Simple Features"라는 논문에서 제안되었다. 아래와 같은 커널을 convolution 연산을 통해 feature를 구한다.

Haar Cascade Classifier

haar cascade classifier는 영상을 windowing 하면서 haar feature들을 순차적으로 여러 stage로 검사하여 face가 아니면 이후는 보지도 않고 버려 버린다. 모든 feature를 연산할 필요가 없으므로 연산량이 대폭 줄어든다.

소스코드

opencv에서는 미리 학습된 haar cascade를 xml파일로 제공한다. 이를 통해서 손쉽게 코드로 구현할 수 있다.

라이브러리 내에 xml파일이 있으니 따로 다운받지 않아도 된다.(cv2.data.haarcascades 경로에서 찾을 수 있음)

순서

  1. 이미지를 grayscale로 변경
  1. CascadeClassificer()를 선언하고, detectMultiScale() 함수를 이용하여 얼굴위치의 좌표를 반환

    detectMultiScale(img, scaleFactor, minNeighbors)

    • img: 인식할 영상
    • scaleFactor: 이미지 확대 크기 제한, 1.3~1.5 (큰값: 인식기회 증가, 속도 감소)
    • minNeighbors: 요구되는 이웃 수(큰값: 품질증가, 검출개수 감소)

  1. 얼굴 영상에서 detectMultiScale() 함수를 이용하여 눈 위치의 좌표를 반환
  1. 원본 영상에 위의 출력된 좌표대로 얼굴, 눈의 사각형을 그려줌

(얼굴이 인식된 좌표는 [x, y, w, h] 순서로 반환된다.)

import cv2

# haarcascade 불러오기
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

# 이미지 불러오기
img = cv2.imread('sample.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 얼굴 찾기
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    # 눈 찾기
    roi_color = img[y:y + h, x:x + w]
    roi_gray = gray[y:y + h, x:x + w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)

# 영상 출력
cv2.imshow('image', img)

key = cv2.waitKey(0)
cv2.destroyAllWindows()

결과영상

눈은 인식하지 못한 부분도 있지만, 얼굴은 대체적으로 정확하게 인식하는 편이다.

참고자료

  1. opencv 공식문서 [링크]
  1. face detection 블로그 [링크]
  1. 도서 - 파이썬으로 만드는 OpenCV 프로젝트

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday