face‐recognition 모델 선정 이유 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 모델 비교 요약

모델 특화 분야 임베딩 목적 인물 분류 적합도(이론적) 인물 분류 결과 (테스트 결과) 속도(CPU 기준)
face_recognition (dlib) 얼굴 인식 Triplet loss 기반 적합 적합 중간
InsightFace (ArcFace) 얼굴 인식 CosFace, ArcFace 적합 (단, 성능 이슈 발생) 낮음 느림
CLIP (ViT-B/32) 의미 검색/태깅 텍스트-이미지 부적합 매우 낮음 빠름

2. Face recognition

a. 얼굴 검출 방법 비교

항목 HOG CNN
방식 전통 특징 기반 (SVM) 딥러닝 기반 (CNN)
속도 ✅ 빠름 (CPU 적합) ❌ 느림 (GPU 권장)
정확도 낮음 (정면에 강함) 높음 (다양한 얼굴 대응)
환경 CPU 친화 GPU 필요
처리 시간 (테스트 기준) 1분 이내 8분 이상

b. 테스트 환경

  • 맥북 프로 2 로컬 테스트
  • 드라마 영상을 일정 시간 간격으로 프레임 분리해서 이미지 데이터셋으로 사용(총 160장)

c. 모델 비교 결과

📁 clustered_faces_cnn
  └─ outliers: 82장
  └─ person_0: 26장
  └─ person_1: 7장
  └─ person_2: 7장
  └─ person_3: 5장

📁 clustered_faces_hog
  └─ outliers: 51장
  └─ person_0: 28장
  └─ person_1: 8장
  └─ person_2: 6장
  └─ person_3: 5장
  • 인물 분류 소요 시간
    • cnn 모델: 8분 이상 소요
    • hog 모델: 1분 30초 내외
  • 분류 결과에 큰 차이가 없다.
  • 오히려 cnn을 사용하는 경우, 얼굴이 아닌 부분도 얼굴로 인식했다.

d. 인물 분류 테스크는 CPU 기반으로 수행 예정

  • CNN 기반 얼굴 검출은 현실적으로 시간 과부하 발생
  • HOG 방식 채택: 속도와 성능의 타협점으로 적합

3. InsightFace

a. 특징

  • 얼굴 검출 + 정렬 + 임베딩 통합 제공
  • ArcFace 기반 고정밀 임베딩 모델

b. 테스트 결과

  • 여러 이미지에서 얼굴 자체를 검출하지 못함
  • 검출된 이미지 간 임베딩 거리:
    • 최소 0.3757, 최대 1.0422
    • eps=0.35 기준: 클러스터 하나도 생성 안 됨 (전부 outlier)
# eps를 0.7로 늘렸을 때 일부 클러스터 생성
📁 clustered_faces_cnn
  └─ unknown: 나머지
  └─ person_0: 2장
  └─ person_1: 4장
  └─ person_2: 2장

c. InsightFace 성능 저하 원인 추론

가능 원인 설명
이미지 품질 저하 저해상도, 흐릿함, 얼굴이 너무 작게 나온 경우
다양한 각도/포즈 일부 사진이 측면, 후면, 눈 가림 등으로 인식 불가
기본 모델 민감도 buffalo_l 모델 기준, 임계값 높아 감지 실패 증가
정렬 오류 얼굴 검출 실패로 인해 정렬도 제대로 되지 않음
  • 임계값이 높다: 까다롭게 동일 인물을 판단하기에 조금만 다르면 다른 사람이라고 판단. 같은 사람이라도 포즈나 조명 차이로 벡터 간 거리가 멀어지면 다른 사람으로 판단. (buffalo_l은 보수적 판단)

4. CLIP 임베딩 대체 실험

a. 목표

  • 하나의 임베딩 모델로 모든 이미지 처리 모듈 통일

    → 추후 확장성과 유지보수 용이

b. 배경

  • 우리 서비스는 중복 사진 제거, 하이라이트 추출, 태깅 등 모든 사진 처리 작업에 CLIP 임베딩 사용 중
  • 얼굴 분류에도 CLIP을 통합적으로 활용할 수 있는지 검토

c. 실험 방식

  1. face_locations로 얼굴 crop
  2. 얼굴 이미지 → CLIP ViT-B/32 임베딩
  3. DBSCAN으로 클러스터링

d. 결과 비교

📁 clustered_clip_face
  └─ cluster_0: 5장
  └─ outliers: 93장

📁 clustered_faces (face_recognition)
  └─ person_0: 26장
  └─ person_1: 7장
  └─ person_2: 7장
  └─ person_3: 5장
  └─ outliers: 82장

e. CLIP의 한계

항목 설명
목적 이미지-텍스트 의미적 매핑 (멀티모달 표현)
학습 방식 "a photo of a dog" ↔ 🐶 이미지 쌍 학습
강점 태깅, 검색, 의미 기반 그룹화
약점 얼굴 디테일 무시, 동일 인물 구분 어려움

f. 결과 해석

  • 얼굴 특징보다 전체 분위기/스타일에 민감

    → 얼굴 기반 정밀 분류에는 부적합


5. 최종 결정

  • 얼굴 검출: face_recognition.face_locations (HOG)

  • 얼굴 정렬: 68-point landmark detector (dlib)

  • 얼굴 임베딩: face_recognition.face_encodings (ResNet-34)

  • 클러스터링: DBSCAN (eps=0.35~0.5)

  • CLIP은 인물 분류에 부적합

    → 중복 제거, 태깅, 대표 이미지 추출 등 비정밀 의미 태스크 전용