ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MMPose 手部关键点估计实战:HRNetv2-W18 + DarkPose 在 COCO-WholeBody-Hand 上的 2D 手部姿态估计

2026/9/17 18:35:04 拓冰建站 浏览量
MMPose 手部关键点估计实战:HRNetv2-W18 + DarkPose 在 COCO-WholeBody-Hand 上的 2D 手部姿态估计 MMPose 手部关键点估计实战HRNetv2-W18 DarkPose 在 COCO-WholeBody-Hand 上的 2D 手部姿态估计【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文围绕 MMPose 官方在 COCO-WholeBody-Hand 手部关键点数据集上提供的经典配置HRNetv2-W18 DarkPose 自顶向下top-down热图模型展开完整讲解其网络架构、DarkPose 无偏高斯编解码原理、完整配置文件、数据集加载逻辑与训练/测试/推理流程。读完本文你将掌握如何在 MMPose 中复现该模型的 PCK0.2 / AUC / EPE 指标并能够基于配置与源码理解 heatmap 编解码机制进而迁移到其他手部或身体关键点任务。一、方案概览HRNetv2、DarkPose 与 COCO-WholeBody-Hand本文所述模型在官方模型库中收录于configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/目录对应配置名td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256它由三部分技术组件构成HRNetv2 骨干网络TPAMI2019Deep High-Resolution Representation Learning for Visual Recognition与常见的先下采样再上采样的单分支骨干不同HRNet 在整个前向过程中始终保持高分辨率分支并通过多分辨率分支之间反复交换信息从而输出空间分辨率与语义丰富度兼备的特征图。DarkPose 编解码方法CVPR2020Distribution-aware coordinate representation for human pose estimation在训练阶段使用无偏高斯热图unbiasedTrue在推理阶段基于热图分布的泰勒展开做二阶坐标修正缓解经典 argmax 坐标量化带来的系统性偏差。COCO-WholeBody-Hand 数据集ECCV2020Whole-Body Human Pose Estimation in the Wild从 COCO-WholeBody 133 个全身关键点中抽取的 42 个手部关键点左右手各 21 个覆盖腕部与五根手指。官方验证集结果在 COCO-WholeBody-Hand 验证集上的官方结果如下指标分别为 PCK0.2、AUC、EPE输入尺寸 256x256ArchInput SizePCK0.2AUCEPEpose_hrnetv2_w18_dark256x2560.8140.8404.37权重文件与日志的下载信息收录在 hrnetv2_dark_coco_wholebody_hand.yml 中其中记录了架构HRNetv2 DarkPose、训练数据COCO-WholeBody-Hand以及上述三项指标可直接作为复现与模型选择依据。二、配置文件逐段解读核心训练/测试配置位于 td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py下面按模块拆解。1. 运行时与优化器_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs210, val_interval10) # optimizer optim_wrapper dict(optimizerdict(typeAdam, lr5e-4,)) # learning policy param_scheduler [ dict(typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict(typeMultiStepLR, begin0, end210, milestones[170, 200], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size256)模型继承 configs/base/default_runtime.py 中的默认运行时设置日志、钩子、visualizer 等。训练 210 个 epoch每 10 个 epoch 在验证集上评测一次。优化器使用 Adam初始学习率5e-4前 500 次迭代用线性 warm-up起始系数 0.001随后在第 170 和 200 epoch 处各降学习率 10 倍。auto_scale_lr声明基准 batch size 为 256当实际训练 batch size 不同时 MMPose 会自动等比缩放学习率。默认运行时中default_hooks.checkpoint使用save_bestAUC, rulegreater即按照验证 AUC 保存最优权重。2. CodecDarkPose 无偏热图编码codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2, unbiasedTrue)这是整个方案的灵魂配置。MSRAHeatmapcodec 的实现在 mmpose/codecs/msra_heatmap.py其核心参数input_size(256, 256)输入图像尺寸宽、高。heatmap_size(64, 64)输出热图尺寸即输入被下采样 4 倍。sigma2高斯核标准差决定标注点在热图上扩散的范围3-sigma 规则下高斯半径约为 6 个像素。unbiasedTrue启用 DarkPose 的无偏编码与解码。编码时调用generate_unbiased_gaussian_heatmaps见 mmpose/codecs/utils/gaussian_heatmap.py其特点是高斯中心使用连续浮点坐标mu keypoints[n, k]不取整避免传统取整带来的中心偏移误差解码时调用refine_keypoints_dark做二阶修正。blur_kernel_size默认 11解码阶段高斯模糊核大小代码注释中给出了经验公式sigma 0.3*((ks-1)*0.5-1)0.8即 ks11 对应 sigma2与训练时的sigma2匹配。编码输出为(K, H, W)的热图与(N, K)的keypoint_weights解码时先由get_heatmap_maximum取热图最大响应点mmpose/codecs/utils/post_processing.py再乘以scale_factor input_size / heatmap_size 4还原到输入图像坐标系。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(...), init_cfgdict( typePretrained, checkpointopen-mmlab://msra/hrnetv2_w18)), neckdict(typeFeatureMapProcessor, concatTrue,), headdict( typeHeatmapHead, in_channels270, out_channels21, deconv_out_channelsNone, lossdict(typeKeypointMSELoss, use_target_weightTrue), conv_out_channels(270,), conv_kernel_sizes(1,), decodercodec), test_cfgdict(flip_testTrue, flip_modeheatmap, shift_heatmapTrue,))整体估计器为TopdownPoseEstimatormmpose/models/pose_estimators/topdown.py属于自顶向下范式先由检测器给出人手框再对每个框内实例预测关键点。骨干为 HRNet-w18四阶段多分辨率结构stage11 个模块、1 分支、BOTTLENECK、64 通道→ stage21 模块、2 分支、BASIC、18/36 通道→ stage34 模块、3 分支、18/36/72 通道→ stage43 模块、4 分支、18/36/72/144 通道multiscale_outputTrue输出多尺度特征。骨干使用 ImageNet 预训练权重初始化open-mmlab://msra/hrnetv2_w18。颈部FeatureMapProcessor(concatTrue)将 HRNet 多尺度特征沿通道拼接因此检测头输入通道数为 183672144 270与in_channels270对应。检测头为HeatmapHeadmmpose/models/heads/heatmap_heads/heatmap_head.pydeconv_out_channelsNone表示不使用反卷积上采样HRNet 已提供高分辨率特征仅用 1x1 卷积conv_out_channels(270,),conv_kernel_sizes(1,)将 270 通道压缩到out_channels2121 个手部关键点损失为带目标权重的KeypointMSELoss。test_cfg开启水平翻转测试TTA对原图与翻转图分别前向用flip_modeheatmap融合两张热图并取平均该逻辑在HeatmapHead.predict中实现shift_heatmapTrue用于校正翻转带来的热图偏移。4. 数据流水线pipelinetrain_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomBBoxTransform, rotate_factor180, scale_factor(0.7, 1.3)), dict(typeRandomFlip, directionhorizontal), 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) ]训练流水线包含随机旋转±180 度手部朝向任意、随机缩放0.71.3 倍、水平翻转等增强GenerateTarget调用MSRAHeatmap.encode生成无偏高斯热图与关键点权重。验证流水线不做增强仅做仿射对齐TopdownAffine与打包。5. 数据加载与评估dataset_type CocoWholeBodyHandDataset data_mode topdown data_root data/coco/训练/验证分别使用annotations/coco_wholebody_train_v1.0.json与annotations/coco_wholebody_val_v1.0.json图片前缀为train2017/、val2017/数据根目录为data/coco/MMPose 数据集准备约定见 docs/zh_cn/user_guides/prepare_datasets.md。批量大小 32、2 个 worker、persistent_workersTrue。评估器同时挂载三个指标PCKAccuracy(thr0.2)、AUC、EPE。三、DarkPose 原理与源码级解析DarkPose 相比普通 heatmap 方案有两个关键改进均可从源码中直接验证。编码端训练标签普通generate_gaussian_heatmaps把关键点坐标取整到像素中心再生成高斯mu (keypoints[n, k] 0.5).astype(np.int64)而 DarkPose 的generate_unbiased_gaussian_heatmaps直接以浮点坐标mu keypoints[n, k]为中心生成连续高斯见 mmpose/codecs/utils/gaussian_heatmap.py 第 205-260 行。这消除了标签取整带来的系统性编码偏差。解码端推理坐标refine_keypoints_darkmmpose/codecs/utils/refinement.py 第 49-102 行的流程为先用gaussian_blur对预测热图做高斯模糊调制核大小与训练 sigma 匹配并取对数把高斯分布拉直为便于泰勒展开的形式在 argmax 峰值点处计算一阶导dx, dy与 Hessian 矩阵[[dxx, dxy], [dxy, dyy]]通过相邻像素差分近似求解偏移量offset -H^{-1} · g将预测坐标沿二阶曲面极值方向平移得到亚像素精度坐标。作为对比非 Dark 的普通解码refine_keypoints只是向次大值方向移动固定 0.25 像素同文件第 9-46 行精度提升有限。DarkPose 的泰勒二阶修正对提高 AUC / 降低 EPE 贡献显著——这也是本配置在 hrnetv2_coco_wholebody_hand.md 中无 Dark 版本PCK0.2 0.803 / AUC 0.832 / EPE 4.78之外的又一档模型选择。四、数据集COCO-WholeBody-Hand 的加载细节数据集类CocoWholeBodyHandDataset定义于 mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py元信息21 个关键点名称、骨架连接、颜色、sigmas 等来自 configs/base/datasets/coco_wholebody_hand.py。21 个关键点的顺序为wrist腕部、thumb1~4拇指、forefinger1~4食指、middle_finger1~4中指、ring_finger1~4无名指、pinky_finger1~4小指。从_load_annotations实现可以看到两个值得注意的细节每张 COCO 图像中同时存在左手和右手两套标注lefthand_valid/righthand_valid只有当对应手标注有效且关键点存在max(hand_kpts) 0时才会被解析为一个 top-down 实例因此一个图像最多贡献两个训练样本关键点可见性keypoints_visible np.minimum(1, kpts[..., 2])被用作keypoint_weights参与 MSE 损失的加权use_target_weightTrue。该数据集的单元测试 tests/test_datasets/test_datasets/test_hand_datasets/test_coco_wholebody_hand_dataset.py 验证了 top-down 模式下实例数、元信息键、data_mode校验与bbox_file使用约束等行为可作为二次开发参考。五、训练、测试与推理实战1. 训练在按文档准备好data/coco/数据后使用单卡或分布式脚本启动训练# 单卡 python tools/train.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py # 8 卡分布式 bash tools/dist_train.sh configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py 8训练中每 10 个 epoch 在验证集评测并按 AUC 保存最优 checkpoint。2. 测试与指标复现python tools/test.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py checkpoint路径三个指标的行为分别由 mmpose/evaluation/metrics/keypoint_2d_metrics.py 中的PCKAccuracy、AUC、EPE实现PCK0.2预测点与真值点的归一化距离小于阈值 0.2默认以 bbox 尺寸归一化的百分比AUC改变 PCK 阈值生成的曲线下面积默认norm_factor30像素、20 个阈值衡量整体定位精度EPE所有关键点的端点平均误差像素值越小越好。3. 推理可以借助 MMPose 的高层 API 完成单张图片的 top-down 推理核心调用链为init_model→inference_topdown见 mmpose/apis/inference.pyimport mmcv from mmpose.apis import inference_topdown, init_model config configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_hrnetv2-w18_dark-8xb32-210e_coco-wholebody-hand-256x256.py checkpoint checkpoints/hrnetv2_w18_coco_wholebody_hand_256x256_dark.pth model init_model(config, checkpoint, devicecuda:0) img mmcv.imread(a_hand_image.jpg) # 以人手检测框xyxy 格式为输入 bboxes [[100, 120, 260, 280]] results inference_topdown(model, img, bboxes) pred results[0].pred_instances print(pred.keypoints, pred.keypoint_scores)若不给bboxesinference_topdown默认将整张图视为一个实例区域。真实应用中建议先用检测器如 demo/topdown_demo_with_mmdet.py 所示定位人手框再送入本模型。需要可视化时也可参考 demo/image_demo.py 与 demo/inferencer_demo.py。六、总结与扩展本文以 MMPose 官方td-hm_hrnetv2-w18_dark配置为线索完整覆盖了 HRNetv2-W18 骨干 DarkPose 无偏热图编解码 COCO-WholeBody-Hand 21 点手部关键点估计这一经典组合既给出了可直接复现的配置细节输入 256x256、热图 64x64、sigma2、210 epoch、PCK0.20.814 / AUC0.840 / EPE4.37也从 MSRAHeatmap 与 refinement.py 源码层面解释了 DarkPose 亚像素解码的数学原理。在 MMPose 中同一目录下还提供了 resnet、hourglass、litehrnet 等不同骨干配置以及 RTMPose 手部模型。若希望获得更快的推理速度或更高精度可以在理解本文编解码机制的基础上将这些 backbone 替换进同一套 codec 与训练流程中进行对比实验。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考