face_recognition 라이브러리

Yechan Cho·2023년 8월 10일

face_recognition 라이브러리를 통한 얼굴 인식은 크게 세 단계를 거친다.

  1. 이미지 내에서 얼굴 검출 (face detection)
  2. 얼굴 인코딩
  3. 분류 (Classification or clustering)

현재 face_recognition 라이브러리는 dlib와 knn을 사용하여 이를 수행하고 있다.

참고 링크

Face detection

dlib.get_frontal_face_detector()

dlib에서는 HOG(Histogram of Oriented Gradients)에 기반하여 이미지에서 얼굴을 검출한다.

원본 이미지는 이미지 밝기에 관계없이 이미지의 주요 특징을 포착하는 HOG 표현으로 변환된다.

get_frontal_face_detector()는 다음과 같은 단계를 거친다.

  1. HOG 특징 계산: 이미지의 각 픽셀에서 그라디언트 방향과 크기를 계산하고, 그 결과를 기반으로 지역적으로 그래디언트의 방향을 나타내는 히스토그램을 생성한다.
  2. Sliding Window: 감지하려는 객체의 크기에 따라 정해진 크기의 윈도우를 이미지 전체에 슬라이딩하면서 해당 윈도우 내에서의 HOG 특징을 추출한다.
  3. 분류기 평가: 각 슬라이딩 윈도우에서 추출된 HOG 특징은 선형 분류기에 의해 평가된다. 이 분류기는 얼굴인지 아닌지를 판단한다. 이 분류기는 SVM(Support Vector Machine)으로 학습된 모델이다.
  4. 비최대 억제(NMS): 여러 겹치는 감지를 병합하여 최종 감지 결과를 정제한다.

Face encoding

dlib는 얼굴 이미지에서 68개의 랜드마크를 추출한다.

그리고 그 랜드마크들을 인코딩해 128개의 벡터를 생성한다.

dlib.shape_predictor()

얼굴 랜드마크란 얼굴의 특정 특징점들, 예를 들어 눈, 코, 입의 모서리와 같은 지점들을 가리킨다.

일반적으로, shape_predictor는 dlib에서 제공하는 사전 훈련된 모델을 사용하여 랜드마크를 예측하지만

사용자가 제공하는 데이터를 사용하여 학습된 모델로 사용자 정의된 랜드마크를 예측할 때도 사용된다.

dlib에선 기본적으로 ResNet 기반 모델을 이용한다. dlib 모델 documentation

face_rec 개발자가 생성한 모델을 이용할 수도 있다. https://github.com/ageitgey/face_recognition_models

Classification

face_recognition 의 예제에서는 scikit-learn의 k-NN을 이용해 얼굴을 분류한다.

import sklearn.neighbors as neighbors

neighbors.KNeighborsClassifier()

k-NN 알고리즘의 주요 특징은 다음과 같다

  1. 지도 학습: k-NN은 지도 학습 알고리즘으로, 라벨링된 훈련 데이터가 필요하다.
  2. 비모수적 방법: k-NN은 명시적인 훈련 단계 없이 데이터를 저장하기만 하므로 비모수적 방법에 속한다.
  3. 거리 측정: 데이터 포인트 간의 거리를 측정하기 위해 다양한 거리 측정 방법을 사용할 수 있다. 가장 일반적으로 사용되는 거리는 유클리드 거리이다.
  4. k의 선택: k는 사용자에 의해 지정되며, 이는 예측을 위해 참조할 가장 가까운 이웃의 수를 결정한다. k의 값에 따라 모델의 성능이 크게 달라질 수 있다.
  5. 계산 복잡성: 예측 시 모든 훈련 데이터 포인트와의 거리를 계산해야 하므로 대규모 데이터셋에서는 시간이 많이 걸릴 수 있다.

KNeighborsClassifier의 주요 매개변수 및 기능은 다음과 같다:

  • n_neighbors: 가장 가까운 이웃의 수 (default는 5이지만 face_rec에서는 2를 사용하고 있다.)
  • weights: 예측에 사용되는 가중치 함수. 가능한 값은 'uniform' (모든 포인트에 동일한 가중치), 'distance' (거리에 반비례하는 가중치) 및 사용자 함수다. face_rec에서는 distance를 사용하고 있다.
  • algorithm: 가장 가까운 이웃을 계산하기 위한 알고리즘. 'auto', 'ball_tree', 'kd_tree', 'brute' 중 하나를 선택할 수 있다. (default는 auto, face_rec에서는 ball_tree를 사용하고 있다.)
  • metric: 거리 측정 방법. 기본값은 'minkowski'이다.

k-NN은 그 구조상 복잡한 결정 경계를 가질 수 있으며, 균형 잡힌 데이터셋에서 잘 작동한다.

하지만 고차원 데이터나 매우 큰 데이터셋에서는 계산 복잡도나 차원의 저주 문제로 인해 성능이 저하될 수 있다.

profile
Engineer

1개의 댓글

comment-user-thumbnail
2023년 8월 10일

많은 것을 배웠습니다, 감사합니다.

답글 달기