Haar feature는 목적에 따라 크게 3종류로 나눠지며 총 14개의 패턴으로 이루어진다.
이미지에 6000개 이상의 haar feature를 활용한 결과값을 계산하여 얼굴 이미지 여부를 판단함.
이때의 분류기는 cascade classification이며 모든 이미지 영역에 6천개의 feature를 전부 계산하는 것이 아니라 feature의 조건이 하나라도 만족하지 않으면 not face로 판단하는 방법으로 연산량 간소화
OpenCV에는 주로 정면 얼굴인식기를 제공하며 눈, 상반신, 하반신, 전신 인식기를 추가로 제공한다.
예제
import cv2
# 적절한 cascade xml file 선택
cascade_file = "haarcascade_frontalface_default.xml"
# 이미지 읽고 gray scale 로 변환
img = cv2.imread("football1.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cascade classifier 읽고 얼굴 이미지 인식
cascade = cv2.CascadeClassifier(cascade_file)
face_list = cascade.detectMultiScale(img_gray, scaleFactor=1.14, minNeighbors=1)
# 인식한 얼굴에 사각형 표시
color = (255, 0, 0)
for face in face_list:
x, y, w, h = face
cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness=2)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
결과
왜 한명이 잡히지 않았을까?
cascade.detectMultiScale(img_gray, scaleFactor=1.14, minNeighbors=1)
파라메터 값이 적용되지 않았다.
scaleFactor: 사진을 점점 축소하면서 얼굴을 찾는다. 그렇게 사진을 몇 프로를 줄일 것인지에 대한 파라메터, 너무 작으면 연산이 오래 걸리고 너무 크면 이미지가 빠질 수 있기에 적당히 고른다.
ScaleFacotr=1.10 인 경우
minNeighbors: 얼굴을 인식하는 퀄리티로 얼굴들이 얼마나 붙어있는지에 대한 파라메터로 높은 값일 수록 인식률이 떨어질 수 있지만 높은 퀄리티를 보여주고 낮을면 인식률일 높아질 수 있지만 낮은 퀄리티를 보여준다.
minNeighbors=5인경우
이미지별로 값들은 다다르다.