ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

InsightFace ArcFace MXNet 人脸识别训练指南:特征与分类中心的并行加速与实战训练

InsightFace ArcFace MXNet 人脸识别训练指南:特征与分类中心的并行加速与实战训练 InsightFace ArcFace MXNet 人脸识别训练指南特征与分类中心的并行加速与实战训练【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface本文基于 InsightFace 仓库中 recognition/arcface_mxnet/README.md 的官方训练说明完整讲解基于 MXNet 的 ArcFace 大规模人脸识别训练方案。文章将围绕该目录下的训练代码train.py/train_parall.py、sample_config.py展开重点剖析特征 x 与分类中心 W 双重并行加速的实现原理并给出从环境安装、数据集准备到四种损失函数训练的完整可复现流程。读完本文你将掌握使用 InsightFace 的 ArcFace-MXNet 代码库在 MS1MV2 等百万级身份数据集上训练、微调与验证人脸识别模型的全部关键步骤并理解其并行加速背后的矩阵切分思想。说明README 中提到的$INSIGHTFACE_ROOT/recognition/ArcFace目录在当前仓库中对应 recognition/arcface_mxnet下文统一按实际路径描述。一、ArcFace MXNet 训练代码库概览recognition/arcface_mxnet 是 InsightFace 最早期的训练代码实现承载了 ArcFaceAdditive Angular Margin Loss论文的原始实验。目录核心文件如下文件作用train.py标准单机多卡训练入口train_parall.py特征与分类中心并行加速训练入口parall_module_local_v1.py并行加速的自定义 ModuleParallModulesample_config.py全部网络、数据集、损失与训练默认配置metric.py训练中的精度与损失监控指标verification.pyLFW / CFP-FP / AgeDB-30 验证协议实现image_iter.pyRecordIO 人脸数据迭代器含随机镜像等增强triplet_image_iter.pyTriplet 训练专用采样迭代器symbol各骨干网络符号定义fresnet、fmobilefacenet、fmobilenet、fmnasnet、fdensenet、vargfacenet该 README 的核心技术主题是在大规模身份数量如 100 万类下同时并行加速特征feature x与分类中心centre W从而在有限显存内完成海量类别的 Softmax/ArcFace 训练。二、并行加速原理对特征 x 与分类中心 W 的双重切分2.1 为什么要并行加速分类中心在人脸识别中最后一层全连接fc7的权重矩阵维度为num_classes × emb_size。当身份数达到百万级时该矩阵本身就超过显存容量且每一 batch 都要与其做矩阵乘法成为训练瓶颈。README 给出的策略是对特征 x 与分类中心 W 同时进行并行切分把分类中心按类别维度切成若干份分布到不同 GPU 上分别计算局部 logits再在反向传播时聚合梯度。2.2 内存消耗与训练速度README 原始数据README 中给出的基准实验设置与结论如下内存/速度实验设置ResNet 50batch size 为8 * 648 卡 × 每卡 64特征维度 512float point 32GPU 为 8 × P4024GB。主步骤演示设置ResNet 50batch size 为8 * 64特征维度 512float point 32身份数量 100 万GPU 为 8 × 1080Ti11GB。通信成本仅需传输 1MB 的 feature x 用于后续类别切分聚合。训练速度约 800 samples/second。上述数据表明通过简单的矩阵切分parallel calculation by simple matrix partition即使骨干网络与 embedding 维度保持不变也能把大规模分类层扩展到多卡上且 GPU 间通信量极小。2.3 源码级实现佐证从源码结构看并行加速由 train_parall.py 与 parall_module_local_v1.py 共同实现关键点如下类别按 GPU 均分train_parall.py 中计算每个 GPU 负责的类别数global_num_ctx num_workers * args.ctx_num if config.num_classes % global_num_ctx 0: args.ctx_num_classes config.num_classes // global_num_ctx else: args.ctx_num_classes config.num_classes // global_num_ctx 1 args.local_num_classes args.ctx_num_classes * args.ctx_num args.local_class_start args.local_num_classes * args.worker_id每个 GPU 独立持有一份局部分类中心get_symbol_arcface 为每个上下文创建fc7_%d_weight形状为(ctx_num_classes, emb_size)即分类中心 W 被切分为num_classes / ctx_num份。前向/反向的聚合ParallModule 中forward阶段各arcface_modules只对分配给自己的类别子集计算fc7输出backward阶段先求全局 softmax 归一化因子global_fc7_max、global_fc7_sum再计算每个局部fc7的梯度并累加到local_fc1_grad最终回传给主干网络模块_curr_module。这就是通信量只有 1MB 特征向量的原因——各卡之间只需交换特征而非完整分类矩阵。使用方式README 特别提示如需使用并行加速只需将下述示例命令中的train.py替换为train_parall.py即可命令行参数完全兼容train_parall.py额外支持--worker-id、--extra-model-name、--fp16-scale等分布式与混合精度参数。三、环境安装与数据集准备3.1 安装 MXNetGPU 版pip install mxnet-cu100 # mxnet-cu102请根据实际 CUDA 版本选择对应的 MXNet 预编译包如mxnet-cu101、mxnet-cu102等并确保机器具备 NVIDIA GPU 驱动与 CUDA 运行环境。3.2 克隆 InsightFace 仓库git clone --recursive https://github.com/deepinsight/insightface.git使用--recursive是为了同时拉取仓库的子模块。克隆后将仓库目录记为INSIGHTFACE_ROOT。3.3 下载训练集与验证集README 推荐的训练集为MS1MV2-Arcface即faces_emore需解压并放置到$INSIGHTFACE_ROOT/recognition/datasets/下。每个训练数据集包含以下 6 个文件faces_emore/ train.idx train.rec property lfw.bin cfp_fp.bin agedb_30.bin其中前三个文件train.idx、train.rec、property是训练数据集。train.rec/train.idx是 MXNet RecordIO 格式的索引图像数据由 image_iter.py 中的FaceImageIter通过recordio.MXIndexedRecordIO读取property描述数据集的类别数与图像尺寸等元信息。后三个文件lfw.bin、cfp_fp.bin、agedb_30.bin是验证集分别对应 LFW、CFP-FP、AgeDB-30 三个评测协议由 verification.py 的load_bin加载。仓库 recognition/datasets/README.md 汇总了 CASIA-Webface、MS1M-ArcFace、MS1M-RetinaFace、Glint360K 等多个候选训练集及 LFW、CFP-FP、AgeDB-30 等验证集的说明训练前可先阅读确认数据规模与版权要求。若需要自行从原始图像构建 RecordIO 训练集可参考 recognition/arcface_mxnet/common/rec_builder.py人脸对齐预处理对齐到 112×112可参考 recognition/arcface_mxnet/common/face_align.py 与 recognition/tools/cpp_align/face_align.h。四、配置文件与四种训练实战4.1 生成并编辑配置文件训练前需先基于模板生成config.py并修改数据集路径等参数以下命令在recognition/arcface_mxnet目录下执行cp sample_config.py config.py vim config.py # edit dataset path etc..config.py 的核心结构分为四部分全局config、network骨干网络、dataset数据集、loss损失函数并通过generate_config(_network, _dataset, _loss)在训练启动时按命令行参数动态合并生效。4.2 训练命令示例README 原始四条以下实验均在 Tesla P40 GPU 上完成(1) 使用 LResNet100E-IR 训练 ArcFaceCUDA_VISIBLE_DEVICES0,1,2,3 python -u train.py --network r100 --loss arcface --dataset emore每 2000 个 batch 会输出一次LFW、CFP-FP、AgeDB-30的验证结果。README 记录该模型可达到LFW 99.80与MegaFace 98.3%的验证精度。(2) 使用 LResNet50E-IR 训练 CosineFaceCUDA_VISIBLE_DEVICES0,1,2,3 python -u train.py --network r50 --loss cosface --dataset emore(3) 使用 MobileFaceNet 训练 SoftmaxCUDA_VISIBLE_DEVICES0,1,2,3 python -u train.py --network y1 --loss softmax --dataset emore(4) 使用 Triplet loss 微调上述 Softmax 模型CUDA_VISIBLE_DEVICES0,1,2,3 python -u train.py --network mnas05 --loss triplet --lr 0.005 --pretrained ./models/y1-softmax-emore,1其中--pretrained ./models/y1-softmax-emore,1表示加载./models/y1-softmax-emore前缀的第 1 个 epoch 检查点--lr 0.005覆盖默认学习率以适配微调场景。4.3 骨干网络配置一览network段network 段预置了多种网络均通过net_name符号文件与num_layers/emb_size/net_multiplier等参数刻画配置名网络关键参数r100fresnet100 层r100fcfresnet100 层net_outputFCr50fresnet50 层r50v1fresnet50 层net_unit1d169/d201fdensenet169 / 201 层per_batch_size64y1fmobilefacenetemb_size128net_outputGDCy2fmobilefacenetemb_size256net_blocks[2,8,16,4]m1fmobilenetemb_size256net_multiplier1.0m05fmobilenetemb_size256net_multiplier0.5mnas/mnas05/mnas025fmnasnet倍率 1.0 / 0.5 / 0.25vargfacenetvargfacenetemb_size512net_multiplier1.25net_outputJ全局网络参数包括emb_size默认 512、net_blocks[1,4,6,2]、net_actprelu、net_se0SENet 开关、net_unit3ResNet 单元版本等。以 symbol/fresnet.py 为例它实现了 ResNet v1/v2/v3 残差单元与可选 SE 模块并支持memonger显存优化标记。4.4 数据集配置一览dataset段配置名dataset_pathnum_classesimage_shape验证集emore../datasets/faces_emore85742(112, 112, 3)lfw, cfp_fp, agedb_30retina../datasets/ms1m-retinaface-t193431(112, 112, 3)lfw, cfp_fp, agedb_30image_shape为 (112, 112, 3)即所有训练与验证图像均需预处理对齐到 112×112 的 RGB 图像这一尺寸约束同样体现在 verification.py 的load_bin中使用image_size解码与缩放。4.5 损失函数配置一览loss段loss 段以统一的margin_softmax实现为基础通过尺度loss_s与三个间隔系数loss_m1 / loss_m2 / loss_m3组合出不同损失配置名loss_namesm1m2m3说明softmaxsoftmax----普通 Softmaxnsoftmaxmargin_softmax64.01.00.00.0归一化 Softmaxarcfacemargin_softmax64.01.00.50.0加性角度间隔cosfacemargin_softmax64.01.00.00.35余弦间隔combinedmargin_softmax64.01.00.30.2混合间隔triplettriplet----三元组损失images_per_identity5、triplet_alpha0.3、triplet_bag_size7200、per_batch_size60、lr0.05atripletatriplet----角度三元组triplet_alpha0.35从 train.py 的get_symbol实现可以看到 margin_softmax 的完整计算链对fc7_weight与 embedding 分别做L2Normalizationembedding 缩放s倍后经FullyConnected得到 logits随后通过arccos还原角度t依次施加m1角度倍率、m2加性角度间隔与m3余弦间隔再cos(t)回映射并替换真实类别位置的 logits。triplet损失则从归一化 embedding 中按 anchor / positive / negative 三段切分计算max(ap - an alpha, 0)的均值。4.6 训练命令行参数train.py支持项parse_args 中定义的完整参数如下train_parall.py完全兼容参数默认值说明--datasetemore数据集配置名--networkr100骨干网络配置名--lossarcface损失配置名--models-root./models模型保存根目录--pretrained空预训练模型前缀--pretrained-epoch1加载的预训练 epoch--ckpt30 不保存1 必要时保存2 总是保存3 仅保存最高精度--verbose2000每 N 个 batch 做一次验证并保存模型--lr0.1初始学习率--lr-steps100000,160000,220000学习率阶梯下降的 batch 节点每到一个节点 lr × 0.1--wd0.0005权重衰减--mom0.9SGD 动量--frequent20每 N 个 batch 打印一次速度--per-batch-size128每张卡上的 batch size总 batch per_batch_size × GPU 数--kvstoredeviceMXNet 参数同步方式其余全局默认配置还包括bn_mom0.9、workspace256、val_targets[lfw,cfp_fp,agedb_30]、data_rand_mirrorTrue、data_cutoffFalse、data_color0、count_flopsTrue启动时打印网络 FLOPs、fp16False等均可直接在config.py中调整。五、训练中的验证与检查点机制5.1 周期性验证训练过程中_batch_callback在每个--verbose默认 2000batch 触发一次验证依次加载data_dir下的lfw.bin、cfp_fp.bin、agedb_30.bin调用 verification.py 的test()完成 10 折10-fold交叉验证。验证采用水平翻转融合策略对原图与水平翻转图分别提取 embedding 后相加再归一化输出格式为[lfw][2000]Accuracy-Flip: 0.99750-0.00123verification.py的evaluate同时给出 ROC 曲线TPR/FPR/accuracy与 FAR1e-3 下的验证率TAR并支持可选的 PCA 后处理与test_badcase错误样本可视化。5.2 模型保存策略验证结束后依据最高精度以最后一个验证集为主、兼顾总分决定是否保存检查点ckpt3表示仅保存历史最高精度模型。保存时默认ckpt_embeddingTrue只导出fc1_output之前的主干网络参数、剔除fc7分类层使导出的模型可直接作为通用人脸特征提取器输出前缀为{models_root}/{network}-{loss}-{dataset}/model。训练全程日志包含每 20 batch 的速度统计Speedometer、网络 FLOPs、学习率变化、fc7_acc并行模式下分类层精度与各验证集 XNorm 等信息便于监控训练健康度。六、常见调优路径与注意事项并行加速切换当身份类别数极大如百万级时将train.py换成train_parall.py训练命令与参数不变分布式多机场景设置DMLC_NUM_WORKER环境变量sample_config.py 会读取该值决定num_workers此时train_parall.py会从parall_module_dist导入对应的分布式ParallModule。混合精度train_parall.py支持--fp16-scale开启 FP16 训练并自动为优化器启用multi_precision保持主权重精度。微调先训练 Softmax 基线再用 Triplet / ArcFace 以小学习率如--lr 0.005微调是 README 给出的标准工作流。数据与显存匹配--per-batch-size是单卡 batch总 batch 为per_batch_size × GPU 数小显存卡可调低该值但需同步考虑学习率与 BN 统计的稳定性。验证集对齐验证 bin 中图像需与训练一致对齐到 112×112否则验证精度会明显下降。七、引用若 ArcFace 对你的研究有帮助请引用以下论文来自原 READMEinproceedings{deng2019arcface, title{Arcface: Additive angular margin loss for deep face recognition}, author{Deng, Jiankang and Guo, Jia and Xue, Niannan and Zafeiriou, Stefanos}, booktitle{Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, pages{4690--4699}, year{2019} }结语本文以 recognition/arcface_mxnet/README.md 为主线完整还原了 InsightFace ArcFace-MXNet 训练方案从特征与分类中心双重并行加速的矩阵切分原理train_parall.py parall_module_local_v1.py到环境安装、faces_emore数据集准备、sample_config.py 的网络/数据集/损失三层配置再到 ArcFace、CosineFace、Softmax、Triplet 四种损失的具体训练命令以及周期性验证与检查点保存机制。无论是复现论文实验还是在百万级身份数据集上开展大规模训练这套代码与流程都提供了可直接落地的完整参考实现。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表