MMPose 手部 2D 关键点估计实战:ResNet-50 结合 SimpleBaseline 在 COCO-WholeBody-Hand 上的完整配置与训练解析

发布时间:2026/9/17 7:52:31
MMPose 手部 2D 关键点估计实战:ResNet-50 结合 SimpleBaseline 在 COCO-WholeBody-Hand 上的完整配置与训练解析 MMPose 手部 2D 关键点估计实战ResNet-50 结合 SimpleBaseline 在 COCO-WholeBody-Hand 上的完整配置与训练解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本文聚焦 MMPose 仓库中基于 Top-Down 热图范式SimpleBaseline2D ResNet-50的 COCO-WholeBody-Hand 手部关键点估计模型从数据集定义、完整训练配置、编解码器原理、数据流水线到 PCK/AUC/EPE 评估指标进行逐层拆解。读完本文你将掌握该模型在 td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py 配置下的训练、验证、测试与推理全流程并能理解每个关键配置项背后的源码级原理。一、任务与数据集COCO-WholeBody-Hand 的 21 点手部标注COCO-WholeBody 数据集由 Jin 等人于 ECCV 2020 提出论文Whole-Body Human Pose Estimation in the Wild它在 COCO 数据集基础上扩展出全身共 133 个关键点其中手部每个实例包含21 个关键点。MMPose 将手部任务独立抽取为CocoWholeBodyHandDataset见 mmpose/datasets/datasets/hand/coco_wholebody_hand_dataset.py其文档字符串明确列出 21 点的完整定义0wrist手腕1–4thumb1–thumb4拇指5–8forefinger1–forefinger4食指9–12middle_finger1–middle_finger4中指13–16ring_finger1–ring_finger4无名指17–20pinky_finger1–pinky_finger4小指数据集的关键点定义、骨架连接、关节权重与 OKS sigma 均登记在元信息文件中configs/base/datasets/coco_wholebody_hand.py。该文件通过keypoint_info描述 21 个点的名称、id、可视化颜色通过skeleton_info描述手指的骨架连接例如wrist→thumb1→thumb2→thumb3→thumb4并将joint_weights全部置为1.0同时给出了每个关键点的sigmas用于 OKS 计算。从 CocoWholeBodyHandDataset 源码 可以看到标注加载的关键逻辑一张图片中最多可能出现左右手两个有效实例数据加载时通过ann[lefthand_valid]/ann[righthand_valid]与max(ann[f{type}hand_kpts]) 0双重过滤无效手部标注随后将 COCO 格式的xywh框通过bbox_xywh2xyxy转为xyxy格式并将每个关键点的可见性取为min(1, kpt_vis)。在本模型的配置中数据集根目录为data/coco/训练与验证分别使用annotations/coco_wholebody_train_v1.0.json与annotations/coco_wholebody_val_v1.0.json图像前缀分别为train2017/与val2017/。数据集准备步骤可参考 docs/en/user_guides/prepare_datasets.md。二、算法管线总览Top-Down 热图范式与 SimpleBaseline2D该模型采用经典的Top-Down自上而下热图回归范式先由检测器给出手部边界框再对每个裁剪出的手部区域独立回归 21 张关键点热图。整体网络由TopdownPoseEstimator装配见 mmpose/models/pose_estimators/topdown.py其组成如下输入手部图像 (256×256×3) → PoseDataPreprocessorImageNet 归一化 → ResNet-50 骨干网络输出 2048 通道、8×8 特征图 → HeatmapHead3 层反卷积上采样至 64×64 1×1 卷积输出 21 通道热图 → MSRAHeatmap 解码器由热图最大值恢复 21 点坐标其中骨干网络采用 ResNetCVPR 2016Deep Residual Learning for Image Recognition整体 ResNet 反卷积 热图回归 的结构即源自 ECCV 2018 的Simple Baselines for Human Pose Estimation and TrackingSimpleBaseline2D。三者对应的引用文献均完整登记在模型库条目 resnet_coco_wholebody_hand.md 中。模型配置中backbone使用ResNetdepth50并通过init_cfgdict(typePretrained, checkpointtorchvision://resnet50)加载 ImageNet 预训练权重。头部HeatmapHead见 mmpose/models/heads/heatmap_heads/heatmap_head.py的输入通道in_channels2048与 ResNet-50 最后一个 stage 的输出通道一致输出通道out_channels21与手部关键点数量一致。从 HeatmapHead 源码 可见其默认构造参数为deconv_out_channels(256, 256, 256)、deconv_kernel_sizes(4, 4, 4)即3 层 256 通道、stride 为 2 的反卷积层每层后接 BatchNorm 与 ReLU之后可选中间卷积层默认无最后由一个 1×1 卷积输出热图。由于 ResNet-50 输出特征为输入图的 1/32 分辨率256×256 → 8×8经过 3 次 ×2 上采样后恰好得到 64×64 的热图——这与配置中heatmap_size(64, 64)完全吻合即最终热图是输入尺寸的 1/4。三、完整配置精读逐段拆解 210 轮训练的所有关键参数以下完整继承自 td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py并逐段给出参数说明3.1 运行期配置epoch 与验证节奏_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs210, val_interval10)模型总共训练210 个 epoch每10 个 epoch在验证集上评估一次。基础运行配置继承自 configs/base/default_runtime.py其中包含日志间隔interval50、checkpoint 保存间隔默认interval10、SyncBuffersHook同步 BN 统计量、PoseLocalVisualizer可视化器以及cudnn_benchmarkFalse等多进程环境配置。3.2 优化器与学习率调度# 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) ]优化器使用Adam初始学习率lr5e-4。先进行500 个 iteration 的线性 warm-upby_epochFalse表示按迭代步数计算起始学习率为最终的0.001倍用于稳定训练初期。之后按 epoch 采用MultiStepLR在第 170、200 个 epoch 时将学习率乘以gamma0.1即衰减两次。配套的auto_scale_lr dict(base_batch_size256)表示当实际训练总 batch size 不等于 256 时MMEngine 会自动按比例缩放学习率保证不同显卡数量下训练的等价性。配置名8xb32即 8 张 GPU × 每卡 batch 32 256与基准 batch size 一致。3.3 Checkpoint 保存策略# hooks default_hooks dict(checkpointdict(save_bestAUC, rulegreater))覆盖继承自default_runtime.py的 checkpoint hook改为依据验证集 AUC 指标保存最优权重rulegreater表示越大越好。这也是本模型在模型库中 AUC 0.833 这一指标的来源口径。3.4 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( typeResNet, depth50, init_cfgdict(typePretrained, checkpointtorchvision://resnet50)), headdict( typeHeatmapHead, in_channels2048, out_channels21, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))PoseDataPreprocessor采用 ImageNet 统计量做标准化mean/std并设置bgr_to_rgbTrue适配常规读图后端。MSRAHeatmap编解码器是本模型的核心标签方案将在下一节详细展开。HeatmapHead的损失为KeypointMSELoss见 mmpose/models/losses/heatmap_loss.py开启use_target_weightTrue即按各关键点的目标权重加权计算 MSE。test_cfg开启flip test测试期水平翻转 TTAflip_modeheatmap表示在热图层面融合shift_heatmapTrue用于修正翻转后热图错位。3.5 训练 / 验证流水线# pipelines train_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) ]训练流水线包含RandomBBoxTransform数据增强其中rotate_factor180允许任意角度旋转——这是手部任务区别于人体姿态的显著特点手在图像中可以出现在任意朝向scale_factor(0.7, 1.3)表示框尺度在 0.71.3 倍之间随机缩放。随后水平随机翻转、仿射变换到 256×256、按 codec 生成高斯热图目标并打包。验证流水线则不做任何数据增强仅做仿射对齐以保证评估的公平性。3.6 Dataloader 与评估器# data loaders train_dataloader dict( batch_size32, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/coco_wholebody_train_v1.0.json, data_prefixdict(imgtrain2017/), 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/coco_wholebody_val_v1.0.json, data_prefixdict(imgval2017/), test_modeTrue, pipelineval_pipeline, )) test_dataloader val_dataloader val_evaluator [ dict(typePCKAccuracy, thr0.2), dict(typeAUC), dict(typeEPE) ] test_evaluator val_evaluatordataset_type CocoWholeBodyHandDatasetdata_mode topdown每个样本只含单个实例。训练与验证的 batch size 均为 32persistent_workersTrue复用 worker 进程。验证/测试评估器同时启用PCKAccuracythr0.2、AUC与EPE三项指标与模型库结果表中的指标一一对应。四、MSRAHeatmap 编解码器高斯热图如何生成与还原坐标MSRAHeatmap是实现于 mmpose/codecs/msra_heatmap.py 的BaseKeypointCodec子类其名称取自 SimpleBaselines 论文。核心参数为input_size、heatmap_size与sigma。编码encode阶段源码 L77-L118首先计算缩放因子scale_factor input_size / heatmap_size 256 / 64 4将关键点坐标除以scale_factor映射到 64×64 的热图空间通过generate_gaussian_heatmaps以sigma2为每个关键点生成二维高斯响应得到形状为(K, H, W) (21, 64, 64)的热图同时生成keypoint_weights目标权重未标注或遮挡的关键点权重为 0。MSRAHeatmap还预留了unbiasedDarkPose 无偏编码与blur_kernel_size参数当unbiasedTrue时改用generate_unbiased_gaussian_heatmaps并在解码阶段调用refine_keypoints_dark做亚像素修正默认unbiasedFalse即本配置采用标准 MSRA 方案。解码decode阶段源码 L120-L153对每张热图调用get_heatmap_maximum取最大值位置作为初始坐标通过refine_keypoints利用热图最大值邻域的响应做亚像素偏移修正这是热图回归精度提升的关键一步将坐标乘回scale_factor还原到 256×256 的输入图像空间同时输出每个关键点的置信度分数。五、训练配置背后的实现原理损失、翻转与指标5.1 KeypointMSELoss带权重掩码的 MSEKeypointMSELoss 源码 表明当use_target_weightTrue时损失为逐像素 MSE 与target_weights掩码相乘后求平均从而忽略遮挡或未标注的关键点通道对梯度的贡献skip_empty_channel默认 False还可进一步跳过完全为空的热图通道。HeatmapHead.loss在计算损失的同时还会统计热图级 PCK 精度acc_pose作为训练日志。5.2 Flip Test 测试时增强TopdownPoseEstimator.predictmmpose/models/pose_estimators/topdown.py#L102-L109在flip_testTrue时会分别对原图与水平翻转图提取特征随后HeatmapHead.predict对两套热图执行flip_heatmaps融合heatmap_head.py L253-L264翻转热图按flip_modeheatmap与关键点交换索引对齐shift_heatmapTrue修正翻转造成的 1 像素偏移最终两套热图取平均再解码坐标。由于手部左右手在数据集中是独立实例关键点 swap 信息为空翻转对齐依赖数据集生成的flip_indices元信息。从数据加载、仿射变换到翻转融合的全流程均有对应测试用例覆盖于 tests/test_datasets/test_datasets 与 tests/test_codecs/test_msra_heatmap.py。5.3 三项评估指标的源码口径三项指标全部实现在 mmpose/evaluation/metrics/keypoint_2d_metrics.pyPCKAccuracyPCK0.2PCK 衡量预测关键点与真值的距离是否小于 阈值 × 归一化尺寸。PCKAccuracy的norm_itembbox表示以边界框尺寸max(w, h)见 源码 L120-L126归一化本配置将thr设为0.2因此PCK0.2表示归一化距离小于 0.2 的预测点比例。默认阈值为 0.05手部任务采用更宽松的 0.2。AUC通过改变 PCK 阈值默认norm_factor30像素、num_thrs20个阈值档位绘制 PCK 曲线并计算曲线下面积综合反映模型在不同精度要求下的表现AUC 源码 L539-L634。EPE端到端平均误差即预测关键点与真值的平均欧氏距离像素数值越小越好EPE 源码 L638-L718。评估时仅统计keypoints_visible为真的关键点process阶段会通过可见性掩码过滤。六、官方基准结果该模型在COCO-WholeBody-Hand 验证集上的官方结果为来源resnet_coco_wholebody_hand.mdArchInput SizePCK0.2AUCEPEConfigpose_resnet_50256×2560.8000.8334.64td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py对应预训练权重与训练日志已在模型库中登记可通过 resnet_coco_wholebody_hand.yml 及仓库根目录的 model-index.yml 检索下载地址模型名td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256权重文件约res50_coco_wholebody_hand_256x256-8dbc750c_20210908.pth。七、训练、测试与推理实战命令7.1 单卡 / 多卡训练# 单卡训练 python tools/train.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py # 8 卡分布式训练与配置基准 8xb32 对应 bash tools/dist_train.sh configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py 8训练入口为 tools/train.py分布式脚本为 tools/dist_train.sh。若使用不同 GPU 数量导致总 batch size 变化auto_scale_lr会自动修正学习率。训练过程中每 10 个 epoch 验证一次并依据验证 AUC 保存最优 checkpoint。7.2 测试与指标复现python tools/test.py configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_res50_8xb32-210e_coco-wholebody-hand-256x256.py /path/to/checkpoint.pth测试入口为 tools/test.py会输出 PCK0.2、AUC、EPE 三项指标可直接与模型库结果表比对。7.3 基于 Inferencer 的端到端推理手部 2D 姿态推理属于 top-down 流程需要先由手部检测器给出边界框。仓库提供了手部专用检测配置 demo/mmdetection_cfg/rtmdet_nano_320-8xb32_hand.py配合 demo/inferencer_demo.py 可完成检测 关键点的完整推理python demo/inferencer_demo.py 待推理图片路径 \ configs/hand_2d_keypoint/topdown_heatmap/coco_wholebody_hand/td-hm_res50_8xb32-210e-coco-wholebody-hand-256x256.py \ --checkpoint /path/to/checkpoint.pth \ --detector demo/mmdetection_cfg/rtmdet_nano_320-8xb32_hand.py推理输出的 21 个关键点坐标与置信度会写入结果文件可用于手势识别、手部姿态分析等下游应用。更多推理方式参见 docs/en/user_guides/inference.md 与 docs/en/user_guides/train_and_test.md。八、在同任务上的扩展多种骨干网络对比同一任务目录下还提供了多种骨干网络的 Top-Down 热图实现便于横向对比精度与速度的权衡Hourglasstd-hm_hourglass52_8xb32-210e_coco-wholebody-hand-256x256.py、hourglass_coco_wholebody_hand.mdHRNetv2td-hm_hrnetv2-w18_8xb32-210e_coco-wholebody-hand-256x256.py另有 DarkPose 变体hrnetv2_darkLiteHRNettd-hm_litehrnet-w18_8xb32-210e_coco-wholebody-hand-256x256.pyMobileNetV2td-hm_mobilenetv2_8xb32-210e_coco-wholebody-hand-256x256.pySCNettd-hm_scnet50_8xb32-210e_coco-wholebody-hand-256x256.py这些配置与 ResNet-50 版本共享相同的数据集、codec 与评估协议仅替换骨干网络与头部输入通道是研究骨架网络对手部关键点精度影响的现成实验集合。此外若需进行单手数据集迁移或自定义关键点定义可参考 docs/en/advanced_guides/codecs.md 与 docs/en/advanced_guides/customize_datasets.md 了解 codec 与数据集扩展机制。小结围绕 resnet_coco_wholebody_hand.md 这一模型库条目本文完整还原了 ResNet-50 SimpleBaseline 在 COCO-WholeBody-Hand 上的技术全貌从 21 点手部标注与左右手数据加载到 210 轮训练中优化器、学习率调度、数据增强与 flip test 的每个细节再到 MSRAHeatmap 编解码、PCK/AUC/EPE 指标的源码实现最终给出可复现的训练、测试与推理命令。这套配置不仅是手部关键点任务的官方基线也是理解 MMPose Top-Down 热图框架如何组织数据、编码目标、训练与评估的典型范本。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考