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. 실험 방식
face_locations
로 얼굴 crop- 얼굴 이미지 → CLIP ViT-B/32 임베딩
- 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은 인물 분류에 부적합
→ 중복 제거, 태깅, 대표 이미지 추출 등 비정밀 의미 태스크 전용