face_recognition 모델 활용 플로우 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 개요
face_recognition
라이브러리 이용:
- 입력 이미지들로부터 얼굴을 탐지(face_recognition)
- 얼굴 임베딩 벡터를 추출(face_recognition)
- 벡터들을 기반으로 유사 얼굴을 클러스터링하고(DBSCAN 클러스터링)
- 클러스터 결과에 따라 이미지를 폴더로 분류/저장
2. 단계별 상세 플로우
a. 입력 이미지 로드
- 대상 디렉토리:
./dataset/
(플로우 테스트가 로컬에서 가능하도록 이미지를 디렉토리에서 읽어오는 방식으로 작성) - 이미지 확장자 제한 없음 (
.png
,.jpg
,.jpeg
, ... 포함 가능) glob
로 정렬하여 전체 이미지 경로 수집
imagePaths = sorted(glob(os.path.join(img_dir, '*')))
b. 얼굴 인식 및 임베딩 추출
[ 사용 모듈: face_recognition
]
-
face_locations(image, model="hog")
→ 이미지 내 얼굴 영역을 HOG 기반으로 탐지
→ 복수 인물도 탐지 가능 (단일 인물 제한 없음)
-
face_encodings(image, boxes)
→ 탐지된 얼굴 각각에 대해 128차원 임베딩 벡터 생성
→ 여러 인물일 경우, 인코딩 리스트를 반복 처리
boxes = face_recognition.face_locations(rgb, model="hog")
encodings = face_recognition.face_encodings(rgb, boxes)
- 결과 저장 형식
{
"imagePath": 이미지 경로,
"encoding": 임베딩 벡터 (numpy array)
}
c. 임베딩 간 거리 계산
[ 사용 모듈: cosine_distances
(sklearn) ]
- 모든 임베딩 벡터 간 pairwise 거리 계산
- 결과는
N x N
크기의 거리 행렬
encoding_arr = np.array([...])
dists = cosine_distances(encoding_arr)
d. 얼굴 클러스터링
[ 사용 모듈: DBSCAN
(sklearn) ]
- 하이퍼파라미터:
eps=0.35
(거리 임계값)metric="euclidean"
n_jobs=-1
(모든 CPU 코어 사용)
fit()
호출 후, 각 임베딩의 클러스터 레이블 반환
clt = DBSCAN(eps=0.35, metric="euclidean", n_jobs=-1)
clt.fit(encoding_arr)
labels = clt.labels_
- 레이블
1
은 noise (outlier) 처리됨
e. 결과 반환: 인물 그룹 리스트
labels
를 기준으로 각 인물별 이미지 경로를 그룹화- 경로는 URL 형태로 반환 (예:
http://server:8000/img3.jpg
) - 반환 예시:
[
["http://server:8000/img2.jpg", "http://server:8000/img3.jpg"],
["http://server:8000/img4.jpg"]
]
→ outlier
(label == -1
)는 결과에서 제외
f. 플로우 요약 문장
- 이 파이프라인은 face_recognition 라이브러리를 사용하여 다양한 확장자의 입력 이미지에서 복수 인물 얼굴을 탐지하고, 각 얼굴로부터 128차원 임베딩 벡터를 추출.
- 이후 cosine distance 기반으로 유사도를 계산한 뒤, DBSCAN 알고리즘을 이용해 얼굴 클러스터링을 수행하며,
- 최종적으로 클러스터 레이블에 따라 인물별로 분류된 이미지 URL 리스트를 반환.
- 인물 수는 고정되지 않으며, HOG 기반 얼굴 인식 모델을 사용.