InsightFace 中 IJB-B/IJB-C 评估指南:1:1 与 1:N 协议的人脸识别评测全流程
2026/9/11 22:54:47 网站建设 项目流程

InsightFace 中 IJB-B/IJB-C 评估指南:1:1 与 1:N 协议的人脸识别评测全流程

【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface

本篇技术指南聚焦 InsightFace 人脸识别项目中的权威评测基准——IARPA Janus Benchmark-B(IJB-B)与 Benchmark-C(IJB-C)。它面向需要复现论文图表、验证自研模型泛化能力的开发者:读完本文,你将掌握从申请数据集、准备 meta 信息,到运行 1:1 模板对验证(template-to-template verification)与 1:N 检索识别(identification)两个协议,再到输出 ROC 曲线、TPR@FPR 表格与 CMC 曲线的完整实操流程,并理解这套评测脚本的底层实现原理。

IJB-B / IJB-C 是 ArcFace 等主流人脸识别算法论文中必备的评测基准,用于衡量模型在跨姿态、跨年龄、多图像/视频模板场景下的真实泛化能力。本文以仓库中 recognition/evaluation/ijb/README.md 为主线,结合同目录下的 example.sh、ijb_11.py、ijb_1n.py、ijb_evals.py 与 ijb_onnx.py 逐层展开。

一、评测背景:IJB-B / IJB-C 是什么

IJB-B 与 IJB-C 由 IARPA(Intelligence Advanced Research Projects Activity)发起构建,分别发表于 CVPR Workshops 2017(Whitelam 等,[6])与 ICB 2018(Maze 等,[7])。与 LFW、MegaFace 等以“单张正脸照”为主的评测集不同,IJB 系列的特点是:

  • 模板(Template)与媒体(Media)层级:一个人物(subject)的多个图像/视频片段被组织为一个模板,评测以模板为单位进行相似度计算,更加贴近真实安防场景中“多帧融合”的识别方式;
  • 跨姿态、跨年龄:数据来源包含网络照片、视频抽帧等,姿态、光照、年龄跨度大,难度显著高于传统静态人脸评测;
  • 两套官方协议
    • 1:1 验证(Verification):给定模板对(template pair)与标签,计算模板间相似度,输出 ROC 曲线与 TPR@FPR;
    • 1:N 识别(Identification):给定 probe(查询模板)与 gallery(注册库模板),输出 Top-1/5/10 准确率以及 FAR/TPR(或称 DIR/FAR)曲线。

仓库中 recognition/evaluation/ijb/README.md 明确指出:IJB-B 与 IJB-C 数据集需要自行向 IARPA 申请,并严格遵守其分发许可协议。评测所需的模型、代码、数据与 meta 信息则通过网盘统一提供(文中给出了 GDrive 与百度网盘两种渠道,其中更新后的 1:1 与 1:N meta 数据单独发布,百度网盘提取码为7g8o)。

注意:本仓库只提供评测脚本与流程说明,不包含 IJB 数据本体。申请到原始数据集后,需按脚本约定的目录结构摆放loose_crop图片与meta目录(详见下文)。

二、目录结构与脚本家族

recognition/_evaluation_/ijb/目录下共包含 6 个文件,构成两代评测工具链:

文件角色说明
README.md指南数据/模型获取方式、致谢与参考文献
example.sh启动示例同时后台运行 1:1(IJBC)与 1:N(IJBB)评测
ijb_11.py1:1 验证脚本MXNet 模型版,输出 ROC 与 TPR@FPR 表格
ijb_1n.py1:N 识别脚本MXNet 模型版,输出 Top-1/5/10 与 FAR/TPR
ijb_evals.py统一评测框架支持 MXNet / PyTorch / ONNX / Keras 四种后端,封装 1:1、1:N 与批量模式
ijb_onnx.pyONNX 专用脚本基于insightfacePython 包与ArcFaceONNX模型类,DataLoader 批量化抽取特征

其中ijb_evals.py是功能最完整的统一入口(新代码优先推荐),ijb_11.py/ijb_1n.py是面向 MXNet 训练产物的经典脚本,ijb_onnx.py则适合已有 ONNX 导出模型的场景。下文逐一讲解。

三、数据与目录准备

3.1 数据集申请与元数据

按照 README.md 的说明:

  1. 自行向 IARPA 申请IJB-BIJB-C原始数据集,遵守分发许可;
  2. 下载评测所需的模型、代码、数据与 meta 信息压缩包(GDrive 或百度网盘);
  3. 若有需要,下载更新后的 1:1 与 1:N meta 数据(README 中单独列出了百度网盘与 GDrive 两份更新链接)。

脚本运行所依赖的目录结构(相对当前工作目录)如下:

IJBC/ ├── loose_crop/ # 按 meta 中图片名对应的裁剪人脸图 └── meta/ ├── ijbc_face_tid_mid.txt # 图片名 模板id(tid) 媒体id(mid) ├── ijbc_template_pair_label.txt # 模板1 模板2 标签(1/0) ├── ijbc_name_5pts_score.txt # 图片名 5点关键点(10个数) 人脸得分 ├── ijbc_1N_gallery_G1.csv # 1:N gallery 第一组 ├── ijbc_1N_gallery_G2.csv # 1:N gallery 第二组 └── ijbc_1N_probe_mixed.csv # 1:N probe

IJBB 对应文件名为ijbb_*。其中 gallery 文件在 IJB-B 中名为ijbb_1N_gallery_S1.csv/S2.csv,在 IJB-C 中名为G1.csv/G2.csv——这一差异在 ijb_1n.py 和 ijb_evals.py 中通过条件分支显式处理。

3.2 元数据格式说明

各 meta 文件的解析方式可以从源码直接确认(ijb_11.py):

  • *_face_tid_mid.txt:以空格分隔,第 2 列为模板 id(tid)、第 3 列为媒体 id(mid),用于把图像特征聚合为模板特征;
  • *_template_pair_label.txt:以空格分隔,前两列为模板 id 对,第三列为标签(1 表示同一人、0 表示不同人),用于 1:1 验证;
  • *_name_5pts_score.txt:每行格式为图片名 x1 y1 x2 y2 ... x5 y5 人脸得分,前 10 个数为 5 个关键点的 (x, y) 坐标,最后一个数为检测器给出的人脸得分(faceness score);
  • 1:N 的*.csv:首行表头,之后每行为模板id, 主体id(subject id)

3.3 数据规模参考

从 ijb_evals.py 中保留的注释可以看到 IJBC 的规模细节,供读者核对数据完整性:

  • 图像总数约227,630张,唯一模板12,115个;
  • 1:1 模板对约8,010,270个(其中正样本对 10,270、负样本对 800 万);
  • 1:N 协议中 gallery G1/G2 特征矩阵形状为(1772, 512)(1759, 512),probe 特征矩阵为(19593, 512)
  • 人脸得分分布高度集中,约 22.4 万张图得分在 0.9 附近,少量噪声样本得分低至 0.1。

四、快速开始:example.sh 一键评测

example.sh 给出了最直接的用法,同时后台启动 1:1 与 1:N 两个评测任务:

#!/usr/bin/env bash python -u ijb_11.py --model-prefix ./pretrained_models/r100-arcface/model --model-epoch 1 --gpu 0 --target IJBC --job arcface > ijbc_11.log 2>&1 & python -u ijb_1n.py --model-prefix ./pretrained_models/r100-arcface/model --model-epoch 1 --gpu 0 --target IJBB --job arcface > ijbb_1n.log 2>&1 &

该示例的含义:

  • 评测模型为r100-arcface(ResNet100 + ArcFace),模型前缀指向./pretrained_models/r100-arcface/model
  • --model-epoch 1指定加载第 1 个 epoch 的 checkpoint(MXNet 的model-symbol.json+model-0001.params形式);
  • 1:1 评测在IJBC上执行,1:N 评测在IJBB上执行,输出分别重定向到ijbc_11.logijbb_1n.log,便于后台观察进度。

需要说明的是,脚本通过sys.path.append('./recognition')导入Embedding类(见 ijb_11.py),因此需要在仓库根目录或包含recognition包的环境中运行。

五、1:1 模板验证协议(ijb_11.py)

5.1 命令行参数

i jb_11.py 定义的参数如下:

参数默认值说明
--model-prefix''MXNet 模型前缀路径
--model-epoch1加载的模型 epoch(int)
--gpu7GPU id
--batch-size32推理 batch size
--jobinsightface任务名,用于命名输出文件
--targetIJBC评测目标,只能是IJBCIJBB

脚本内部还固定开启了三种评测模式(对应 IJB 评测常见的 N1/D1/F1 组合,见 ijb_11.py):

use_norm_score = True # if True, TestMode(N1):保留特征范数信息 use_detector_score = True # if True, TestMode(D1):用人脸得分加权 use_flip_test = True # if True, TestMode(F1):水平翻转测试

注意:use_flip_test实际采用的是F2(相加)模式而非 F1(拼接)模式——特征由网络直接输出原图与翻转图拼接后的2×feat_dim向量,代码将前半与后半相加:img_input_feats = img_feats[:, 0:d//2] + img_feats[:, d//2:](见 ijb_11.py)。

5.2 五步评测流水线

ijb_11.py的主流程分为五个步骤:

Step 1:加载元数据。读取{target}/meta/{target}_face_tid_mid.txt{target}_template_pair_label.txt,得到模板-媒体映射和模板对标签。

Step 2:抽取图像特征。遍历{target}/meta/{target}_name_5pts_score.txt,对每张图读取裁剪人脸(loose_crop)、按 5 点关键点对齐后送入Embedding模型得到特征,同时记录每张图的人脸得分(ijb_11.py)。

Step 3:聚合模板特征。核心函数image2template_feature(ijb_11.py)实现了两级聚合:

  1. 媒体级:同一媒体(如同一视频片段)内的多张图像特征先取均值,得到单条媒体特征;
  2. 模板级:模板内所有媒体特征求和,再经sklearn.preprocessing.normalize做 L2 归一化。

该聚合方式正是 IJB 协议的精髓——人脸得分与特征范数可用于降低噪声样本(非人脸)的权重。

Step 4:计算模板对相似度。verification函数(ijb_11.py)通过template2id查表将模板 id 映射到索引,按100,000 对一批的方式分批计算余弦相似度(np.sum(feat1 * feat2, -1)),避免一次性加载全部对的内存压力。

Step 5:输出 ROC 与 TPR@FPR 表格。使用sklearn.metrics.roc_curveauc,在 FPR 取[1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1]六个档位处报告 TPR(百分比,保留两位小数),结果通过PrettyTable打印并以 PDF 形式保存 ROC 曲线(见 ijb_11.py)。分数矩阵以{job}.npy保存至{target}_result/目录,方便后续复用。

六、1:N 检索识别协议(ijb_1n.py)

6.1 流程概览

1:N 协议的目标是:给定 probe 模板集合,在 gallery 模板库中检索出对应的主体。ijb_1n.py的关键差异点:

  1. 读取 gallery 与 probe 的模板-主体映射(read_template_subject_id_list,ijb_1n.py);
  2. 将 gallery 的 G1/G2(或 S1/S2)两组模板合并,与 probe 一起通过image2template_feature聚合出模板特征;
  3. gen_mask建立 probe 主体与 gallery 主体的对应关系(ijb_1n.py);
  4. evaluation函数(ijb_1n.py)计算完整相似度矩阵np.dot(query_feats, gallery_feats.T),然后:
    • 按 Top-1 / Top-5 / Top-10 统计检索准确率;
    • 对 FAR ∈ {0.01, 0.1} 两个档位,利用heapq.nlargest高效找出负样本相似度阈值,计算对应的 TPR(召回率)。

6.2 与 1:1 的共性

无论是 1:1 还是 1:N,图像特征抽取、翻转相加、范数/人脸得分处理、媒体-模板两级聚合这四步是完全一致的,可以复用到不同脚本中,这也为ijb_evals.py统一框架的诞生埋下伏笔。

七、统一评测框架(ijb_evals.py):一脚本支持四种后端

ijb_evals.py是对上述两套脚本的现代化重构,用统一的IJB_test类覆盖 1:1、1:N 及批量测试,并支持MXNet / PyTorch / ONNX / Keras四种模型格式。

7.1 模型后端适配

框架通过四个接口类实现后端无关的模型调用(ijb_evals.py):

  • Mxnet_model_interfload_checkpoint加载 MXNet 符号模型,取fc1_output为嵌入层;
  • Torch_model_interf:要求模型为TorchScripttorch.jit.load),权重输入统一做(img - 127.5) * 0.0078125归一化;
  • ONNX_model_interf:基于onnxruntime.InferenceSession,同样做 127.5 均值归一化;
  • keras_model_interf:加载.h5模型,输入归一化同上。

IJB_test.__init__会根据model_file的后缀(.h5/.pth/.pt/.onnx/ 其他)自动选择对应接口(ijb_evals.py),因此切换模型框架时无需修改任何评测逻辑

7.2 特征抽取与缓存

  • get_embeddings(ijb_evals.py)按 batch 抽取原图与水平翻转图特征;
  • extract_IJB_data_11/extract_gallery_prob_data在首次解析 meta 后自动缓存为.npz备份,二次运行直接加载,--force_reload可强制重解析;
  • 支持--save_embeddings-P/--plot_only,可将特征或打分结果落盘,之后无需模型即可复现 ROC 与曲线图

7.3 命令行参数总览

参数默认值说明
-m, --model_fileNone模型文件:kerash5/ torch jitpth/onnx/ mxnet(前缀,epoch
-d, --data_path./包含IJBBIJBC子目录的数据集根路径
-s, --subsetIJBC评测目标:IJBBIJBC
-b, --batch_size128特征抽取 batch size
-R, --save_resultIJB_result/{model}_{subset}_{type}.npz结果保存/恢复文件
-L, --save_label额外保存标签数据(仅绘图用)
-E, --save_embeddings保存嵌入特征
-B, --is_bunch批量运行 N{0,1}D{0,1}F{0,1} 全部 8 种组合
-N, --is_one_2_N运行 1:N 而非 1:1
-F, --force_reload强制重新解析数据,不使用缓存
-P, --plot_only仅绘图模式,传入保存的结果文件

7.4 典型用法

# 1:1 验证(IJBC,ONNX 模型) python ijb_evals.py -m ./models/w600k_r50.onnx -d /path/to/ijb_data -s IJBC # 批量运行 8 种 N/D/F 组合(对照实验,验证各模式影响) python ijb_evals.py -m ./models/w600k_r50.onnx -d /path/to/ijb_data -s IJBB -B # 1:N 检索识别 python ijb_evals.py -m ./models/w600k_r50.onnx -d /path/to/ijb_data -s IJBC -N # 仅基于已保存结果绘图 python ijb_evals.py -P 'IJB_result/*.npz' -s IJBC

8 种组合由itertools.product([True, False], repeat=3)生成,命名规则为N{use_norm_score}D{use_detector_score}F{use_flip_test}(ijb_evals.py)。run_model_test_1N则会在 1:N 模式下输出 G1、G2 两组 gallery 的 TPR,并计算两者均值(ijb_evals.py)。

八、ONNX 专用评测脚本(ijb_onnx.py)

ijb_onnx.py是另一条轻量路径:直接基于insightfacePython 包中的ArcFaceONNX模型类(对应python-package/insightface/model_zoo/arcface_onnx.py)完成特征抽取。

它与ijb_evals.py的关键差异:

  • 使用mx.gluon.data.DataLoader(batch=128、num_workers=4prefetch=16)并行加载并对齐图片,输入是原图 + 水平翻转图拼接后的 batch,模型一次前向输出2×feat_dim维特征(ijb_onnx.py);
  • 对齐采用相似变换,目标关键点SRC在标准 112×112 五点上统一加 8.0 像素偏移(ijb_onnx.py),这对应 InsightFace 推理管线中常见的“扩展裁剪”策略;
  • 命令行参数为--model-file--image-path--result-dir--target,输出同样为{target}_result/{model_name}.npy分数文件与 TPR@FPR 表格(ijb_onnx.py)。

九、评测结果的解读与使用建议

9.1 指标口径

  • 1:1 验证:核心指标为TPR@FPR(如 FPR=1e-4 时的 TPR)与AUC。FPR 越低、TPR 越高,说明模型在低误报约束下的识别能力越强;
  • 1:N 识别:核心指标为Top-1/5/10 准确率FAR/TPR 曲线(在ijb_evals.py中称为 DIR/FAR)。注意 1:N 的 TPR 计算只统计“gallery 中存在对应主体”的 probe,evaluation_1N会把无对应主体的 probe 单独归入non_gallery_sims用于阈值估计(ijb_evals.py)。

9.2 模式开关对结果的影响

通过-B批量运行 8 种组合,可以系统观察三个因素对最终指标的影响:

  • use_norm_score(N):是否保留特征范数(人脸质量信号)参与聚合;
  • use_detector_score(D):是否用人脸得分给特征加权,抑制低质量/非人脸样本;
  • use_flip_test(F):是否启用水平翻转融合(F2 相加模式)。

一般经验上 D1 与 F1(即代码默认的use_detector_score=True, use_flip_test=True)组合能带来更稳定的结果,但具体收益应以实测为准——脚本保留这些开关正是为了做这类消融分析。

9.3 与其他评测的衔接

在 InsightFace 项目中,recognition/evaluation/ 目录还包含 MegaFace 评测(megaface/子目录),其 README.md 所述的 IJB 评测与 MegaFace 的“1:N 大规模检索”互为补充:前者侧重模板级跨模态难度,后者侧重百万级噪声库下的检索鲁棒性。训练与验证的更多细节可参考 recognition/README.md 与 recognition/datasets/README.md。

十、致谢与参考文献

IJB 评测工具链的建立离不开以下工作的启发,这也是 README.md 的致谢部分所明确声明的:

  • 1:1 协议:感谢 Weidi Xie 的指导(VGGFace2 人脸对齐/评测思路、Multicolumn Networks、Comparator Networks 相关工作),使 ArcFace 得以在 IJB-B / IJB-C 上完成 1:1 协议评测;
  • 1:N 协议:感谢 Yuge Huang 的代码(来自 Distribution Distillation Loss 工作)支持 1:N 协议评测。

完整文献清单(编号沿用原文档):

  • [1] Jiankang Deng, Jia Guo, Niannan Xue, Stefanos Zafeiriou.Arcface: Additive angular margin loss for deep face recognition. arXiv:1801.07698, 2018.
  • [3] Qiong Cao, Li Shen, Weidi Xie, Omkar M Parkhi, Andrew Zisserman.VGGFace2: A dataset for recognising faces across pose and age. FG, 2018.
  • [4] Weidi Xie, Andrew Zisserman.Multicolumn Networks for Face Recognition. BMVC 2018.
  • [5] Weidi Xie, Li Shen, Andrew Zisserman.Comparator Networks. ECCV, 2018.
  • [6] Whitelam, Cameron, et al.IARPA Janus Benchmark-B Face Dataset. CVPR Workshops, 2017.
  • [7] Maze, Brianna, et al.IARPA Janus Benchmark–C: Face Dataset and Protocol. ICB, 2018.
  • [8] Yuge Huang, Pengcheng Shen, Ying Tai, Shaoxin Li, Xiaoming Liu, Jilin Li, Feiyue Huang, Rongrong Ji.Distribution Distillation Loss: Generic Approach for Improving Face Recognition from Hard Samples. arXiv:2002.03662.

结语

本文完整梳理了 InsightFace 在 IJB-B / IJB-C 上的评测工具链:从数据申请与目录准备,到example.sh一键启动,再到ijb_11.py的 1:1 五步流水线、ijb_1n.py的 1:N 检索评估,以及面向多后端的统一框架ijb_evals.py和轻量级ijb_onnx.py。无论是复现 ArcFace 论文图表,还是对自研模型做 IJB 基准对齐,都可以在这套脚本基础上快速落地;而脚本中保留的 N/D/F 模式开关,也为深入研究“人脸得分加权、范数保留、翻转融合”对模板级识别性能的影响提供了现成的消融实验框架。

【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询