Как выбрать модель распознавания лиц: тесты 1:1, 1:N и подбор порога
Практическое руководство в духе FRVT по выбору модели распознавания InsightFace, построению бенчмарков 1:1 и 1:N, подбору порога и принятию решения о переходе с открытых пакетов на коммерческие модели InsightFace.
Что вы настроите
Большинство ошибок в системах распознавания лиц возникает не в коде, а на этапах выбора модели и подбора порога. Модель, занимающая высокие места в публичных рейтингах, может вести себя на ваших данных совершенно иначе, потому что у вас другая рабочая точка, другое распределение по демографии, другое качество съёмки и другой размер галереи.
В этом руководстве предложен независимый от вендора подход к оценке, согласованный с методологией NIST FRVT. Рассмотрены различия 1:1 и 1:N, действительно значимые метрики, способ построения воспроизводимого теста, ориентировочные публичные показатели открытых пакетов InsightFace, а также условия, при которых имеет смысл переходить на коммерческие модели InsightFace, и что именно — в конкретных числах — означает их более высокая точность.
Перед началом
- Опыт запуска InsightFace через Python-пакет insightface или ONNX Runtime для детекции, выравнивания и извлечения эмбеддингов.
- Репрезентативная валидационная выборка, охватывающая демографию, возрастной диапазон, позы, освещение, окклюзии (маска, очки, волосы), качество камеры и дистанцию съёмки реального трафика.
- Базовое владение numpy и scikit-learn для построения ROC, DET и анализа распределений сходства.
- Чётко заданная целевая рабочая точка в виде FMR или FPIR (например, FMR = 1e-5), а не просто процент точности.
1. Определите, у вас задача 1:1 или 1:N
1:1-верификация отвечает на вопрос «это тот же человек, кем он себя называет?». Она сравнивает один шаблон-зонда с одним зарегистрированным шаблоном и возвращает оценку схожести и решение «совпало/не совпало». Типичные сценарии: разблокировка устройства, KYC (селфи против документа), подтверждение оплаты, повторная аутентификация.
1:N-идентификация отвечает на вопрос «кто этот человек среди N зарегистрированных, если он там вообще есть?». Она сравнивает зонд с галереей из N шаблонов и возвращает список кандидатов. Типичные сценарии: турникеты, оповещения по спискам наблюдения, учёт посещаемости, дедупликация. Модель, лидирующая в LFW 1:1, не масштабируется автоматически на 1:N с галереей в 10^5 или 10^6 — именно поэтому NIST публикует FRVT 1:1 и FRVT 1:N как два разных отчёта.
- В трафике 1:1 преобладают сравнения «один и тот же человек»; цена ложного совпадения — на каждую транзакцию.
- В трафике 1:N преобладают сравнения с другими людьми (в системах наблюдения большинство зондов вообще нет в галерее); частота ложных срабатываний растёт пропорционально N.
- Сначала зафиксируйте задачу. Один и тот же backbone требует разных порогов для 1:1 и 1:N.
2. Используйте метрики в стиле FRVT
Откажитесь от «accuracy» как единственного числа. В отчётах FRVT при фиксированной рабочей точке приводят две дополняющие друг друга ошибки и строят кривую, чтобы был виден компромисс.
Для 1:1 — FMR (False Match Rate) и FNMR (False Non-Match Rate). Зафиксируйте целевой FMR (как правило, 1e-4, 1e-5 или 1e-6) и сообщайте FNMR именно в этой точке. Для 1:N — FPIR (False Positive Identification Rate) и FNIR (False Negative Identification Rate). Всегда указывайте размер галереи N, ранг и тип задачи: closed-set (зонд всегда в галерее) или open-set (может отсутствовать).
- Любую метрику публикуйте вместе с порогом; FNMR без FMR и FNIR без FPIR не имеют смысла.
- Стройте DET (Detection Error Tradeoff), а не ROC — DET читается удобнее в области малых ошибок.
- Приводите числа в разрезе демографических страт, а не только средние, в духе исследований FRVT по демографическим эффектам.
3. Соберите тестовый набор, который выдержит проверку
Mate-пары и non-mate-пары формируются раздельно. Чтобы статистически значимо оценить FMR = 1e-6 в 1:1, нужно порядка 10 / FMR = 10^7 сравнений между разными людьми. Использовать один и тот же зонд в нескольких парах допустимо, но эффективный размер выборки нужно честно указывать.
Стратифицируйте по демографической группе, устройству съёмки, помещению/улице, возрастному разрыву между регистрацией и зондом, типу окклюзии и позе головы. Сообщайте метрики по стратам, а не только в среднем. Тестовые данные должны быть строго отделены от обучения, дообучения и предобучения (Glint360K, WebFace42M, MS1MV3 и т. п.); фиксируйте источник данных и согласия.
- Используйте не меньше 10 / целевой FMR сравнений между разными людьми, иначе доверительный интервал FMR будет очень широким.
- Заморозьте тестовый набор. Тестовый набор, под который постоянно подкручивают параметры, фактически становится валидационным.
- Поддерживайте небольшой «золотой» подмножество, заблокированное и пересчитываемое при любой смене модели или предобработки.
4. Эмбеддинги, схожесть и пороги
Используйте официальную предобработку пакета: детекция RetinaFace или SCRFD, выравнивание по 5 точкам, кроп 112x112 RGB, mean/std из самого пакета распознавания. Расхождение в предобработке — главная причина того, что заявленные числа не воспроизводятся.
Стандартизируйте косинусное сходство по эмбеддингам, нормированным по L2. В Python-API InsightFace для этого есть face.normed_embedding. Порог выбирается на валидационной выборке, фиксируется и затем оценивается на тесте; выбор порога на тесте искусственно завышает результаты.
- Типичные пороги 1:1 для пакетов InsightFace при FMR = 1e-4 — 1e-5 укладываются в косинус 0,30–0,45; конкретное значение зависит от backbone, обучающих данных и вашей популяции, поэтому всегда пересчитывайте.
- При смещении распределения галереи между развёртываниями помогает score-нормализация (z-norm, t-norm).
- После любого дообучения порог пересчитывайте; никогда не переносите порог между версиями модели.
import numpy as np
from insightface.app import FaceAnalysis
app = FaceAnalysis(
name="buffalo_l",
providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
)
app.prepare(ctx_id=0, det_size=(640, 640))
def embed(image_bgr):
faces = app.get(image_bgr)
if not faces:
return None
# use the largest detected face
face = max(faces, key=lambda f: (f.bbox[2] - f.bbox[0]) * (f.bbox[3] - f.bbox[1]))
return face.normed_embedding.astype(np.float32) # already L2-normalized
def cosine(a, b):
return float(np.dot(a, b)) # both vectors are already L2-normalizedimport numpy as np
# scores collected on a held-out validation split
genuine = np.array(genuine_scores) # same person pairs
impostor = np.array(impostor_scores) # different people pairs
# pick the operating point you must defend in production
target_fmr = 1e-5
# threshold = score above which (1 - target_fmr) of impostors fall
threshold = float(np.quantile(impostor, 1.0 - target_fmr))
fnmr = float(np.mean(genuine < threshold))
print(f"threshold = {threshold:.4f}")
print(f"FNMR @ FMR = {target_fmr:.0e} -> {fnmr:.4f}")import numpy as np
# gallery_emb: (N, d) L2-normalized embeddings of enrolled identities
# probe_emb: (P, d) L2-normalized embeddings of probes
# probe_label: (P,) ground-truth gallery index, or -1 for non-mate probes (open-set)
scores = probe_emb @ gallery_emb.T # (P, N) cosine similarity
top1_idx = scores.argmax(axis=1)
top1_score = scores.max(axis=1)
# choose threshold from validation, then evaluate FPIR / FNIR
threshold = 0.40
mate = probe_label >= 0
non_mate = ~mate
fnir = float(np.mean(
(top1_idx[mate] != probe_label[mate]) | (top1_score[mate] < threshold)
))
fpir = float(np.mean(top1_score[non_mate] >= threshold))
print(f"FNIR = {fnir:.4f}, FPIR = {fpir:.4f} at threshold {threshold:.2f}")5. Бенчмарк открытых моделей InsightFace
Python-пакет insightface распространяет готовые модельные пакеты, объединяющие детектор и backbone распознавания. Чаще всего используются buffalo_sc и buffalo_s (мобильные / edge), buffalo_m (сбалансированный), buffalo_l с головой w600k_r50 (серверный по умолчанию) и antelopev2 с головой glintr100 (большой серверный). В Model Zoo доступны также «голые» веса R50 и R100 ArcFace.
Публичные результаты на стандартных академических наборах (LFW, CFP-FP, AgeDB-30, IJB-B, IJB-C) задают порядок величины ниже. Используйте их как ориентир и обязательно пересчитайте на своих данных.
- Точность LFW 1:1: 99,50 % (мобильный MBF) — 99,85 % (R100, w600k_r50). LFW насыщен и годится только как базовая проверка.
- CFP-FP (фронтально vs профиль): 96–99 % по линейке, класс R100 заметно впереди на профильных снимках.
- AgeDB-30: 96–98,5 % по линейке; крупные пакеты лучше переносят разрыв в возрасте.
- IJB-C TAR @ FAR = 1e-4: примерно 90–93 % для MBF / мобильных, 95–96 % для R50, 96–97,5 % для R100 / w600k_r50 / glintr100.
- MFR (Multi-racial Face Recognition, протокол челленджей ICCV-21 / 22 с когортами African, Caucasian, East Asian, South Asian и Mixed при FMR = 1e-6 / 1e-5): разрыв TAR между лучшей и худшей когортой увеличивается по мере уменьшения модели. Пакеты класса R100 (w600k_r50, glintr100) обычно укладываются в несколько процентных пунктов между когортами, R50 расходится до средне-однозначных значений, а мобильный MBF на самой сложной когорте может давать двузначный разрыв — обязательно воспроизведите этот тест на собственном населении до того, как фиксировать рабочую точку.
- Пропускная способность (одна GPU, batch 32, FP16): MBF — несколько тысяч эмбеддингов в секунду, R100 — порядка нескольких сотен. Всегда замеряйте на целевом железе.
6. Подбор открытого пакета под нагрузку
Для большинства продуктовых задач выбор сводится к двум открытым пакетам: buffalo_s (и его более лёгкий вариант buffalo_sc) — для мобильных и edge-сценариев, и buffalo_l — для серверных.
buffalo_s / buffalo_sc — правильный выбор для разблокировки лица на устройстве, интеграций мобильного SDK, встраиваемых боксов и любых задач, где латентность и размер бинарника важнее абсолютной точности. buffalo_l (w600k_r50) — правильный выбор для серверного распознавания: 1:1-верификация, 1:N-идентификация на галереях до нескольких сотен тысяч личностей и целевой FMR около 1e-5.
- Мобайл / edge: берите buffalo_s, а при ограниченной памяти или вычислительном бюджете — buffalo_sc.
- Сервер: берите buffalo_l. Это самый сильный открытый пакет распознавания, который мы поставляем, и он подходит для большинства сценариев верификации и идентификации в кооперативной съёмке.
- Для большинства продуктовых функций при FMR >= 1e-5 на кооперативной съёмке открытых пакетов достаточно. За пределами этой точки см. следующий раздел.
7. Когда переходить на коммерческие модели InsightFace
Коммерческие модели распознавания InsightFace обучаются на существенно более крупных и разнообразных наборах личностей с собственными формулами потерь и рецептами обучения и поставляются с задокументированными рабочими точками и подписанными артефактами. Это не «та же открытая модель, только пожирнее».
В числах: на внутренних демографически сбалансированных протоколах 1:1 при FMR = 1e-6 коммерческие модели обычно снижают FNMR в 2–5 раз по сравнению с самым сильным открытым пакетом (например, FNMR падает с примерно 5–8 % до 1–2 % на сложных подмножествах вроде маски, большой позы или низкого разрешения). На демографически сбалансированном 1:N с галереями от 1 млн+ FNIR при фиксированном FPIR снижается в сходных пропорциях, а разрыв между лучшей и худшей демографической подгруппой в строгих рабочих точках сужается.
Чтобы решение о переходе можно было легко проверить на ваших собственных данных, мы предлагаем 2-недельную бесплатную оценку коммерческих моделей распознавания после подписания предварительного соглашения о сотрудничестве (NDA / пилотного соглашения). На время триала вы получаете ограниченный во времени доступ к артефактам коммерческой модели или к хостовому API, можете запустить те же FRVT-стиль тесты 1:1 и 1:N, описанные в этом руководстве, и сравнить цифры напрямую с используемым сейчас открытым пакетом — до каких-либо коммерческих обязательств.
- Выбирайте коммерческие модели при работе на FMR <= 1e-6, например для пограничного контроля, авторизации платежей, регулируемого KYC.
- Выбирайте их, когда галерея превышает 100 тыс.–1 млн личностей и важна стабильность Rank-1.
- Выбирайте их, когда аудит справедливости требует сократить разрыв между лучшей и худшей демографической подгруппой в строгих точках.
- Выбирайте их, когда в продакшне есть тяжёлые условия: сильная окклюзия, большая поза, низкое разрешение (межзрачковое расстояние меньше ~48 пикселей), некооперативная съёмка.
- Выбирайте их, когда нужны корпоративный SLA, on-prem-лицензирование, встроенный PAD / liveness, подписанные артефакты модели и контрактные гарантии.
- Подпишите предварительное соглашение о сотрудничестве, чтобы запустить 2-недельную бесплатную оценку на собственных данных до коммерческих обязательств.
8. Запуск в продакшн и постоянная переоценка
Артефакт модели (криптографический хэш), код предобработки, порог и определение метрик фиксируйте как единый релиз. Изменение предобработки незаметно сдвигает FMR, поэтому версионирование предобработки важно не меньше, чем версионирование весов.
Регулярно — не реже раза в квартал — переоценивайте систему на свежих продуктовых выборках. Самая важная боевая метрика — это FMR при текущем продакшн-пороге, посчитанный на свежем impostor-наборе; он показывает, выполняется ли ещё рабочая точка, обещанная бизнесу.
- Отслеживайте дрейф FMR / FNMR, частоту ложных тревог, частоту override-ов оператора и демографические дельты совместно.
- Имейте план отката. Порог и модель версионируются вместе; нельзя откатывать что-то одно.
- При смене модели сначала пересчитайте порог и публично переутвердите рабочую точку, и только потом переключайте трафик.
Нужна помощь с production-развертыванием?
Свяжитесь с InsightFace по вопросам лицензирования моделей, оптимизации runtime и поддержки целевого hardware.
Связаться