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.py | 1:1 验证脚本 | MXNet 模型版,输出 ROC 与 TPR@FPR 表格 |
| ijb_1n.py | 1:N 识别脚本 | MXNet 模型版,输出 Top-1/5/10 与 FAR/TPR |
| ijb_evals.py | 统一评测框架 | 支持 MXNet / PyTorch / ONNX / Keras 四种后端,封装 1:1、1:N 与批量模式 |
| ijb_onnx.py | ONNX 专用脚本 | 基于insightfacePython 包与ArcFaceONNX模型类,DataLoader 批量化抽取特征 |
其中ijb_evals.py是功能最完整的统一入口(新代码优先推荐),ijb_11.py/ijb_1n.py是面向 MXNet 训练产物的经典脚本,ijb_onnx.py则适合已有 ONNX 导出模型的场景。下文逐一讲解。
三、数据与目录准备
3.1 数据集申请与元数据
按照 README.md 的说明:
- 自行向 IARPA 申请IJB-B与IJB-C原始数据集,遵守分发许可;
- 下载评测所需的模型、代码、数据与 meta 信息压缩包(GDrive 或百度网盘);
- 若有需要,下载更新后的 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 probeIJBB 对应文件名为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.log与ijbb_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-epoch | 1 | 加载的模型 epoch(int) |
--gpu | 7 | GPU id |
--batch-size | 32 | 推理 batch size |
--job | insightface | 任务名,用于命名输出文件 |
--target | IJBC | 评测目标,只能是IJBC或IJBB |
脚本内部还固定开启了三种评测模式(对应 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)实现了两级聚合:
- 媒体级:同一媒体(如同一视频片段)内的多张图像特征先取均值,得到单条媒体特征;
- 模板级:模板内所有媒体特征求和,再经
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_curve与auc,在 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的关键差异点:
- 读取 gallery 与 probe 的模板-主体映射(
read_template_subject_id_list,ijb_1n.py); - 将 gallery 的 G1/G2(或 S1/S2)两组模板合并,与 probe 一起通过
image2template_feature聚合出模板特征; gen_mask建立 probe 主体与 gallery 主体的对应关系(ijb_1n.py);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_interf:load_checkpoint加载 MXNet 符号模型,取fc1_output为嵌入层;Torch_model_interf:要求模型为TorchScript(torch.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_file | None | 模型文件:kerash5/ torch jitpth/onnx/ mxnet(前缀,epoch) |
-d, --data_path | ./ | 包含IJBB、IJBC子目录的数据集根路径 |
-s, --subset | IJBC | 评测目标:IJBB或IJBC |
-b, --batch_size | 128 | 特征抽取 batch size |
-R, --save_result | IJB_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 IJBC8 种组合由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=4、prefetch=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),仅供参考