face_recognition 모델 활용 플로우 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 개요

face_recognition 라이브러리 이용:

  1. 입력 이미지들로부터 얼굴을 탐지(face_recognition)
  2. 얼굴 임베딩 벡터를 추출(face_recognition)
  3. 벡터들을 기반으로 유사 얼굴을 클러스터링하고(DBSCAN 클러스터링)
  4. 클러스터 결과에 따라 이미지를 폴더로 분류/저장

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 기반 얼굴 인식 모델을 사용.