Розробка систем верифікації облич (1:1)
Верифікація обличчя відповідає на питання "це та сама людина?". На відміну від ідентифікації (пошук 1:N по базі), верифікація порівнює два конкретні зображення та повертає True/False. Основне застосування: верифікація ідентичності під час онлайн-реєстрації, порівняння фото на документі з селфі, аутентифікація мобільного додатка.
Алгоритм верифікації
import numpy as np
from insightface.app import FaceAnalysis
class FaceVerifier:
def __init__(self, threshold: float = 0.5):
self.app = FaceAnalysis(
providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
)
self.app.prepare(ctx_id=0, det_size=(640, 640))
self.threshold = threshold # налаштовується на вимоги FAR/FRR
def verify(self, image1: np.ndarray,
image2: np.ndarray) -> dict:
face1 = self._extract_face(image1)
face2 = self._extract_face(image2)
if face1 is None or face2 is None:
return {'verified': False, 'reason': 'face_not_detected'}
# Косинусна подібність між ArcFace embeddings
similarity = self._cosine_similarity(face1.embedding, face2.embedding)
return {
'verified': similarity >= self.threshold,
'similarity': float(similarity),
'threshold': self.threshold
}
def _cosine_similarity(self, a: np.ndarray, b: np.ndarray) -> float:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
Налаштування порога: FAR vs FRR
FAR (False Accept Rate) — ймовірність прийняття чужого за свого. Критично для безпеки. FRR (False Reject Rate) — ймовірність відхилення свого. Впливає на UX.
Ці метрики протилежні: зниження FAR підвищує FRR. Вибір порога залежить від застосування:
| Застосування | Пріоритет | Типовий FAR |
|---|---|---|
| Мобільна аутентифікація | UX > Security | 0.1–1% |
| Онлайн-банкінг, KYC | Security > UX | 0.01–0.1% |
| Прикордонний контроль | Максимальна безпека | < 0.001% |
| Фізичний доступ (офіс) | Баланс | 0.01–0.1% |
EER (Equal Error Rate) — точка, де FAR = FRR. Для ArcFace на LFW: EER ≈ 0.17%.
Детекція живості
Без anti-spoofing верифікація вразлива до атак: фото на екрані, 3D-маска. Обов'язкові компоненти:
Пасивна перевірка живості — аналіз текстури шкіри (LBP, FrequentNet), виявлення артефактів екрана:
from silent_face_anti_spoofing import AntiSpoof
anti_spoof = AntiSpoof(model_path='2.7_80x80_MiniFASNetV2.pth')
def check_liveness(face_crop: np.ndarray) -> dict:
prediction = anti_spoof.predict(face_crop)
return {
'is_real': prediction['label'] == 1,
'score': prediction['probability']
}
Активна перевірка живості — користувач виконує випадкову дію: моргання, поворот голови, вимова цифри. Перевіряється послідовність кадрів.
Верифікація документів (KYC)
Для завдань Know Your Customer: порівняння фото на документі (паспорт, посвідчення водія) з селфі.
Специфіка: фото в документах часто низької якості, можуть бути сканами з водяними знаками, різні умови зйомки. Попередня обробка фото документа: виявлення зони фото, виправлення перспективи, нормалізація яскравості.
Точність верифікації ArcFace при порівнянні документ↔селфі: 94–97% TAR@FAR=0.1%.
Метрики та еталонні тести
- LFW (Labeled Faces in the Wild): академічний стандарт. ArcFace: 99.83%
- IJB-B/IJB-C: складніші набори даних з відео. ArcFace TAR@FAR=1e-4: 94.0/96.5%
- MegaFace Challenge: 1M дистракторів. ArcFace Rank-1: 98.35%
| Застосування | Графік |
|---|---|
| Верифікація мобільного додатка | 2–3 тижні |
| KYC-верифікація з документами | 3–5 тижнів |
| Високонадійна верифікація + liveness | 4–7 тижнів |







