Arcface-Paddle 实战指南:基于 PaddlePaddle 的大规模人脸识别训练、评估、导出与推理全流程
发布时间:2026/9/10 15:02:56 锦皓数字建站

Arcface-Paddle 实战指南基于 PaddlePaddle 的大规模人脸识别训练、评估、导出与推理全流程【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface导读Arcface-Paddle是 InsightFace 仓库中以 PaddlePaddle 为后端的人脸检测与识别工具包内置BlazeFace检测、ArcFace与MobileFace识别三套预训练模型。本文以其英文指南 README_en.md 为主体完整覆盖从 MXNet 数据集转换、单卡/八卡训练含静态图与动态图两种模式、验证集评估、Paddle/ONNX 模型导出、推理到与检测模型联动的端到端人脸识别 demo 的完整链路并结合仓库内脚本与源码逐项解释关键参数。读完本文你将能够独立复现 MobileFaceNet/R50 的人脸识别训练并在自有数据上完成部署推理。本文聚焦人脸识别任务人脸检测部分请参阅 BlazeFace-Paddle 指南基于 PaddleInference 的 Whl 包推理另见独立的 whl 推理仓库教程该工具仓库不在当前 InsightFace 仓库内。1. 项目概览Arcface-Paddle 能做什么Arcface-Paddle是一个基于 PaddlePaddle 的开源深度人脸检测与识别工具包目前提供三个相互配套的预训练模型模型任务BlazeFace人脸检测ArcFace人脸识别R50 骨干512 维特征MobileFace人脸识别MobileFaceNet_128 骨干128 维特征轻量部署与 InsightFace 仓库中其他框架实现MXNet、PyTorch、OneFlow 等相比本套实现的最大特点是双模式训练支持静态图staticPaddle 声明式编程与动态图dynamic两种 API 训练见 scripts 下成对的train_static.sh/train_dynamic.sh等脚本大规模分类能力通过LargeScaleClassifier 模型并行 Partial FC 采样可在单机 8 张 NVIDIA V10032G上支撑 6000 万类级别的训练详见第 8.3 节纯 FP16 训练内置动态损失缩放dynamic loss scaling等混合精度训练配置。从 tools/train.py 可以看到训练入口会根据args.is_static自动选择static.train.train或dynamic.train.train并在静态模式下调用paddle.enable_static()if args.is_static: from static.train import train paddle.enable_static() else: from dynamic.train import train训练输出目录、日志初始化与参数打印也在该入口完成日志落盘在--output指定的目录中。2. 环境准备训练前需要先完成 PaddlePaddle 环境安装官方安装步骤详见仓库内的 install_en.md中文版见 install_cn.md依赖清单见 requirement.txt。结合 configs/argparser.py 与各脚本的用法运行环境建议满足PaddlePaddle 支持静态图与动态图两套训练 API单卡训练只需一张 GPU8 卡脚本通过python -m paddle.distributed.launch --gpus0,1,...,7启动分布式训练见 train_static.sh端到端推理 demo 额外依赖opencv-python、scikit-learn、prettytable、tqdm、Pillow等见 tools/test_recognition.py 的导入。3. 数据准备3.1 下载数据集官方推荐从 InsightFace 的 datasets 目录见仓库 recognition/datasets/README.md下载以下两个公开人脸识别训练集MS1M_v2MS1M-ArcFace清洗版85742 类MS1M_v3MS1M-RetinaFaceRetinaFace 检测清洗版93431 类类别数可直接从配置文件中确认configs/ms1mv2_mobileface.py 注释85742 for MS1M_v2, 93431 for MS1M_v3configs/ms1mv3_r50.py 亦然。3.2 将 MXNet 数据集解包为图片官方以 MXNetrecordio格式分发上述数据集训练前需用仓库自带的转换脚本解包为图片目录 标签文件python tools/mx_recordio_2_images.py --root_dir ms1m-retinaface-t1/ --output_dir MS1M_v3/该脚本的实现在 tools/mx_recordio_2_images.py读取--root_dir下的train.rec与train.idx通过mx.recordio.MXIndexedRecordIO逐条解包图片并以images/%08d.jpg命名写入--output_dir/images/JPEG 质量设为 100同时将类别标签以文件名\t标签逐行写入label.txt自动把验证集二进制文件agedb_30.bin、cfp_fp.bin、lfw.bin从--root_dir复制到输出目录最后在输出目录生成README.md记录num_image与num_classes。解包完成后的目录结构如下MS1M_v3 |_ images | |_ 00000001.jpg | |_ ... | |_ 05179510.jpg |_ label.txt |_ agedb_30.bin |_ cfp_ff.bin |_ cfp_fp.bin |_ lfw.bin标签文件格式Tab 分隔每行图片路径TAB类别ID# delimiter: \t images/00000001.jpg 0 ...如果你想使用自定义数据集只需按上述格式自行整理数据目录与标签文件即可无需改动任何代码。--label_file参数在 argparser.py 中的说明即为每行以\t分隔。4. 模型训练4.1 单节点单卡训练以 MobileFaceNet_128 在 MS1M_v2 上训练为例export CUDA_VISIBLE_DEVICES1 python tools/train.py \ --config_file configs/ms1mv2_mobileface.py \ --embedding_size 128 \ --sample_ratio 1.0 \ --loss ArcFace \ --batch_size 512 \ --dataset MS1M_v2 \ --num_classes 85742 \ --data_dir MS1M_v2/ \ --label_file MS1M_v2/label.txt \ --fp16 False各参数含义结合 configs/argparser.py 与 configs/ms1mv2_mobileface.py参数含义说明--config_file配置文件路径必填必须以configs/开头argparser.py 中有断言命令行参数会覆盖配置文件默认值--embedding_size特征向量维度MobileFace 用 128R50 用 512--sample_ratio类别采样比例小于 1.0 时启用 Partial FC 采样sample rate 1.0用于超大规模分类--loss损失函数可选ArcFace/CosFace/SphereFace--batch_size单卡 batch size注意是每个 rank 的 batch size见 argparser.py--dataset数据集名称如MS1M_v2、MS1M_v3--num_classes训练集类别数MS1M_v2 为 85742MS1M_v3 为 93431--data_dir/--label_file数据目录 / 标签文件即 3.2 节解包产物--fp16是否 FP16 训练单卡示例置为FalseFP328 卡脚本置为True纯 FP164.2 单节点 8 卡训练8 卡训练提供静态图与动态图两套脚本二者共用paddle.distributed.launch拉起 0-7 号 GPU# 静态图模式 sh scripts/train_static.sh # 动态图模式 sh scripts/train_dynamic.sh以 train_static.sh 为例其完整命令为python -m paddle.distributed.launch --gpus0,1,2,3,4,5,6,7 tools/train.py \ --config_file configs/ms1mv3_r50.py \ --is_static True \ --backbone FresResNet50 \ --classifier LargeScaleClassifier \ --embedding_size 512 \ --model_parallel True \ --dropout 0.0 \ --sample_ratio 0.1 \ --loss ArcFace \ --batch_size 128 \ --dataset MS1M_v3 \ --num_classes 93431 \ --data_dir MS1M_v3/ \ --label_file MS1M_v3/label.txt \ --is_bin False \ --log_interval_step 100 \ --validation_interval_step 2000 \ --fp16 True \ --use_dynamic_loss_scaling True \ --init_loss_scaling 27648.0 \ --num_workers 8 \ --train_unit epoch \ --warmup_num 0 \ --train_num 25 \ --decay_boundaries 10,16,22 \ --output MS1M_v3_arcface_static_0.1动态图版本 train_dynamic.sh 除--is_static False与输出目录不同外其余训练超参数完全一致。结合 configs/ms1mv3_r50.py 可解读这批超参数的默认值与含义模型结构--backbone FresResNet50ResNet50--classifier LargeScaleClassifier大规模分类头--model_parallel True模型并行将超大分类层切分到多卡训练策略--train_unit epoch--train_num 25表示训练 25 个 epoch--decay_boundaries 10,16,22为分段学习率衰减边界对应 10/16/22 epoch 处衰减--lr 0.1针对全局 batch size 512 设定--lr_decay 0.1、--weight_decay 5e-4、--momentum 0.9混合精度--fp16 True配合--use_dynamic_loss_scaling True与--init_loss_scaling 27648.0使用动态损失缩放的纯 FP16 训练argparser 中还支持--max_loss_scaling、--incr_every_n_steps、--decr_every_n_nan_or_inf、--incr_ratio、--decr_ratio以及--custom_white_list/--custom_black_list等完整的 AMP 调参项训练中验证--do_validation_while_train True--validation_interval_step 2000每 2000 步在--val_targets lfw,cfp_fp,agedb_30上做一次验证断点续训argparser 提供--resume与--checkpoint_dir--max_num_last_checkpoint控制保留最近 checkpoint 的数量配置默认 1数据加载--num_workers 8为 DataLoader 进程数--is_bin False表示使用原始图片而非 bin 格式。损失函数的具体 margin 配置可在 utils/losses.py 中查看ArcFace采用m11.0, m20.5, m30.0, s64.0CosFace为m11.0, m20.0, m30.35, s64.0SphereFace为m11.35, m20.0, m30.0, s64.0。训练过程中可通过VisualDL实时查看 loss 变化曲线训练日志由 utils/logging.py 写入--logdir与--output目录。5. 模型评估训练完成后可在 LFW、CFP-FP、AgeDB-30 三个公开验证集上评估模型精度# 静态图模式 sh scripts/validation_static.sh # 动态图模式 sh scripts/validation_dynamic.sh以 validation_static.sh 为例python tools/validation.py \ --is_static True \ --backbone FresResNet50 \ --embedding_size 512 \ --checkpoint_dir MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/24 \ --data_dir MS1M_v3/ \ --val_targets lfw,cfp_fp,agedb_30 \ --batch_size 128关键点--checkpoint_dir指向训练输出目录下的FresResNet50/epoch子目录此处为第 24 epoch 的 checkpoint对应 25 epoch 训练计划的最后一个保存点--val_targets支持逗号分隔的多个验证集验证使用的.bin文件agedb_30.bin、cfp_fp.bin、lfw.bin位于--data_dir下由 3.2 节转换脚本自动复制而来评估入口 tools/validation.py 同样按--is_static分派到 static/validation.py 或 dynamic/validation.py相关相似度计算实现位于 utils/verification.py。6. 导出推理模型PaddlePaddle 使用预测引擎进行推理前需要先将训练 checkpoint 导出为推理模型# 静态图模式 sh scripts/export_static.sh # 动态图模式 sh scripts/export_dynamic.sh导出脚本 export_static.sh 的核心命令为python tools/export.py \ --is_static True \ --export_type paddle \ --backbone FresResNet50 \ --embedding_size 512 \ --checkpoint_dir MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/24 \ --output_dir MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/exported_model--export_type支持paddle与onnx两种导出格式要导出 ONNX 模型只需将--export_type设为onnx对应 tools/export.py 与 dynamic/export.py / static/export.py 中的实现静态图导出产物为FresResNet50.pdmodelFresResNet50.pdiparams可直接交给 Paddle Inference 引擎加载导出过程还会顺带在--val_targets默认lfw,cfp_fp,agedb_30上做精度对齐校验。7. 模型推理推理过程同时支持 Paddle 推理模型与 ONNX 模型一键脚本sh scripts/inference.sh该脚本 inference.sh 实际执行两条命令# 使用 Paddle 推理模型 python tools/inference.py \ --export_type paddle \ --model_file MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/exported_model/FresResNet50.pdmodel \ --params_file MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/exported_model/FresResNet50.pdiparams \ --image_path MS1M_v3/images/00000001.jpg # 使用 ONNX 模型 python tools/inference.py \ --export_type onnx \ --onnx_file MS1M_v3_arcface_static_128_fp16_0.1/FresResNet50/exported_model/FresResNet50.onnx \ --image_path MS1M_v3/images/00000001.jpgtools/inference.py 提供了丰富的预测引擎参数适合部署调优参数默认值含义--export_type-paddle或onnx--model_file/--params_file-Paddle 推理模型与参数文件--onnx_file-ONNX 模型文件--image_path-待测试图片路径--use_gpuTrue是否使用 GPU--ir_optimTrue是否开启 IR 优化--use_tensorrtFalse是否启用 TensorRT 加速--precisionfp32fp32/fp16/int8仅配合 TensorRT 生效--gpu_mem500GPU 显存分配MB--enable_mkldnn/--cpu_threadsFalse / 10CPU 推理时是否启用 MKLDNN 及线程数--benchmarkFalse是否为基准测试模式在--use_tensorrt开启时代码会依据--precision将精度映射为paddle_infer.PrecisionType.Half / Int8 / Float32并设置--max_batch_size、--min_subgraph_size等 TensorRT 引擎参数见 tools/inference.py。8. 模型性能参考以下性能数据均摘自仓库官方文档硬件与配置均以原文档声明为准供复现与选型参考。8.1 轻量模型MobileFace性能测试配置CPUIntel(R) Xeon(R) Gold 6184 CPU 2.40GHzGPU单张 NVIDIA Tesla V100精度FP32BatchSize64/512SampleRatio1.0Embedding Size128数据集MS1MV2模型结构lfwcfp_fpagedb30CPU 耗时GPU 耗时推理模型MobileFace-Paddle0.99520.92800.96124.3ms2.3ms官方提供下载MobileFace-mxnet0.99500.88940.95917.3ms4.7ms-注MobileFace-Paddle 使用 MobileFaceNet_128 结构训练。从数据看Paddle 版本在保持 LFW/CFP-FP/AgeDB-30 精度相当甚至略优的前提下单张图片 CPU/GPU 推理耗时较 MXNet 版本明显更短文档环境下的对比结果。8.2 验证集精度R50测试配置GPU8 张 NVIDIA Tesla V100 32G精度纯 FP16BatchSize128/1024模式数据集backboneRatiosample_ratioagedb30cfp_fplfwStaticMS1MV3r500.10.983170.989430.99850StaticMS1MV3r501.00.982830.988430.99850DynamicMS1MV3r500.10.983330.989000.99833DynamicMS1MV3r501.00.983170.989000.99833原文档同时提供了各实验的训练日志与 checkpoint 资源可通过官方渠道获取。表中Ratio即训练时的--sample_ratio设为 0.1 时启用 Partial FC 采样仅用 10% 的类别参与每步分类计算以换取显存与算力的节省而精度与全量训练1.0基本持平。8.3 最大可支撑类别数大规模分类能力测试配置GPU8 张 NVIDIA Tesla V100 32G32510MiBBatchSize64/512SampleRatio0.1模式精度Res50Res100框架AstaticAMP4200万类31792MiB3900万类31938MiB框架BdynamicAMP3000万类31702MiB2900万类32286MiBPaddlestatic纯 FP166000万类32018MiB6000万类32018MiBPaddledynamic纯 FP165900万类31970MiB5900万类31970MiB注意上述实验需设置环境变量export FLAGS_allocator_strategynaive_best_fit以调整 Paddle 显存分配策略。从结果看配合LargeScaleClassifier、模型并行与纯 FP16Paddle 静态图模式可在单机 8 卡 V100 上支撑 6000 万类的人脸识别训练。原文档提及的更多大规模分类实验结果来自开源的 PLSCPaddle Large Scale Classification Tools其在单节点 8 张 V10032G上支持 6000 万类。8.4 吞吐量测试配置BatchSize128/1024SampleRatio0.1数据集MS1MV3V100Driver 450.80.02CUDA 11.0A100Driver 460.32.03CUDA 11.2原文档以吞吐量对比图展示不同框架在大规模分类训练下的吞吐表现图位于外部文档未包含在本仓库中。仓库内还提供了吞吐量跑分脚本 scripts/perf_runner.sh、scripts/perf_static.sh、scripts/perf_dynamic.sh 以及对应的 tools/benchmark_speed.py可在自己的硬件上复测吞吐。9. 结合人脸检测模型的端到端推理人脸识别落地时通常需要先检测、后识别。Arcface-Paddle 提供了一个集检测 识别于一体的端到端 demo 脚本 tools/test_recognition.py。9.1 下载检索底库、示例图与可视化字体# 识别过程的检索底库index gallery wget index.bin 下载地址 # 示例图片 wget friends2.jpg 下载地址 # 可视化用字体文件 wget SourceHanSansCN-Medium.otf 下载地址以上资源由配套的 insight-face-paddle 工具仓库托管具体地址以该仓库为准。9.2 运行端到端人脸识别 demo# 检测 识别 全流程 python3.7 tools/test_recognition.py --det --rec --indexindex.bin --inputfriends2.jpg --output./output运行后结果图片保存在output/目录下图中会以检索到的身份名标注每个人脸框。9.3 关键参数与实现机制tools/test_recognition.py 提供了完整的参数体系参数默认值含义--det/--recFalse是否启用检测 / 识别--det_modelBlazeFace检测模型--rec_modelMobileFace识别模型--use_gpuTrue是否使用 GPU 推理--enable_mkldnn/--cpu_threadsTrue / 1CPU 推理时的 MKLDNN 开关与线程数--input-图片 / 图片目录 / 视频路径--output./output/结果保存目录--det_thresh0.8检测后处理置信度阈值--indexNone检索底库索引文件路径--cdd_num5识别检索返回的候选个数--rec_thresh0.45识别后处理相似度阈值--max_batch_size1识别阶段最大 batch实现细节值得关注模型自动下载脚本内置模型映射表ArcFace→ arcface_iresnet50 推理模型、BlazeFace→ blazeface_fpn_ssh 推理模型、MobileFace→ mobileface 推理模型模型缓存目录为~/.insightface/ppmodels/若本地缺失会自动下载并解包出inference.pdmodel/inference.pdiparamstools/test_recognition.py检索机制识别阶段基于sklearn.metrics.pairwise.cosine_similarity在--index底库中做余弦相似度检索Paddle Serving 部署仓库还提供了基于 Paddle Serving 的部署方案详见 deploy/pdserving/README.md检测模型本身的训练与推理详见 BlazeFace-Paddle 指南。附仓库内关键资源索引资源路径英文指南本文主体recognition/arcface_paddle/README_en.md中文指南recognition/arcface_paddle/README_cn.md安装说明recognition/arcface_paddle/install_en.md、install_cn.md训练/评估/导出/推理脚本recognition/arcface_paddle/scripts参数解析器recognition/arcface_paddle/configs/argparser.py模型配置configs/ms1mv3_r50.py、configs/ms1mv2_mobileface.py损失函数实现recognition/arcface_paddle/utils/losses.pyMXNet 数据解包recognition/arcface_paddle/tools/mx_recordio_2_images.py端到端检测识别 demorecognition/arcface_paddle/tools/test_recognition.pyPaddle Serving 部署recognition/arcface_paddle/deploy/pdserving/README.md人脸检测BlazeFacedetection/blazeface_paddle/README_en.md按照上述流程你可以从 MXNet 格式数据集出发完成数据转换、单卡或 8 卡静态图/动态图、FP32/纯 FP16训练、三验证集评估、Paddle/ONNX 导出、推理最终以检测 识别的方式落地到真实业务场景。【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。