
MMPose 实战指南使用 HRNetv2 在 300W-LP 数据集上训练 68 点人脸关键点检测模型【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文以 MMPose 仓库中 300W-LP 人脸关键点任务的官方模型卡hrnetv2_300wlp.md为核心完整讲解基于 Top-Down 热图方案topdown_heatmap的 HRNetv2-W18 模型在 300W-LP 大姿态人脸数据集上的训练与评测流程。读者将掌握配置文件各字段的语义与调参要点、数据集的下载整理与 COCO 格式转换、训练/测试命令的完整用法以及热图编解码、特征融合颈部与 NME 评估指标背后的源码实现原理。一、背景为什么是 HRNetv2 300W-LP300W-LP300W-Large Pose是经典 300W 数据集的扩展版本论文为《Face alignment in full pose range: A 3d total solution》Zhu 等IEEE TPAMI2017。它利用 3D 人脸重建技术将 300W 的样本扩增出大量大姿态yaw/pitch/roll 变化剧烈人脸图像是人脸关键点对齐领域验证模型全姿态鲁棒性的标准基准。MMPose 中 300W-LP 的标注沿用 68 点人脸标注协议68 points mark-up。HRNetv2《Deep High-Resolution Representation Learning for Visual Recognition》TPAMI 2019通过在网络中全程维护高分辨率特征分支、并反复与低分辨率分支做多尺度融合避免了传统先降采样再上采样结构带来的空间细节损失非常契合人脸关键点这类对精细定位要求高的任务。MMPose 仓库在 300W-LP 上官方发布的 HRNetv2-W18 模型以256x256输入取得NME_full0.0413 / NME_test0.04125的成绩NME 为归一化平均误差越小越好。二、官方模型与评测结果模型卡原文记录的训练设定为在 300W-LP train 划分上训练其完整结果如下ArchInput SizeNME_fullNME_testckptlogpose_hrnetv2_w18256x2560.04130.04125ckptlog对应的模型元数据含权重下载路径hrnetv2_w18_300wlp_256x256-fb433d21_20230922.pth登记在 hrnetv2_300wlp.yml 中属于 HRNetv2 模型集合、任务为 Face 2D Keypoint、训练数据为 300W-LP。注NME_full 与 NME_test 分别对应在 300W-LP 全量验证集与 test 划分上的归一化平均误差。ckpt/log 均托管在 OpenMMLab 官方模型下载站可由上方链接获取。三、配置逐字段精读td-hm_hrnetv2-w18_8xb64-60e_300wlp-256x256.py完整配置文件位于 configs/face_2d_keypoint/topdown_heatmap/300wlp/td-hm_hrnetv2-w18_8xb64-60e_300wlp-256x256.py文件名可拆解为td-hmTop-Down Heatmap 方案、hrnetv2-w18主干网络、8xb648 卡 x 每卡 64 样本的原始批量设定、60e60 epoch、300wlp、256x256输入尺寸。下面按模块拆解。3.1 运行时与优化策略_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs60, val_interval1) # optimizer optim_wrapper dict(optimizerdict(typeAdam, lr2e-3)) # learning policy param_scheduler [ dict(typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict(typeMultiStepLR, begin0, end60, milestones[40, 55], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size512) # hooks default_hooks dict(checkpointdict(save_bestNME, ruleless, interval1))训练 60 个 epoch每个 epoch 结束做一次验证val_interval1优化器为 Adam初始学习率2e-3学习率策略分两段前 500 个iteration做线性 warm-up从 0.001 倍起步之后按 epoch 在milestones[40, 55]处各衰减一次gamma0.1auto_scale_lr声明基准批量 512若实际训练批量不同MMPose 会按线性缩放规则自动调整学习率避免换卡数后学习率失配checkpoint 钩子以NME为监控指标、ruleless越小越好保存最优权重。3.2 热图编解码器Codeccodec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma1.5)MSRAHeatmap源码见 mmpose/codecs/msra_heatmap.py负责关键点坐标 - 高斯热图的编码与热图 - 坐标的解码。核心参数input_size(256, 256)送入网络的图像尺寸W, Hheatmap_size(64, 64)输出热图分辨率为输入的 1/4sigma1.5高斯核标准差。从源码注释的经验公式sigma 0.3*((ks-1)*0.5-1)0.8看sigma≈1.5 对应约 7x7 的高斯核ks7是热图方案中的常用设定。3.3 模型结构主干 颈部 头部model dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeHRNet, in_channels3, extradict( stage1dict(num_modules1, num_branches1, blockBOTTLENECK, num_blocks(4, ), num_channels(64, )), stage2dict(num_modules1, num_branches2, blockBASIC, num_blocks(4, 4), num_channels(18, 36)), stage3dict(num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(18, 36, 72)), stage4dict(num_modules3, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(18, 36, 72, 144), multiscale_outputTrue), upsampledict(modebilinear, align_cornersFalse)), init_cfgdict(typePretrained, checkpointopen-mmlab://msra/hrnetv2_w18)), neckdict(typeFeatureMapProcessor, concatTrue), headdict( typeHeatmapHead, in_channels270, out_channels68, deconv_out_channelsNone, conv_out_channels(270, ), conv_kernel_sizes(1, ), lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict(flip_testTrue, flip_modeheatmap, shift_heatmapTrue))主干 HRNet-W18四阶段分别 1/2/4/3 个模块分支数 1→2→3→4各阶段通道数 (64)→(18,36)→(18,36,72)→(18,36,72,144)对应 W18 的 18 通道高分辨率支路定义multiscale_outputTrue输出全部 4 个尺度的特征。权重从open-mmlab://msra/hrnetv2_w18预训练初始化颈部 FeatureMapProcessorconcatTrue将 4 个尺度特征183672144270 通道上采样拼接成 270 通道这正是头部in_channels270的来源头部 HeatmapHead1x1 卷积压缩通道并输出 68 张热图out_channels68对应 68 个关键点损失为KeypointMSELoss带use_target_weight即按目标权重屏蔽不可见点测试增强flip_testTrue开启水平翻转测试flip_modeheatmap表示在热图层面融合左右翻转结果shift_heatmapTrue补偿翻转偏移可稳定提升精度。3.4 数据管道与加载器dataset_type Face300WLPDataset data_mode topdown data_root data/300wlp/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomBBoxTransform, shift_prob0, rotate_factor60, scale_factor(0.75, 1.25)), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ] val_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typePackPoseInputs) ]训练增强水平翻转 随机框变换不平移shift_prob0旋转 ±60°、尺度 0.75~1.25随后按TopdownAffine仿射变换到 256x256再用GenerateTarget复用codec生成热图标签验证/测试管道不做增强与目标生成仅仿射对齐 打包数据加载器训练batch_size2、num_workers2、persistent_workersTrue、DefaultSampler(shuffleTrue)验证批量 32、不打乱ann_file分别为annotations/face_landmarks_300wlp_train.json与annotations/face_landmarks_300wlp_valid.json图像前缀train/、val/评估器为NMEnorm_modekeypoint_distance详见第六节。四、数据集准备从原始 300W-LP 到 COCO 格式4.1 目录规划将数据按如下结构放置对应配置中data_rootdata/300wlp/data/300wlp/ ├── train/ # 训练图像 ├── val/ # 验证图像 ├── test/ # 测试图像 ├── 300W_LP/landmarks/ # 原始 *_pts.mat 关键点标注 └── annotations/ ├── face_landmarks_300wlp_train.json ├── face_landmarks_300wlp_valid.json └── face_landmarks_300wlp_test.json4.2 官方转换脚本解析tools/dataset_converters/300wlp2coco.py 提供一键转换流程分三步脚本__main__段move_img原始 300W-LP 按 AFW / HELEN / IBUG / LFPW 四个子集存放图片脚本将它们统一移动到./300W-LP/imagessplit_data按默认ratio10.8, ratio20.18:1:1随机切分为 train / val / test 三个目录convert_300WLP_to_coco对每张图读取同名*_pts.mat中的pts_2d数组写出 68 个[x, y, 2]关键点并由关键点最小/最大包围盒计算 bbox最终生成 COCO 格式的face_landmarks_300wlp_{train,val,test}.json。生成的 JSON 中categories为face1 类每张图/每个实例各一条记录COCO 风格结构可被Face300WLPDataset直接消费。4.3 数据集元信息Face300WLPDataset源码见 mmpose/datasets/datasets/face/face_300wlp_dataset.py继承BaseCocoStyleDataset通过METAINFO dict(from_fileconfigs/_base_/datasets/300wlp.py)引入数据集描述文件 configs/base/datasets/300wlp.py68 个关键点kpt-0 ~ kpt-67无骨架连接、joint_weights[1.]*68所有点等权重、sigmas[]。该数据集类同时支持data_modetopdown与bottomup本文方案使用前者——每个样本只含一个实例一张人脸及其 bbox。五、训练与测试命令5.1 训练单机单卡或在小批量环境验证配置内batch_size2即为此服务学习率由auto_scale_lr自动适配python tools/train.py configs/face_2d_keypoint/topdown_heatmap/300wlp/td-hm_hrnetv2-w18_8xb64-60e_300wlp-256x256.py单机多卡沿用文件名中的 8 卡设定dist_train.sh首个参数为配置、第二个为 GPU 数bash tools/dist_train.sh configs/face_2d_keypoint/topdown_heatmap/300wlp/td-hm_hrnetv2-w18_8xb64-60e_300wlp-256x256.py 8训练过程会按save_bestNME在每个 epoch 记录最优 checkpoint日志中同步输出 NME 曲线。5.2 测试与复现python tools/test.py configs/face_2d_keypoint/topdown_heatmap/300wlp/td-hm_hrnetv2-w18_8xb64-60e_300wlp-256x256.py /path/to/hrnetv2_w18_300wlp_256x256-xxx.pth使用官方权重即可复现表 1 中的 NME_full0.0413。若对标注做可视化检查可配合 demo/topdown_demo_with_mmdet.py 或 demo/inferencer_demo.py 进行推理演示。六、评估原理NME 指标的源码级说明本配置使用NMENormalized Mean Error作为评估指标实现位于 mmpose/evaluation/metrics/keypoint_2d_metrics.py。其norm_mode支持两种归一化方式源码第 733-747 行注释use_norm_item使用标注中预存的归一化因子keypoint_distance按关键点间距归一化。本配置采用的即为此模式通过预测关键点与真值的平均距离 / 归一化尺度如两眼间距得到与尺度无关的误差百分比。源码会对非法norm_mode抛KeyError并说明仅允许上述两种取值。NME 数值越低表示关键点定位越准是 300W/300W-LP 系列数据集的事实标准指标。七、小结与扩展本文以模型卡 hrnetv2_300wlp.md 为主线串起了 MMPose 中 300W-LP 人脸关键点任务的完整链路数据原始 300W-LP - 300wlp2coco.py 转换 -Face300WLPDataset加载face_300wlp_dataset.py元信息由 configs/base/datasets/300wlp.py 定义模型HRNetv2-W18 主干 FeatureMapProcessor多尺度拼接 HeatmapHead输出 68 通道热图标签编解码由 MSRAHeatmap 完成训练/评测60 epoch、Adam(2e-3)、warm-up MultiStepLR配合flip_test热图融合测试增强与 NME 指标监控。若需进一步调整可从三处入手修改codec.sigma与heatmap_size改变定位精细度、调节RandomBBoxTransform的rotate_factor/scale_factor增强大姿态鲁棒性、或替换主干为更大规模的 HRNetv2-W32需同步更新in_channels与预训练权重。本文涉及的完整配置与源码均可直接在仓库对应路径下查阅。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考