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

현재 face_recognition 라이브러리는 dlib와 knn을 사용하여 이를 수행하고 있다.
dlib.get_frontal_face_detector()
dlib에서는 HOG(Histogram of Oriented Gradients)에 기반하여 이미지에서 얼굴을 검출한다.

원본 이미지는 이미지 밝기에 관계없이 이미지의 주요 특징을 포착하는 HOG 표현으로 변환된다.
get_frontal_face_detector()는 다음과 같은 단계를 거친다.
dlib는 얼굴 이미지에서 68개의 랜드마크를 추출한다.
그리고 그 랜드마크들을 인코딩해 128개의 벡터를 생성한다.
dlib.shape_predictor()

얼굴 랜드마크란 얼굴의 특정 특징점들, 예를 들어 눈, 코, 입의 모서리와 같은 지점들을 가리킨다.
일반적으로, shape_predictor는 dlib에서 제공하는 사전 훈련된 모델을 사용하여 랜드마크를 예측하지만
사용자가 제공하는 데이터를 사용하여 학습된 모델로 사용자 정의된 랜드마크를 예측할 때도 사용된다.
dlib에선 기본적으로 ResNet 기반 모델을 이용한다. dlib 모델 documentation
face_rec 개발자가 생성한 모델을 이용할 수도 있다. https://github.com/ageitgey/face_recognition_models
face_recognition 의 예제에서는 scikit-learn의 k-NN을 이용해 얼굴을 분류한다.
import sklearn.neighbors as neighbors
neighbors.KNeighborsClassifier()
k-NN 알고리즘의 주요 특징은 다음과 같다
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은 그 구조상 복잡한 결정 경계를 가질 수 있으며, 균형 잡힌 데이터셋에서 잘 작동한다.
하지만 고차원 데이터나 매우 큰 데이터셋에서는 계산 복잡도나 차원의 저주 문제로 인해 성능이 저하될 수 있다.
많은 것을 배웠습니다, 감사합니다.