이 책 내내 "임계값은 내 데이터로 정하라"고 반복했습니다. 이 장에서 그 방법을 구체적으로 다룹니다. 핵심 도구는 FAR과 FRR, 두 가지 오류율입니다. 이 둘의 직관만 잡으면, 내 시스템에 맞는 임계값을 근거를 가지고 정할 수 있습니다.
두 가지 오류 — FAR와 FRR
인식 시스템이 틀리는 방식은 둘뿐입니다.
| 오류 | 이름 | 뜻 | 위험 |
|---|---|---|---|
| 타인을 본인으로 | FAR(오수용률) | 다른 사람을 통과시킴 | 보안 사고 |
| 본인을 타인으로 | FRR(오거부율) | 본인을 막음 | 사용 불편 |
FAR(False Acceptance Rate)이 높으면 남이 내 계정에 들어옵니다. FRR(False Rejection Rate)이 높으면 정작 본인이 자꾸 거부됩니다. PART 04에서 본 "느슨한 임계값 vs 빡빡한 임계값"의 맞바꿈이 바로 이 둘의 맞바꿈입니다. 임계값을 느슨하게 하면 FRR은 줄지만 FAR이 늘고, 빡빡하게 하면 반대입니다.
임계값을 정하는 절차
평가는 정해진 절차로 합니다.
- 검증 데이터 준비: 같은 사람 쌍(본인끼리)과 다른 사람 쌍(타인끼리)을 충분히 모읍니다.
- 거리 계산: 모든 쌍의 임베딩 거리(또는 유사도)를 구합니다.
- 임계값 스윕: 임계값을 조금씩 바꿔 가며 각 지점의 FAR·FRR을 계산합니다.
- 선택: 용도에 맞는 지점을 고릅니다.
# 파일: far_frr.py"""같은쌍/다른쌍 거리로 임계값별 FAR·FRR을 계산한다."""import numpy as np# same: 본인끼리 쌍의 거리, diff: 타인끼리 쌍의 거리 (작을수록 닮음 가정)same = np.array(same_distances)diff = np.array(diff_distances)for thr in np.arange(0.3, 1.0, 0.05): # 거리 < 임계값이면 "같은 사람"으로 판정 frr = np.mean(same >= thr) # 본인인데 거부된 비율 far = np.mean(diff < thr) # 타인인데 수용된 비율 print(f"임계값 {thr:.2f} FAR {far:.3f} FRR {frr:.3f}")
거리가 임계값보다 작으면 "같은 사람"으로 판정한다고 할 때, 본인 쌍인데 거리가 임계값 이상이면 FRR(거부), 타인 쌍인데 거리가 임계값 미만이면 FAR(잘못 수용)입니다. 임계값을 올리면 FAR이 줄고 FRR이 늡니다.
EER과 용도별 선택
임계값을 스윕하면 FAR과 FRR이 한 곳에서 교차합니다. 이 지점을 EER(Equal Error Rate, 동일 오류율)이라 하며, 두 오류가 균형을 이루는 기준점입니다.
하지만 EER이 항상 정답은 아닙니다. 용도에 따라 한쪽을 더 줄여야 합니다.
| 용도 | 우선 | 선택 |
|---|---|---|
| 고보안 출입·결제 | FAR 최소화 | 빡빡하게(타인 수용 절대 금지) |
| 편의 위주 잠금해제 | FRR 최소화 | 느슨하게(본인 거부 최소) |
| 일반 균형 | EER 부근 | 교차점 근처 |
평가의 함정
- 데이터가 운영 환경과 달라야 무의미: 깨끗한 정면 사진으로 평가하고 실제로는 옆얼굴·저조도면, 평가 결과가 현실과 다릅니다. 반드시 운영과 비슷한 데이터로 평가하세요.
- 표본이 적으면 못 믿는다: 본인 쌍 5개로 잰 FRR은 우연에 휘둘립니다. 가능한 한 많은 쌍으로 평가합니다.
실무 팁. FAR과 FRR 중 무엇이 더 치명적인지는 도메인이 결정합니다. 은행 인증에서 FAR(남이 통과)은 돈이 새는 사고지만, FRR(본인 거부)은 불편에 그칩니다. 반대로 응급 상황의 출입이라면 FRR이 더 위험할 수 있습니다. "이 시스템에서 어떤 오류가 더 큰 피해를 주는가"를 먼저 정하고, 그 오류를 줄이는 쪽으로 임계값을 기울이세요.
이 장에서 기억할 것
인식 시스템의 오류는 타인을 받는 FAR과 본인을 막는 FRR 둘이며, 임계값으로 둘을 맞바꿉니다. 운영과 비슷한 데이터로 같은쌍·다른쌍 거리를 모아 임계값을 스윕하면 각 지점의 FAR·FRR을 구할 수 있고, 두 오류가 만나는 EER을 기준으로 용도에 맞게(고보안은 FAR 최소, 편의는 FRR 최소) 고릅니다. 어떤 오류가 더 치명적인지를 도메인이 결정합니다. 다음 장에서는 영상에서 결과가 떨리는 문제를 안정화합니다.