
InsightFace ICCV21-MFR 口罩人脸识别挑战赛基于 arcface_torch 的 PyTorch 训练与 ONNX 提交全指南【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightfaceICCV 2021 Masked Face RecognitionMFR挑战赛的 InsightFace Track 要求参赛者使用指定训练集Sub-Track A 为 MS1MV3、Sub-Track B 为 Glint360K训练人脸识别模型并将模型转换为 ONNX 格式提交至评测服务器。本指南以官方中文教程 tutorial_pytorch_cn.md 为主体结合仓库内 arcface_torch 工程源码完整讲解环境搭建、分布式训练、ONNX 导出与规范性检查、IJBC 公开集评测以及混合精度加速等全部实战环节。读完本文你将能够复现挑战赛 Baseline 的完整训练到提交流程并理解其背后的源码实现细节。竞赛背景与赛道规则速览在开始训练前建议先阅读 challenges/iccv21-mfr/README.md 了解完整的赛道规则。InsightFace Track 按训练数据集与推理耗时限制划分为两个子赛道Sub-Track A使用 MS1MV3 训练特征维度 ≤ 512Tesla V100 GPU 上推理时间 ≤ 10msSub-Track B使用 Glint360K 训练特征维度 ≤ 1024Tesla V100 GPU 上推理时间 ≤ 20ms。其它硬性约束还包括提交模型必须为 ONNX 格式且大小 ≤ 1GB输入形状必须为3x112x112RGB 顺序训练集与测试集均为 112x112 对齐禁止重新对齐禁止使用外部数据集与预训练模型匹配分数由余弦相似度衡量禁止 float-16 权重会导致模型大小估计错误在线评测服务器使用 onnxruntime-gpu1.6、cuda10.2、cudnn8.0.5。官方还明确禁止在 ONNX 图中插入数据相关算子实现隐式 batch 推理例如自动 flip-test。评测采用 TARMask 与 TARMR-All 加权排名公式为0.25 * TARMask 0.75 * TARMR-All。提交服务器地址为http://iccv21-mfr.com/面向非中国用户的备用服务器为http://124.156.136.55/。提交时需要将 onnx 模型打包为zip xxx.zip model.onnx每人每天最多提交三次。下载训练数据集官方教程指定了两个可用的训练数据集MS1MV3MS1M-RetinaFace约 93K 个身份、5.2M 张图像对应 Sub-Track A。下载说明见仓库内 recognition/datasets/README.mdMS1M-RetinaFace 部分以及 challenges/iccv19-lfr/README.md 中的数据准备指引Glint360K约 360K 个身份、17.1M 张图像对应 Sub-Track B。下载说明见 recognition/partial_fc/README.md 中的下载章节。两个数据集均以 InsightFace 风格的.rec记录文件形式提供。从 configs/ms1mv3_r50.py 与 configs/glint360k_r50.py 的配置可以看到对应的数据路径约定config.rec /train_tmp/ms1m-retinaface-t1 # MS1MV3 config.num_classes 93431 config.num_image 5179510 config.rec /train_tmp/glint360k # Glint360K config.num_classes 360232 config.num_image 17091657官方教程建议把数据集挂载到内存盘tmpfs以提升训练时的数据读取速度这也是默认配置注释中/train_tmp路径的由来具体做法见下文「训练加速技巧」小节。安装依赖1. 安装 PyTorch教程原始环境基于 PyTorch 1.7.1并给出了按 CUDA 版本区分的安装命令。先通过如下命令确认本机 CUDA 版本/usr/local/cuda/bin/nvcc -V然后按 CUDA 版本选择对应的安装命令Linux 与 Windows 通用# CUDA 11.0 pip install torch1.7.1cu110 torchvision0.8.2cu110 torchaudio0.7.2 -f https://download.pytorch.org/whl/torch_stable.html # CUDA 10.2 pip install torch1.7.1 torchvision0.8.2 torchaudio0.7.2 # CUDA 10.1 pip install torch1.7.1cu101 torchvision0.8.2cu101 torchaudio0.7.2 -f https://download.pytorch.org/whl/torch_stable.html # CUDA 9.2 pip install torch1.7.1cu92 torchvision0.8.2cu92 torchaudio0.7.2 -f https://download.pytorch.org/whl/torch_stable.html也可以安装其它版本例如 1.6.0 或更高的版本。需要说明的是当前仓库 arcface_torch/README.md 已将最低要求升级到torch1.12.0并推荐使用torchrun启动分布式训练如果你使用较新版本的 PyTorchtorch.distributed.launch仍可用但已标记为弃用建议直接使用下文「多卡分布式训练」中给出的torchrun等价命令。2. 安装其它依赖pip install -r requirement.txtarcface_torch/requirement.txt 中的核心依赖为tensorboard、easydict、mxnet、onnx、sklearn、opencv-python。其中easydict用于解析训练配置onnx用于模型导出与规范性检查mxnet与sklearn被 IJBC 评测脚本使用见后文。多卡分布式训练教程给出的训练命令基于torch.distributed.launch配置解析入口为train.py或仓库当前版本的train_v2.py均以配置文件目录为参数。以下是官方教程的三种典型运行场景单机四卡python -m torch.distributed.launch --nproc_per_node4 --nnodes1 --node_rank0 --master_addr127.0.0.1 --master_port1234 train.py单机八卡python -m torch.distributed.launch --nproc_per_node8 --nnodes1 --node_rank0 --master_addr127.0.0.1 --master_port1234 train.py多机每台 8 卡节点 0python -m torch.distributed.launch --nproc_per_node8 --nnodes2 --node_rank0 --master_addrip1 --master_port1234 train.py节点 1python -m torch.distributed.launch --nproc_per_node8 --nnodes2 --node_rank1 --master_addrip1 --master_port1234 train.py其中--master_addr填写节点 0 的 IP--master_port为通信端口两个节点需保持一致。多机场景要求节点间网络互通且共享数据集路径。若使用当前仓库的 arcface_torch 版本PyTorch ≥ 1.12上述命令等价于使用torchrun并显式传入配置文件目录例如# 单机 8 卡训练 MS1MV3 R50 torchrun --nproc_per_node8 train_v2.py configs/ms1mv3_r50 # 双机各 8 卡 torchrun --nproc_per_node8 --nnodes2 --node_rank0 --master_addrip1 --master_port12581 train_v2.py configs/glint360k_r50关键训练配置解读训练的超参数集中在 configs/base.py 及具体数据集的配置文件中理解这些参数对复现 Baseline 至关重要配置项默认值含义config.networkr50骨干网络可选 r18/r34/r50/r100/r200 及 mobilefacenet 等config.embedding_size512特征嵌入维度须满足赛道上限A 赛道 ≤512config.margin_list(1.0, 0.5, 0.0)ArcFace margin 参数s, m, 其它MS1MV3 配置与此一致Glint360K 使用(1.0, 0.0, 0.4)config.fp16False是否开启混合精度训练默认配置文件中 MS1MV3/Glint360K 均已设为Trueconfig.batch_size128单卡 batch size教程示例为 4×1284 卡config.sample_rate1.0Partial FC 采样率控制负样本类别采样比例config.lr0.1SGD 初始学习率config.momentum0.9SGD 动量config.weight_decay5e-4Glint360K 为1e-4权重衰减config.num_epoch20训练轮数config.warmup_epoch0预热轮数config.rec数据路径训练集.rec文件目录config.val_targets[lfw, cfp_fp, agedb_30]训练过程中的验证集需要特别注意的是在竞赛提交场景下训练得到的最终模型必须为 FP32 权重规则明确禁止 float-16 权重config.fp16开启的是训练阶段的自动混合精度AMP训练完成导出 ONNX 时权重会被转换回 FP32两者并不冲突。模型提交从 checkpoint 到 ONNX1. 自动导出的 ONNX 模型竞赛要求以 ONNX 模型提交。arcface_torch 工程在保存模型时会自动将 backbone 转换为 ONNX输出路径为${cfg.output}/backbone.onnx。训练完成后输出目录中的 checkpoint 文件结构如下├── backbone.onnx # 需要提交的模型 ├── backbone.pth # pytorch 保存的模型 ├── rank_0_softmax_weight_mom.pt # 模型并行原因每张卡保存softmax独有的参数 ├── rank_0_softmax_weight.pt ├── rank_1_softmax_weight_mom.pt ├── rank_1_softmax_weight.pt ├── ... ... └── training.log # 训练日志其中rank_*_softmax_weight*.pt是分布式训练时各 rank 各自保存的 softmax 分类层参数含动量版本由 Partial FC 的模型并行机制产生不需要也不会被合并进提交的 backbone。实际导出的 ONNX 只包含骨干网络的特征提取部分。如果你需要手动执行 ONNX 转换例如导出 checkpoint 目录外的模型可以使用仓库自带的 torch2onnx.pypython torch2onnx.py /path/to/backbone.pth --network r50 --output model.onnx从源码可以看到导出过程会使用(112,112,3)的随机图像按 Torch 风格归一化(img/255 - 0.5)/0.5构造输入并以input_names[data]、opset_version11导出随后将 ONNX 图第一个输入维度的dim_param重置为None以支持动态 batch——这一步与后文 onnx_helper 对输入形状的检查要求是配套的。2. 检查 ONNX 模型是否规范提交前必须用官方提供的 challenges/iccv21-mfr/onnx_helper.py 校验模型。该脚本对应教程中的命令为python onnx_helper.py ms1mv3_arcface_r50/ --track ms1m教程原文中的onnx_helper_sample.py --model_root ...即为本仓库onnx_helper.py的早期调用形式当前脚本以工作目录为位置参数、以--track指定赛道。脚本会依次执行以下检查任何一个环节失败都会返回对应的错误字符串track 参数校验ms1m*赛道要求特征维度 ≤512、推理时间 ≤10msglint*赛道要求 ≤1024、≤20ms模型大小上限均为 1024MB输入形状校验输入须为 4 维张量且空间尺寸为 112x112若第 0 维是固定整数而非动态维度脚本会自动将其改写为None并另存为zzzzrefined.onnx后重新加载输出节点数量校验ONNX 图只能有 1 个输出节点权重精度校验遍历graph.initializer若存在itemsize 4的权重即 float-16 等低精度权重则直接报invalid weight type对应竞赛规则第 10 条数值稳定性校验对同一张测试图连续构造 32 张的 batch 输入若输出包含 NaN/Inf 则报错推理耗时与特征维度校验调用benchmark()对单张图连续推理 50 次、取排序后第 5 小的耗时作为推理时间单位换算为毫秒并检查feat.shape[1]是否超过赛道上限。脚本还会自动推断模型的预处理均值/方差若前 8 个节点中出现Sub/_minus与Mul/_mul/Div算子则按 MXNet ArcFace 风格取input_mean0.0, input_std1.0否则取input_mean127.5, input_std127.5。测试图默认使用内置的Tom_Hanks_54745样例来自 python-package/insightface/data。检查通过后会打印统计信息check stat:, model-size-mb: 166.3050, feat-dim: 512, time-cost-ms: 4.2620, input-mean: 127.500, input-std: 127.5003. 在公开测试集 IJBC 上验证性能提交前建议先在公开测试集 IJBC 上验证模型精度使用 arcface_torch/onnx_ijbc.pyCUDA_VISIBLE_DEVICES0 python onnx_ijbc.py --model-root ms1mv3_arcface_r50 --image-path IJB_release/IJBC --result-dir ms1mv3_arcface_r50从源码看该脚本会复用ArcFaceORT加载 ONNX 模型按 IJBC 的 5 点关键点SRC矩阵x 坐标偏移 8.0对每张图做相似变换对齐到 112x112同时构造原始图与水平翻转图两个输入输出拼接成2 * feat_dim的特征向量用于 1:1 验证最终以roc_curve计算不同 FAR 阈值下的 TAR 并打印成表。--target可切换为IJBB。需要说明该评测脚本依赖mxnet、sklearn、prettytable、pandas、skimage等库且仅在本地自测时使用不影响提交。4. 模型大小与推理时间参考教程给出了官方 Baseline 在Tesla V100 GPU上、onnxruntime-gpu1.6条件下的模型大小与推理耗时参考与 challenges/iccv21-mfr/README.md 中 Baseline 表格一致模型名称大小/MB推理时间/msR501664.262R1002487.031R20047613.48可见 R50/R100 均满足 Sub-Track A 的 10ms 限制R200 超过 A 赛道限制但仍满足 B 赛道的 20ms 限制。提交时务必用 onnx_helper 实测自己的模型而不是直接套用参考值。提示与技巧训练加速1. 混合精度训练AMP教程强烈建议在使用图灵架构TuringGPU如 V100、RTX 20 系列时开启混合精度训练。在配置文件中将config.fp16设置为True即可例如config.fp16 True开启混合精度可以节省大量显存并显著提升训练速度。教程给出的实测对比MS1MV3 4×V100 R100 BatchSize 4×128开启前——训练速度约 780~890 samples/sec单卡显存占用约 17.8GB/32.5GB# training log Training: 2021-05-12 00:00:42,110-Speed 884.42 samples/sec Loss 47.2532 Epoch: 0 Global Step: 100 Training: 2021-05-12 00:01:10,979-Speed 886.77 samples/sec Loss 47.3550 Epoch: 0 Global Step: 150 Training: 2021-05-12 00:01:43,936-Speed 776.80 samples/sec Loss 47.0214 Epoch: 0 Global Step: 200 Training: 2021-05-12 00:02:16,064-Speed 796.83 samples/sec Loss 46.7781 Epoch: 0 Global Step: 250 Training: 2021-05-12 00:02:45,018-Speed 884.18 samples/sec Loss 46.3187 Epoch: 0 Global Step: 300 # gpustat -i [0] Tesla V100-SXM2-32GB | 67 C, 99 % | 17844 / 32510 MB [1] Tesla V100-SXM2-32GB | 64 C, 98 % | 17844 / 32510 MB [2] Tesla V100-SXM2-32GB | 65 C, 93 % | 17916 / 32510 MB [3] Tesla V100-SXM2-32GB | 72 C, 82 % | 17910 / 32510 MB开启后——训练速度提升至约 1600~1620 samples/sec单卡显存占用降至约 10.6~10.7GB/32.5GB# training log Training: 2021-05-12 00:04:27,869-Speed 1604.59 samples/sec Loss 47.6050 Epoch: 0 Global Step: 100 Training: 2021-05-12 00:04:43,681-Speed 1619.08 samples/sec Loss 47.5865 Epoch: 0 Global Step: 150 Training: 2021-05-12 00:04:59,460-Speed 1622.39 samples/sec Loss 47.2380 Epoch: 0 Global Step: 200 Training: 2021-05-12 00:05:15,271-Speed 1619.25 samples/sec Loss 46.9030 Epoch: 0 Global Step: 250 Training: 2021-05-12 00:05:31,065-Speed 1620.86 samples/sec Loss 46.4425 Epoch: 0 Global Step: 300 # gpustat -i [0] Tesla V100-SXM2-32GB | 64 C, 96 % | 10664 / 32510 M [1] Tesla V100-SXM2-32GB | 63 C, 96 % | 10630 / 32510 MB [2] Tesla V100-SXM2-32GB | 63 C, 79 % | 10736 / 32510 MB [3] Tesla V100-SXM2-32GB | 70 C, 86 % | 10736 / 32510 MB对比可见吞吐量接近翻倍约 800 → 1600 samples/sec显存占用下降约 40%。在 configs/ms1mv3_r50.py 与 configs/glint360k_r50.py 中config.fp16已默认设为True直接使用这些配置即自动开启混合精度。2. 将数据集挂载到内存盘人脸识别训练集的随机读取是瓶颈之一官方教程建议把训练集放入 tmpfs 内存盘来消除磁盘 IO 等待。以 256GB 内存的机器为例# make training faster # our RAM is 256G mount -t tmpfs -o size40G tmpfs /train_tmp然后将训练集拷贝到目录/train_tmp下再开始训练。这也是各个配置文件注释与config.rec默认路径/train_tmp/ms1m-retinaface-t1、/train_tmp/glint360k的由来。内存盘容量size40G应根据数据集实际大小与可用内存调整Glint360K 约 17.1M 张图像所需空间比 MS1MV3 更大。其它可选的提升手段在完成 Baseline 复现之后若想进一步冲击榜单可以关注以下几点均以仓库内已有实现为依据口罩数据增强规则允许使用可复现的口罩增强工具仓库在 recognition/tools/mask_renderer.py 提供了口罩渲染实现可用于构造带口罩的训练样本更强的骨干网络与更大数据arcface_torch 支持 iresnet 系列r18/r34/r50/r100/r200与 ViT 骨干配置示例覆盖 wf42m 系列 等更大规模数据集但竞赛限定只能使用 MS1MV3/Glint360K 训练Partial FCconfig.sample_rate控制负样本类别采样率在 Glint360K36 万类这类超大分类数场景下可显著降低显存开销实现细节见 recognition/partial_fc 与 arcface_torch/partial_fc_v2.py训练完成后的检查闭环提交前依次执行 onnx_helper 规范性检查 → IJBC 本地精度验证 → 确认模型大小与推理时间满足赛道限制再打包为zip xxx.zip model.onnx上传可最大限度避免无效提交。按以上流程完成「数据准备 → 环境搭建 → 分布式训练 → ONNX 导出 → 规范性检查 → 提交」六个环节即可完整跑通 InsightFace Track 的参赛闭环。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考