[Python] cvlib로 얼굴인식(성별, 나이) 예측하기
cvlib 란?
파이썬에서 얼굴, 객체 인식을 위한 사용하기 쉬운 라이브러리이다. opencv와 tensorflow를 사용하고 있기 때문에, 이 라이브러리를 사용하려면 위 2개를 설치해야 한다.
$ pip install opencv-python tensorflow
소스코드
얼굴인식
얼굴인식은 opencv의 dnn 모듈을 사용하여 사전에 학습된 모델로 inference해준다. 별다른 것 없이 cv.detect_face()함수면 쉽게 사용할 수 있다. 이 함수로 반환되는 결과는 얼굴의 좌표들과 예측된 얼굴 각각의 confidence이다.
예측된 얼굴 좌표는 (xmin, ymin, xmax, ymax) 순으로 반환된다. confidence는 0~1사이의 float값이다. 이 두개를 이용하여 얼굴위치와 정확도를 출력하는 코드이다.
import cv2
import cvlib as cv
img = cv2.imread('sample.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 얼굴 찾기
faces, confidences = cv.detect_face(img)
for (x, y, x2, y2), conf in zip(faces, confidences):
# 확률 출력하기
cv2.putText(img, str(conf), (x,y-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1)
# 얼굴위치 bbox 그리기
cv2.rectangle(img, (x, y), (x2, y2), (0, 255, 0), 2)
# 영상 출력
cv2.imshow('image', img)
key = cv2.waitKey(0)
cv2.destroyAllWindows()
결과영상
5명 남자들의 얼굴 위치를 정확하게 맞추었고, confidence도 매우 높다.

성별 예측하기
위 얼굴인식에 이어 성별을 예측해주는 함수도 있다. 이것도 사전에 학습된 것으로 예측해주는 것으로 cv.detect_gender()함수로 쉽게 사용할 수 있다.
입력 영상으로 위에서 인식한 얼굴을 roi로 지정하여 해당 부분의 이미지를 입력하면 된다. 그럼 성별 label과 confidence가 반환된다. label은 ['male', female']로 되어있고, confidence도 [0.1, 0.9] 와 같은 식으로 confidence가 더 높은 것으로 결정하면 된다.
confidence 값이 높은 것의 index를 가져오기 위해 np.argmax()를 사용했고, 이 index로 label과 confidence를 각각 원본 영상에 출력한다.
import cv2
import cvlib as cv
import numpy as np
img = cv2.imread('sample3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 얼굴 찾기
faces, confidences = cv.detect_face(img)
for (x, y, x2, y2)in faces:
# 얼굴 roi 지정
face_img = img[y:y2, x:x2]
# 성별 예측하기
label, confidence = cv.detect_gender(face_img)
cv2.rectangle(img, (x, y), (x2, y2), (0, 255, 0), 2)
gender = np.argmax(confidence)
text = f'{label[gender]}:{confidence[gender]:.1%}'
cv2.putText(img, text, (x,y-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1)
# 영상 출력
cv2.imshow('image', img)
key = cv2.waitKey(0)
cv2.destroyAllWindows()
결과영상
얼굴인식은 당연히 잘 되었고, 성별또한 잘 인식되어 출력된 것을 확인할 수 있다.

참고자료
- cvlib 공식 github [링크]