← 返回教程
人脸识别1:1 验证1:N 识别FRVT基准评测阈值

如何选择人脸识别模型:1:1 与 1:N 测试和阈值选择

对齐 FRVT 评测理念的实操指南,覆盖 InsightFace 模型选型、1:1 与 1:N 基准搭建、阈值确定,以及何时从开源模型升级到 InsightFace 闭源商业模型。

约 14 分钟

你将完成什么

人脸识别系统的多数事故并不是出现在代码上,而是出现在模型选型和阈值调优上。一个在公开榜单上靠前的模型,到了你的真实数据上仍然可能表现失常,原因往往在于工作点、人群分布、采集质量和底库规模都和榜单不一致。

本指南给出一套对齐 NIST FRVT 方法论、与厂商无关的评测框架,覆盖 1:1 与 1:N 的差异、真正该报告的指标、可复现测试的搭建方式、InsightFace 开源模型的公开指标量级,以及在什么情况下应该选择 InsightFace 闭源商业模型,并以具体数字解释“精度更高”到底意味着什么。

开始之前

  • 能够通过 insightface Python 包或 ONNX Runtime 运行人脸检测、对齐和特征提取。
  • 拥有一份具有代表性的验证集,覆盖线上流量的人群、年龄、姿态、光照、遮挡(口罩、眼镜、头发)、相机品质和采集距离。
  • 具备使用 numpy 与 scikit-learn 进行 ROC、DET 与相似度分布分析的基础能力。
  • 目标工作点必须以 FMR 或 FPIR 的形式明确给出(例如 FMR = 1e-5),而不是只给一个准确率百分数。

1. 先判断是 1:1 还是 1:N 问题

1:1 验证回答的是“当前人脸是否就是声称的那个人”。它把一张探针特征与一张已注册模板进行比对,输出相似度分数和同/异判定。常见场景包括设备解锁、KYC(自拍与证件照比对)、支付确认、二次认证。

1:N 识别回答的是“当前这个人是不是底库 N 个身份中的某一位,如果是,是谁”。它把一张探针与 N 条注册模板比对,输出候选列表。常见场景包括门禁通行、布控告警、考勤、身份去重。在 1:1 LFW 上靠前的模型,并不会自动在 10^5 或 10^6 量级的 1:N 底库上同样领先——NIST 之所以把 FRVT 1:1 与 FRVT 1:N 拆成两份独立报告,正是这个原因。

  • 1:1 流量以同人比对为主,误识的成本按笔结算。
  • 1:N 流量以异人比对为主(布控类应用中绝大多数探针都不在底库内),同一阈值下的误识率会随底库规模 N 上升。
  • 先确定业务形态再做选型,同一个 backbone 在 1:1 和 1:N 下往往要采用不同的阈值。

2. 采用 FRVT 风格的指标

不要用一个 “Accuracy” 数字概括一切。FRVT 报告在固定工作点上同时给出两类互补错误率,并以曲线呈现取舍关系。

1:1 用 FMR(误匹配率)和 FNMR(漏匹配率)。先确定目标 FMR(常见为 1e-4、1e-5、1e-6),再报告该点上的 FNMR。1:N 用 FPIR(错误正向识别率)和 FNIR(错误负向识别率),并必须同时声明底库规模 N、Rank、以及测试是闭集(探针一定在底库中)还是开集(探针可能不在底库中)。

  • 任何指标都必须连同阈值一起公布;不带 FMR 的 FNMR、不带 FPIR 的 FNIR 没有意义。
  • 用 DET(Detection Error Tradeoff)曲线代替 ROC,它在低错误率区间更易读。
  • 按人群分层报告指标,而不是只看总体平均,思路与 FRVT 的人口学效应研究保持一致。

3. 构建可经得住质询的测试集

Mate 对和 non-Mate 对要分别采样。对 1:1 来说,要在统计意义上可靠地估计 FMR = 1e-6,至少需要 10 / FMR = 10^7 量级的异人比对。允许同一张探针参与多个对,但要如实声明有效样本数。

在人群、采集设备、室内/室外、注册到探针的年龄差、遮挡类型、头部姿态等维度上分层,并按层报告指标,而不只是总平均。测试集必须与训练、微调和预训练数据(Glint360K、WebFace42M、MS1MV3 等)严格分离,并记录数据来源与授权情况。

  • 异人比对数量至少为 10 / 目标 FMR,否则 FMR 估计的置信区间会很宽。
  • 测试集要冻结。一份反复用于调参的测试集,本质上已经退化成验证集。
  • 维护一份小而锁定的“黄金子集”,每次更换模型或前处理都要重跑一次。

4. 计算特征、相似度与阈值

必须使用与模型配套的官方前处理:检测使用 RetinaFace 或 SCRFD,5 点对齐,112x112 RGB 裁剪,以及识别模型自带的 mean/std。前处理不一致是公开指标无法复现的最常见原因。

统一使用 L2 归一化特征上的余弦相似度。InsightFace Python API 中 face.normed_embedding 即是这个。阈值必须在验证集上选定并冻结,再到测试集上评估;在测试集上选阈值会人为放大结果。

  • InsightFace 识别模型在 FMR = 1e-4 ~ 1e-5 下的 1:1 阈值通常落在余弦 0.30 ~ 0.45 之间,但具体值取决于 backbone、训练数据和你的人群,必须重新计算。
  • 当不同部署之间底库分布发生变化时,可使用 z-norm / t-norm 等分数归一化。
  • 做过微调,就必须重新计算阈值,绝不可跨模型版本沿用。
提取并 L2 归一化特征
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-normalized
按目标 1:1 FMR 搜索阈值
import 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}")
在开集 1:N 测试中计算 FPIR / FNIR
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 开源模型的基准评测

insightface Python 包提供把检测器和识别 backbone 打包好的开箱即用模型包。常用识别包包括 buffalo_sc 与 buffalo_s(移动 / 边缘端),buffalo_m(均衡),带 w600k_r50 头的 buffalo_l(服务端默认),以及带 glintr100 头的 antelopev2(大型服务端)。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:MBF / 移动端约 90-93%,R50 约 95-96%,R100 / w600k_r50 / glintr100 约 96-97.5%。
  • 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)一般可把各子集 TAR 控制在数个百分点以内;R50 会扩大到中位数百分点;移动端 MBF 在最难子集上甚至可能出现两位数差距。在确定线上工作点之前,请务必在自家人群分布上重新复现这一指标。
  • 吞吐(单 GPU、batch 32、FP16):MBF 每秒可达数千次特征提取,R100 在每秒数百次量级,请务必在目标硬件上实测。

6. 按业务负载匹配开源模型包

实际产品研发中通常只需要在两类开源模型之间做选择:移动 / 边缘端选 buffalo_s(更轻量的版本是 buffalo_sc),服务端选 buffalo_l。

buffalo_s / buffalo_sc 适用于端上人脸解锁、移动端 SDK 集成、嵌入式盒子等场景,这类负载下延迟与包体积比绝对精度更重要。buffalo_l(w600k_r50)则适用于一切服务端识别场景:1:1 验证、底库在数十万级以内的 1:N 识别,目标 FMR 约 1e-5。

  • 移动 / 边缘端:选 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%)。在底库 100 万级以上、人群均衡的 1:N 协议上,固定 FPIR 下的 FNIR 也以相近比例下降,最优与最差人群子组在严苛工作点上的差距同时收窄。

为方便您在自家数据上验证升级决策,我们提供闭源识别模型的 2 周免费评测。在签署前期合作协议(NDA / 试用协议)后即可开通:评测期间您将获得对闭源模型工件或托管 API 的限期访问,可直接按本指南所述的 FRVT 风格 1:1 / 1:N 测试方法运行评测,并与当前使用的开源模型对比真实数值,再决定是否进入正式商务流程。

  • 工作点要求达到 FMR <= 1e-6,例如边检、支付授权、监管级 KYC,应选闭源模型。
  • 底库规模在 10 万到 100 万以上、对 Rank-1 稳定性有明确要求时,应选闭源模型。
  • 需要满足公平性审计、在严苛工作点上缩小最优与最差人群子组差距时,应选闭源模型。
  • 线上包含强遮挡、大姿态、低分辨率(瞳距小于约 48 像素)、非配合采集等困难条件时,应选闭源模型。
  • 需要企业级 SLA、私有化部署、集成 PAD / 活体检测、签名模型工件以及合同保障时,应选闭源模型。
  • 签署前期合作协议后,可在正式商务签约前先在自家数据上完成 2 周免费评测。

8. 上线发布与持续评估

把模型工件(加密哈希)、前处理代码路径、阈值和指标定义作为同一个发布单元锁定下来。前处理变化会悄悄改变 FMR,因此对前处理的版本管理至少和权重一样重要。

至少每季度一次,使用新鲜的线上样本重新评估。最重要的线上指标是当前生产阈值上的 FMR(在新一批 impostor 集合上重新计算),它告诉你当初对业务承诺的工作点现在是否依然成立。

  • 把 FMR / FNMR 漂移、误警率、人工复核改判率、人群差异同时纳入监控。
  • 必须有回滚预案,阈值与模型共版本管理,禁止只回滚其中之一。
  • 更换模型时务必先重新算阈值并重新公布工作点,再切流。

需要生产部署支持?

联系 InsightFace,获取模型授权、运行时优化和目标硬件部署支持。

联系我们