Разработка системы верификации лица (Face Verification, 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'}
# Cosine similarity между 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%.
Живость (Liveness Detection)
Без 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 недель |







