Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

한국인 얼굴 동일인 검증(Face Verification) Baseline

AI-Hub "딥페이크 변조 영상"(dataSetSn=55)의 real 원본 영상에서 얼굴을 추출하고 ArcFace로 임베딩한 뒤, 등록(enrollment) 사진 3~5장과 조회(query) 얼굴 사이의 코사인 유사도로 동일인 여부를 판정하는 baseline입니다.

데이터

  • AI-Hub "딥페이크 변조 영상"의 원본1.zip, 원본2.zip (real 영상만 사용 — fake는 동일인 검증에 불필요)
  • 38명, 1인당 최대 20개 영상 랜덤 샘플(seed=42) → 영상 760개 → 영상당 10프레임 → 얼굴 임베딩 7,600개

파이프라인

  1. InsightFace(buffalo_l)로 얼굴 검출 + 정렬 + ArcFace(w600k_r50) 512차원 임베딩 추출
  2. 사람(subject) 단위로 validation(11명) / test(27명) 분리 — 겹치는 사람 없음(subject-disjoint)
  3. 각 사람 안에서 영상 단위로 등록(enroll) N개 / 조회(query) 나머지로 분리 — 같은 영상의 프레임이 등록과 조회에 동시에 들어가지 않음
  4. 등록 방식 두 가지 비교:
    • video 모드: 등록 영상 N개의 프레임 전부를 평균 (영상 기반 baseline, 그대로 비교 가능한 버전)
    • selfie 모드: 등록 영상 N개에서 딱 1프레임씩만 사용 (실제 서비스 — 셀카 N장 등록 — 을 흉내)
  5. Threshold는 validation에서 목표 FAR(0.01 / 0.001 / 0.0001)로 정하고 test에 고정 적용. 참고용으로 고정 threshold(cosine ≥ 0.6)에서의 TAR/FAR도 별도로 기록

환경

  • 로컬 GPU: NVIDIA RTX 4060 Ti, driver CUDA 13.2 호환이지만 실제 CUDA 런타임은 12.x만 존재
  • onnxruntime-gpu==1.20.2 고정 필요 — 최신 1.28.0은 CUDA 13 런타임(cublasLt64_13.dll)을 요구해서 이 환경에선 로드 실패함
  • CUDA/cuDNN DLL이 torch/lib 안에만 있고 시스템 PATH엔 없어서, onnxruntime/insightface를 쓰기 전에 import torch를 먼저 해야 GPU가 잡힘 (스크립트에 이미 반영되어 있음)
  • 영상이 90초 내외 1080p라 프레임을 건너뛰며 seek하는 방식이 순차 디코딩보다 훨씬 빠름(측정: seek 1.34s vs 순차 디코딩 7.19s / 영상) — extract_embeddings_verify.py는 seek 방식을 씀

재현 방법

pip install insightface onnxruntime-gpu==1.20.2 opencv-python torch scikit-learn numpy

# 1. AI-Hub에서 dataSetSn=55의 원본1.zip, 원본2.zip을 받아서 아래 경로에 둠
#    ./딥페이크 변조 영상/1.Training/[원천][원본]원본1.zip
#    ./딥페이크 변조 영상/1.Training/[원천][원본]원본2.zip

# 2. 영상 추출
python scripts/extract_new_real_identities.py --zip_names 1 2

# 3. 매니페스트 생성 (1인당 최대 20개 영상 샘플)
python scripts/make_manifest_verify.py

# 4. ArcFace 임베딩 추출 (GPU 권장)
python scripts/extract_embeddings_verify.py \
  --manifest ./manifest_verify.csv --output_dir ./embeddings_38 --frames_per_video 10

# 5. 검증 프로토콜 평가
python scripts/verify_protocol_eval.py \
  --emb_dir ./embeddings_38 --val_ratio 0.3 --seed 42 \
  --far_targets 0.01 0.001 0.0001 --fixed_thresholds 0.6 \
  --output_json ./verify_results_38.json

결과 (verify_results_38.json, 2026-08-06)

평가 규모: validation 11명 / test 27명 (subject-disjoint). Test 쌍 개수는 등록 3개일 때 genuine 4,590쌍 / impostor 119,340쌍, 등록 5개일 때 genuine 4,050쌍 / impostor 105,300쌍.

프로토콜 Test ROC-AUC Test EER Threshold 0.6에서 Test TAR / FAR
video, 등록 3개 0.9850 2.05% 98.3% / 0.0%
video, 등록 5개 0.9831 2.72% 98.0% / 0.0%
selfie, 등록 3개 0.99999 0.16% 98.5% / 0.0%
selfie, 등록 5개 0.9831 1.97% 98.0% / 0.0%

Validation에서 FAR 목표별로 고른 threshold, test에 고정 적용한 결과

프로토콜 FAR 목표 Validation threshold Test TAR Test FAR
video, 등록 3개 0.01 / 0.001 / 0.0001 (동일) 0.8049 97.49% 0.0%
video, 등록 5개 0.01 0.3120 98.02% 0.21%
video, 등록 5개 0.001 0.3121 98.02% 0.21%
video, 등록 5개 0.0001 0.8247 97.23% 0.0%
selfie, 등록 3개 0.01 / 0.001 / 0.0001 (동일) 0.7656 97.34% 0.0%
selfie, 등록 5개 0.01 / 0.001 / 0.0001 (동일) 0.7530 97.88% 0.0%

FAR 목표를 0.010.0001 중 어디로 잡아도 validation에서 FAR=0.0(오탐 0건)에 근접하고, 그 threshold를 test에 적용해도 TAR 9798%가 유지됨 — genuine/impostor 유사도 분포가 거의 겹치지 않음. (video 등록 5개만 FAR 0.01/0.001 목표에서 threshold가 0.31까지 낮게 잡히며 test FAR이 0.21%로 소폭 발생함 — 나머지 조합은 0.0001까지 요구해도 오탐 0건.)

한계 (반드시 읽어주세요)

  1. 세션 편향 (확인됨) — AI-Hub 메타데이터(촬영시작 날짜)로 확인한 결과, 이번에 쓴 38명 전원이 촬영일이 단 하루뿐입니다(예: 같은 사람의 모든 영상이 전부 2020-08-06 하루에 찍힘). 즉 영상 단위로 등록/조회를 나눴어도 "완전히 다른 날 찍은 사진 구분"이 아니라 "같은 세션 내 다른 컷 구분"을 푼 것이며, 데이터셋 자체에 같은 사람의 다른 날짜 촬영본이 없어 이번 baseline으로는 교차 세션 검증이 불가능합니다. AUC/EER이 매우 높게(거의 포화) 나온 것은 이 편향이 실제 원인일 가능성이 높습니다 — 아래 도메인 격차와 함께, 이 수치를 "같은 세션 내에서는 잘 구분한다"는 의미로만 해석해야 합니다.
  2. 표본 규모 — 38명(validation 11 / test 27)은 비교 대상인 Celeb-real baseline(56명)보다 작고, 표본이 작을수록 오탐률처럼 희귀 이벤트를 재는 지표(특히 FAR 0.0001)의 신뢰구간은 넓어집니다.
  3. 도메인 격차 — 이 baseline은 "깨끗한 촬영 영상끼리" 비교입니다. 실제 서비스는 "내 셀카 vs 웹에서 수집한 압축·화질저하·다른 각도의 사진"을 비교하므로, 실제 운영 환경의 유사도 점수는 여기서 나온 값보다 낮게(더 어렵게) 나올 가능성이 높습니다. 위 결과를 그대로 서비스 threshold로 채택하기 전에 실제 웹 이미지 도메인에서 재검증이 필요합니다. 합성 저화질 손상(웹사진 시뮬레이션)으로 미리 스트레스 테스트한 결과는 domain-gap-test 브랜치의 DOMAIN_GAP.md 참고 — threshold 0.6 기준 오탐(FAR)은 0%로 유지되지만, 놓치는 비율(TAR)이 최대 7.7%p까지 떨어집니다.
  4. 1인당 영상 20개 캡 — 처리 시간 문제로 사람마다 최대 20개 영상만 랜덤 샘플링했습니다(전체는 1인당 평균 ~165개). 표본을 늘리면 특히 test의 impostor pair 수가 늘어 FAR 추정이 더 안정적으로 나올 수 있습니다.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages