尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MMPose 手部姿态估计实战:MobileNetV2 骨干网络在 RHD 数据集上的 Top-Down Heatmap 配置全解析

MMPose 手部姿态估计实战:MobileNetV2 骨干网络在 RHD 数据集上的 Top-Down Heatmap 配置全解析 MMPose 手部姿态估计实战MobileNetV2 骨干网络在 RHD 数据集上的 Top-Down Heatmap 配置全解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmposeMMPoseOpenMMLab Pose Estimation Toolbox在configs/hand_2d_keypoint/topdown_heatmap/rhd2d/目录下提供了基于 Rendered Handpose DatasetRHD的 2D 手部关键点估计完整方案。本文以其中 MobileNetV2 骨干网络配置 td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.py 为核心逐段拆解其训练配置、数据管线、编解码器与评估指标并结合仓库源码解释底层实现原理。读完本文你将掌握如何在 MMPose 中复现并运行这套手部关键点方案理解 MobileNetV2 轻量骨干与 MSRAHeatmap 热图编解码的组合方式并学会如何用 PCK、AUC、EPE 指标评估手部姿态估计模型。方案总览MobileNetV2 骨干 RHD 数据集的组合该配置对应的模型卡片 mobilenetv2_rhd2d.md 明确标注了两篇核心工作MobileNetV2CVPR2018由 Sandler 等人提出的轻量骨干网络核心思想是Inverted Residuals倒残差结构与 Linear Bottlenecks线性瓶颈在保持精度的同时显著降低计算量适合对模型体积和推理速度敏感的场景。RHDRendered Handpose DatasetICCV2017Zimmermann 与 Brox 在论文Learning to Estimate 3D Hand Pose from Single RGB Images中提出的合成渲染手部数据集提供 2D 与 3D 手部关键点标注是手部姿态估计领域广泛使用的基准之一。该模型在RHD test set上的官方基准结果为模型架构输入尺寸PCK0.2AUCEPE权重文件训练日志pose_mobilenet_v2256x2560.9850.8832.79由 OpenMMLab 模型库提供见原始模型卡片由 OpenMMLab 模型库提供见原始模型卡片说明权重ckpt与训练日志log的下载链接记录在原始模型卡片中由 OpenMMLab 官方模型库托管。本文重点聚焦配置解读与复现路径。在 rhd2d 目录下MMPose 还提供了 ResNet50、HRNetv2-W18、HRNetv2-Dark、HRNetv2-UDP 等骨干的同类配置MobileNetV2 是其中计算量最小的轻量选项可用于对部署资源敏感的移动端或边缘端手部姿态估计场景。模型配置文件逐段解析整个训练流程由 td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.py 一个文件驱动。文件名本身即编码了关键信息td-hmtop-down heatmap 范式、mobilenetv2骨干网络、8xb648 卡 × batch size 64、210e210 个 epoch、rhd2d数据集、256x256输入图像尺寸。训练运行时与优化策略_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_size512) # hooks default_hooks dict(checkpointdict(save_bestAUC, rulegreater))各字段的作用如下train_cfg最多训练 210 个 epoch每 10 个 epoch 在验证集上评估一次。optim_wrapper采用Adam优化器初始学习率lr5e-4。相比 SGD 系优化器Adam 在姿态估计这类稠密回归任务上收敛更稳定。param_scheduler两段式学习率调度前500 次迭代执行线性 warm-upLinearLRstart_factor0.001即从 0.1% 的学习率线性升温到目标值by_epochFalse表示按迭代计之后按 epoch 执行MultiStepLR在epoch 170 和 200处将学习率乘以gamma0.1。auto_scale_lr声明base_batch_size512即 8 卡 × 64。当实际训练 batch size 与此不同时MMEngine 会自动按比例缩放学习率保证跨硬件配置下的训练行为一致。default_hookscheckpoint 保存策略以验证集AUC 最高为最优模型判定标准save_bestAUCrulegreater。这也说明 AUC 是本任务的核心监控指标。模型结构与 Heatmap Codec# codec settings codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2) # model settings model dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeMobileNetV2, widen_factor1., out_indices(7, ), init_cfgdict( typePretrained, checkpointmmcls://mobilenet_v2, )), headdict( typeHeatmapHead, in_channels1280, out_channels21, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))这一段的要点codec使用MSRAHeatmap编解码器源自Simple Baselines for Human Pose Estimation and Tracking, ECCV2018输入图像 256×256输出热图 64×64高斯核sigma2。即热图空间分辨率是输入图像的 1/4。data_preprocessor使用 ImageNet 统计量mean/std归一化bgr_to_rgbTrue处理 OpenCV 读取的 BGR 图像。backboneMobileNetV2widen_factor1.通道宽度不缩放out_indices(7,)取第 7 个输出即最后的conv21×1 卷积层输出1280 通道init_cfg使用mmcls://mobilenet_v2的 ImageNet 预训练权重初始化。headHeatmapHead输入 1280 通道特征输出 21 通道热图对应 RHD 的 21 个手部关键点损失函数为带关键点权重加权的 MSEKeypointMSELoss, use_target_weightTrue。test_cfg测试时启用水平翻转测试增强flip_testTrue翻转模式为热图级flip_modeheatmap并对翻转后的热图进行像素偏移补偿shift_heatmapTrue可进一步提升关键点定位精度。数据管线Pipelinedataset_type Rhd2DDataset data_mode topdown data_root data/rhd/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict( typeRandomBBoxTransform, rotate_factor180, scale_factor(0.7, 1.3)), 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) ]训练管线与验证管线的差异体现了 top-down 数据增强的核心思路LoadImage加载图像GetBBoxCenterScale从标注框计算中心点与尺度。训练阶段的随机增强组合RandomFlip水平随机翻转RandomBBoxTransform旋转范围高达 ±180°手部可任意朝向尺度缩放范围 0.71.3。TopdownAffine将裁剪区域仿射变换到 256×256GenerateTarget调用codec.encode把关键点坐标编码为高斯热图PackPoseInputs统一打包输入。验证阶段不做任何随机增强只做仿射归一化保证评估稳定性。数据加载器与评估器train_dataloader dict( batch_size64, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/rhd_train.json, data_prefixdict(img), pipelinetrain_pipeline, )) val_dataloader dict( batch_size32, num_workers2, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse, round_upFalse), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/rhd_test.json, data_prefixdict(img), test_modeTrue, pipelineval_pipeline, )) test_dataloader val_dataloader # evaluators val_evaluator [ dict(typePCKAccuracy, thr0.2), dict(typeAUC), dict(typeEPE), ] test_evaluator val_evaluator训练集标注文件为annotations/rhd_train.json验证/测试集为annotations/rhd_test.jsonRHD 官方不设独立验证集MMPose 直接用官方 test set 作为验证与测试集。训练 batch size 64、验证 batch size 32num_workers2。评估器同时启用PCK0.2、AUC、EPE三个指标这是 RHD 基准的官方评估协议。MobileNetV2 骨干网络源码解析在 mmpose/models/backbones/mobilenet_v2.py 中MobileNetV2 以BaseBackbone子类实现核心是InvertedResidual模块倒残差结构先经 1×1 卷积升维expand_ratio6时隐藏层通道为输入的 6 倍再经 3×3 深度可分离卷积groupshidden_dim最后用 1×1 卷积降维回输出通道且末尾不使用激活函数act_cfgNone这正是论文中的 Linear Bottlenecks 设计。残差连接条件仅当stride 1且in_channels out_channels时才启用恒等残差use_res_connect见源码第 54 行附近。网络结构表arch_settings定义了 7 个倒残差阶段[[1, 16, 1, 1], [6, 24, 2, 2], [6, 32, 3, 2], [6, 64, 4, 2], [6, 96, 3, 1], [6, 160, 3, 2], [6, 320, 1, 1]]每项依次为 expand_ratio、通道数、块数、首块 stride。第 8 个输出是conv2的 1×1 卷积层输出固定为 1280 通道widen_factor 1.0时按比例放大。配置中的out_indices(7,)即取该最终输出这也是HeatmapHead的in_channels1280的来源。可选frozen_stages冻结前若干阶段参数、norm_eval冻结 BN 统计量等训练技巧在该类中均有实现。RHD 数据集详解与关键点顺序陷阱RHD 数据集在 MMPose 中由 Rhd2DDataset 类实现它继承BaseCocoStyleDataset数据元信息关键点定义、骨架、颜色声明在 configs/base/datasets/rhd2d.py 中。RHD 共 21 个关键点顺序为索引名称索引名称0wrist手腕11middle_finger21thumb412middle_finger12thumb313ring_finger43thumb214ring_finger34thumb115ring_finger25forefinger416ring_finger16forefinger317pinky_finger47forefinger218pinky_finger38forefinger119pinky_finger29middle_finger420pinky_finger110middle_finger3关键点顺序陷阱务必注意configs/base/datasets/rhd2d.py 的注释明确说明在 RHD 中每根手指的编号14 是从指尖到掌根排列thumb4 最靠近指尖而在 COCO-WholeBody-Hand、FreiHand、CMU Panoptic HandDB 等数据集中顺序恰好相反。因此如果希望将 RHD 与其他手部数据集混合训练同一个模型必须先统一关键点顺序。同时keypoint_info不会直接改变数据集内关键点的实际排列顺序它主要用于可视化与记录flip_pairs等翻转配对信息。单元测试 test_rhd2d_dataset.py 使用tests/data/rhd下的测试标注验证了数据集在topdown与bottomup两种data_mode下返回的data_info字段类型可用于快速了解该数据集的对外接口。数据准备目录结构按照 docs/en/dataset_zoo/2d_hand_keypoint.md 的说明下载 RHD 官方数据与 OpenMMLab 提供的标注文件rhd_annotations.zip后解压到仓库根目录的data/下目录应组织为data/rhd/ ├── annotations │ ├── rhd_train.json │ └── rhd_test.json ├── training │ ├── color/ # 训练集 RGB 图像 │ ├── depth/ # 训练集深度图 │ └── mask/ # 训练集掩码 └── evaluation ├── color/ # 测试集 RGB 图像 ├── depth/ └── mask/MSRAHeatmap 编解码器关键点与热图之间的双向转换Mmmpose/codecs/msra_heatmap.py 实现了本配置使用的MSRAHeatmap其核心机制如下编码encode将 256×256 输入空间中的关键点坐标除以scale_factorinput_size / heatmap_size 4映射到 64×64 热图空间再以sigma2生成高斯峰generate_gaussian_heatmaps同时输出关键点权重keypoint_weights。源码第 7475 行计算scale_factor第 110 行调用高斯热图生成函数。此外该类还内置了unbiasedTrue的 DarkPose 变体支持generate_unbiased_gaussian_heatmapsrefine_keypoints_dark。解码decode从预测热图取最大值位置get_heatmap_maximum获得粗略坐标再经refine_keypoints进行亚像素细化最后乘回scale_factor还原到输入图像空间。这一解码逻辑挂在HeatmapHead的decoder字段上训练与推理共用。HeatmapHead 与 KeypointMSELossHmmpose/models/heads/heatmap_heads/heatmap_head.py 中的HeatmapHead源自Simple Baselines论文结构为若干反卷积层deconv 中间卷积层 最终 1×1 卷积。本配置未显式指定反卷积参数因此使用默认值3 层反卷积输出通道(256, 256, 256)核大小(4, 4, 4)最后接 1×1 卷积输出 21 通道热图。1280 通道的低分辨率特征经三层反卷积上采样后正好匹配 64×64 的热图尺寸。损失函数 KeypointMSELoss 采用均方误差衡量预测热图与高斯目标热图的差异use_target_weightTrue时按关键点权重加权——RHD 中所有 21 个关键点的权重均为 1.0见joint_weights[1.] * 21该机制主要为处理含遮挡/缺失关键点的场景预留。评估指标PCK、AUC 与 EPE三个指标全部实现在 mmpose/evaluation/metrics/keypoint_2d_metrics.py 中PCKPercentage of Correct KeypointsPCKAccuracy计算预测关键点与真值距离在归一化阈值内的比例。thr0.2表示距离阈值为人手检测框尺寸的 20%norm_itembbox默认以 bbox 尺寸归一化即常说的 PCK0.2。AUCArea Under CurveAUC通过遍历不同 PCK 阈值绘制曲线并计算面积norm_factor30像素、num_thrs20为默认设置用于综合评价定位精度曲线。EPEEnd-Point ErrorEPE直接计算所有预测关键点与真值的平均端点像素误差数值越小越好。三者的互补关系PCK 反映阈值内的命中率AUC 反映精度曲线的整体水平EPE 反映绝对像素误差。训练与测试命令数据准备就绪后按 docs/en/user_guides/train_and_test.md 的说明即可训练。单卡训练python tools/train.py configs/hand_2d_keypoint/topdown_heatmap/rhd2d/td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.py多卡分布式训练以 8 卡为例bash tools/dist_train.sh configs/hand_2d_keypoint/topdown_heatmap/rhd2d/td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.py 8测试评估python tools/test.py configs/hand_2d_keypoint/topdown_heatmap/rhd2d/td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.py checkpoint路径训练期间 checkpoint 会依据验证集 AUC 自动保存最优权重测试输出即 PCK0.2、AUC、EPE 三项指标。与其他骨干网络的基准对比在同一数据集与训练协议8×batch size 64、210 epoch、256×256 输入下rhd2d 目录中的模型卡片记录了对齐的对比结果骨干网络PCK0.2AUCEPE对应配置MobileNetV20.9850.8832.79td-hm_mobilenetv2_8xb64-210e_rhd2d-256x256.pyResNet500.9910.8982.32td-hm_res50_8xb64-210e_rhd2d-256x256.pyHRNetv2-W180.9920.9022.21td-hm_hrnetv2-w18_8xb64-210e_rhd2d-256x256.py可以看到MobileNetV2 在精度上略低于 ResNet50 与 HRNetv2-W18但其计算量与参数量显著更小属于精度/效率权衡下的轻量选项。同目录还提供了 HRNetv2-Dark 与 HRNetv2-UDP 等进阶解码策略的配置可作为精度优先场景的参考。读者可根据实际算力与部署约束选择合适的骨干。总结本文围绕 MMPose 中 MobileNetV2 RHD 的 Top-Down Heatmap 手部关键点方案完成了从模型卡片到源码实现的全链路解读训练配置中的优化器、学习率调度、数据增强与评估协议MobileNetV2 的倒残差结构RHD 数据集的 21 关键点定义及其与主流手部数据集的顺序差异MSRAHeatmap 的编解码机制以及 PCK/AUC/EPE 三项指标的计算方式。这套方案可直接复现运行也可作为在 MMPose 中搭建其他 top-down 手部姿态估计任务的模板——只需替换骨干网络、数据集标注与关键点数量即可快速迁移。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表