Разработка системы распознавания лиц (Face Recognition)
Распознавание лиц — задача идентификации человека по изображению лица путём сопоставления с базой. Полный пайплайн: детекция лица → выравнивание (alignment) → извлечение embedding → поиск ближайшего соседа в базе. Каждый этап влияет на итоговую точность, и ошибка на ранних этапах не компенсируется последующими.
Полный пайплайн
import cv2
import numpy as np
from insightface.app import FaceAnalysis
class FaceRecognitionSystem:
def __init__(self, db_path: str, threshold: float = 0.5):
# InsightFace объединяет детекцию + alignment + embedding
self.app = FaceAnalysis(
providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
)
self.app.prepare(ctx_id=0, det_size=(640, 640))
self.threshold = threshold
self.face_db = self._load_database(db_path)
def identify(self, image: np.ndarray) -> list[dict]:
faces = self.app.get(image)
results = []
for face in faces:
embedding = face.embedding # 512-dim ArcFace embedding
match = self._search_database(embedding)
results.append({
'bbox': face.bbox.astype(int).tolist(),
'person_id': match['id'] if match else None,
'person_name': match['name'] if match else 'Unknown',
'similarity': match['similarity'] if match else 0.0,
'verified': match['similarity'] > self.threshold if match else False
})
return results
def _search_database(self, query_emb: np.ndarray) -> dict | None:
# Cosine similarity поиск
similarities = np.dot(self.face_db['embeddings'], query_emb) / (
np.linalg.norm(self.face_db['embeddings'], axis=1) *
np.linalg.norm(query_emb)
)
best_idx = np.argmax(similarities)
best_sim = similarities[best_idx]
if best_sim < self.threshold:
return None
return {
'id': self.face_db['ids'][best_idx],
'name': self.face_db['names'][best_idx],
'similarity': float(best_sim)
}
Модели для embedding извлечения
ArcFace (InsightFace) — стандарт индустрии. LFW accuracy: 99.83%, IJB-C TAR@FAR=1e-4: 96.5%. Размер embedding: 512 dimensions.
FaceNet (Google) — более ранняя модель, всё ещё популярная. LFW: 99.65%. Размер embedding: 128 или 512 dimensions.
MagFace — улучшенный ArcFace с масштабируемым margin. IJB-C: 97.1%.
Для edge-устройств: MobileFaceNet — 1MB, работает на мобильных устройствах, LFW: 99.5%.
Масштабируемость базы лиц
При малой базе (< 10k лиц) — брутфорс cosine similarity работает мгновенно. Для больших баз — approximate nearest neighbor (ANN):
import faiss
class FaceDatabase:
def __init__(self, dimension: int = 512):
# FAISS IVF индекс для million-scale баз
quantizer = faiss.IndexFlatIP(dimension) # Inner Product = cosine sim
self.index = faiss.IndexIVFFlat(quantizer, dimension, 100)
self.index.nprobe = 10 # качество vs скорость поиска
def add_faces(self, embeddings: np.ndarray):
# Нормализуем для cosine similarity через IP
faiss.normalize_L2(embeddings)
if not self.index.is_trained:
self.index.train(embeddings)
self.index.add(embeddings)
def search(self, query: np.ndarray, k: int = 5):
faiss.normalize_L2(query.reshape(1, -1))
similarities, indices = self.index.search(query.reshape(1, -1), k)
return similarities[0], indices[0]
FAISS IVFFlat: поиск среди 1M лиц за < 1ms на CPU.
Работа с качеством изображения
Система реального мира работает с нечёткими, частично закрытыми, плохо освещёнными лицами. Меры:
- Face quality score — перед добавлением в базу и перед идентификацией оцениваем качество кропа (BRISQUE или специализированный FaceQNet). Отклоняем низкокачественные изображения
- Anti-spoofing — защита от фотографий и экранов: MiniFASNet, CDCN. FAS (Face Anti-Spoofing) должен быть обязательным компонентом для production-систем
- 3D liveness detection — через IR-камеру или depth-сенсор (Face ID-подобный подход)
Правовые и этические аспекты
Система распознавания лиц требует соответствия законодательству: GDPR в ЕС, 152-ФЗ в России. Биометрические данные — специальная категория персональных данных. Обязательны: явное информированное согласие, шифрование базы embeddings, журналирование доступа, право на удаление.
Этапы разработки
Аудит требований: 1:1 верификация или 1:N идентификация, масштаб базы, целевое железо. Сбор тестового датасета из реальных условий (освещение, углы съёмки, камеры). Выбор и настройка embedding-модели, anti-spoofing. Построение базы и настройка порога similarity. Интеграция, нагрузочное тестирование, мониторинг FAR/FRR.
| Масштаб системы | Срок |
|---|---|
| Верификация (1:1), до 1000 пользователей | 3–4 недели |
| Идентификация 1:N, до 100k лиц | 5–8 недель |
| Enterprise-система, 1M+ лиц, multi-camera | 10–16 недель |







