HRNet 全身姿态估计实战:MMPose 中 COCO-WholeBody 133 关键点模型库配置与源码解析
2026/9/17 6:17:51 网站建设 项目流程

HRNet 全身姿态估计实战:MMPose 中 COCO-WholeBody 133 关键点模型库配置与源码解析

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

本文以 hrnet_coco-wholebody.md 模型库文档为主体,系统讲解 MMPose 中 HRNet 在 COCO-WholeBody 数据集上的 4 套官方配置。文章完整继承原文档的精度基准表,并结合仓库源码(配置文件、MSRAHeatmapcodec、CocoWholeBodyDataset数据集、CocoWholeBodyMetric评估器)深入解析训练流程、数据流水线、损失与评估机制。读者读完将掌握:如何读懂一张 topdown heatmap 全身姿态配置文件、133 关键点如何编码为热图、评估指标如何分区计算,以及如何基于官方基准复现或扩展训练。

一、任务背景:COCO-WholeBody 与全身姿态估计

COCO-WholeBody(ECCV'2020,论文Whole-Body Human Pose Estimation in the Wild)在 COCO 人体关键点数据集基础上扩展了脚部、面部与手部关键点标注,使单人实例拥有133 个关键点。其组成在 coco_wholebody_dataset.py 的类文档中明确给出:

  • 0-16:17 个身体(body)关键点;
  • 17-22:6 个脚部(foot)关键点;
  • 23-90:68 个面部(face)关键点;
  • 91-132:42 个手部(hand)关键点(左右各 21 个)。

合计 133 个关键点,对应一个 133 通道的热图输出。数据集的完整关键点定义(名称、颜色、左右对称 swap 关系、骨架连接)记录在数据集元信息 configs/base/datasets/coco_wholebody.py 中,供数据加载、可视化与评估共享。本仓库中该数据集在 configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody 目录下提供了 HRNet、ResNet、VIPNAS、CSPNeXt 等主干网络的官方配置与基准。

二、模型库总览:HRNet 在 COCO-WholeBody v1.0 val 上的精度基准

原文档给出的结果在 COCO-WholeBody v1.0 val 集上评测,检测器为在 COCO val2017 上人体 AP 达56.4的检测模型(该检测结果文件在配置中通过bbox_file指定,见下文)。下表完整继承自原文档,4 个配置覆盖 HRNet-W32 / W48 两种骨干规模与 256×192 / 384×288 两种输入分辨率:

ArchInput SizeBody APBody ARFoot APFoot ARFace APFace ARHand APHand ARWhole APWhole ARckptlog
pose_hrnet_w32256x1920.6780.7550.5430.6610.6300.7080.4670.5660.5360.636模型权重训练日志
pose_hrnet_w32384x2880.7000.7720.5850.6910.7260.7830.5150.6030.5860.673模型权重训练日志
pose_hrnet_w48256x1920.7010.7760.6750.7870.6560.7430.5350.6390.5790.681模型权重训练日志
pose_hrnet_w48384x2880.7220.7910.6960.8010.7760.8340.5870.6780.6320.717模型权重训练日志

其中 "Whole AP / Whole AR" 指基于全部 133 个关键点联合评估的整体指标,而 Body、Foot、Face、Hand 为分区指标。模型权重与训练日志的下载地址记录在 model-index.yml 以及各配置对应的.yml元数据文件(如 hrnet_coco-wholebody.yml)中,读者可据此定位权重与日志资源。

从数据可以观察出规律:提高输入分辨率(256×192 → 384×288)与加大骨干网络宽度(W32 → W48)都能显著提升全身各分区精度,其中面部(Face)与脚部(Foot)这类精细关键点对分辨率尤为敏感。

三、配置文件逐段解读:以 W32 256×192 为例

HRNet 系列 4 个配置文件位于 configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody,命名遵循td-hm_hrnet-w{32,48}_8xb{batch}-210e_coco-wholebody-{size}.py的统一规则。下面以 td-hm_hrnet-w32_8xb64-210e_coco-wholebody-256x192.py 为主线完整解读,并随时对比 W48 384×288 配置的差异。

3.1 运行时与优化策略(runtime / optimizer / scheduler)

_base_ = ['../../../_base_/default_runtime.py'] # runtime train_cfg = dict(max_epochs=210, val_interval=10) # optimizer optim_wrapper = dict(optimizer=dict(type='Adam', lr=5e-4)) # learning policy param_scheduler = [ dict( type='LinearLR', begin=0, end=500, start_factor=0.001, by_epoch=False), # warm-up dict( type='MultiStepLR', begin=0, end=210, milestones=[170, 200], gamma=0.1, by_epoch=True) ] # automatically scaling LR based on the actual training batch size auto_scale_lr = dict(base_batch_size=512)
  • 训练轮数:共训练 210 epoch,每 10 个 epoch 在验证集上评估一次(val_interval=10);
  • 优化器:Adam,初始学习率 5e-4;注意 W32 配置 batch size 为 64(8 卡 × 64),W48 配置为 32,但两者都采用相同学习率;
  • 学习率调度:两段式——前 500 次迭代使用LinearLR线性预热(从 0.001 倍学习率起步),之后按 epoch 在milestones=[170, 200]处分别衰减 10 倍(gamma=0.1);
  • 自动学习率缩放auto_scale_lr = dict(base_batch_size=512)表示以 512 作为基准 batch size,当实际训练总 batch size 与之不同时,MMEngine 会按比例自动缩放学习率,保证复现时超参的一致性。

3.2 保存最优模型

default_hooks = dict( checkpoint=dict(save_best='coco-wholebody/AP', rule='greater'))

save_best指向评估器输出的coco-wholebody/AP指标(见 3.7 节评估器),即每次验证后,若全身整体 AP 提升则覆盖保存最佳权重,rule='greater'表示越大越好。

3.3 Codec 设置:MSRAHeatmap 热图编解码

# codec settings codec = dict( type='MSRAHeatmap', input_size=(192, 256), heatmap_size=(48, 64), sigma=2)

W48 384×288 配置则为input_size=(288, 384), heatmap_size=(72, 96), sigma=3。可见热图尺寸约为输入尺寸的 1/4,而 sigma(高斯核标准差)随分辨率从 2 增大到 3。

该 codec 的实现位于 mmpose/codecs/msra_heatmap.py。其核心机制:

  • encode(关键点 → 热图):将关键点坐标除以scale_factor(即input_size / heatmap_size)缩放到热图坐标系,再通过generate_gaussian_heatmaps生成 (K, H, W) 形状的高斯热图,同时输出每个关键点的keypoint_weights用于损失加权;该过程仅支持单实例编码(assert keypoints.shape[0] == 1),与 topdown 范式"每样本一个实例"一致;
  • decode(热图 → 关键点):先通过get_heatmap_maximum取热图最大响应位置得到粗略坐标,再经refine_keypoints利用响应值进行亚像素细化(若开启unbiased=True则走 DarkPose 的refine_keypoints_dark无偏解码),最后乘以scale_factor还原到输入图像坐标系,并返回每个关键点的置信度分数。

该 codec 还支持unbiased(DarkPose 无偏编码)与blur_kernel_size参数,仓库中同一目录下的 td-hm_hrnet-w32_dark-8xb64-210e_coco-wholebody-256x192.py 与 td-hm_hrnet-w48_dark-8xb32-210e_coco-wholebody-384x288.py 即是对应的 DarkPose 变体(对应文档 hrnet_dark_coco-wholebody.md)。

3.4 模型结构:TopdownPoseEstimator + HRNet + HeatmapHead

model = dict( type='TopdownPoseEstimator', data_preprocessor=dict( type='PoseDataPreprocessor', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], bgr_to_rgb=True), backbone=dict( type='HRNet', in_channels=3, extra=dict( stage1=dict( num_modules=1, num_branches=1, block='BOTTLENECK', num_blocks=(4, ), num_channels=(64, )), stage2=dict( num_modules=1, num_branches=2, block='BASIC', num_blocks=(4, 4), num_channels=(32, 64)), stage3=dict( num_modules=4, num_branches=3, block='BASIC', num_blocks=(4, 4, 4), num_channels=(32, 64, 128)), stage4=dict( num_modules=3, num_branches=4, block='BASIC', num_blocks=(4, 4, 4, 4), num_channels=(32, 64, 128, 256))), init_cfg=dict( type='Pretrained', checkpoint='.../hrnet_w32-36af842e.pth'), ), head=dict( type='HeatmapHead', in_channels=32, out_channels=133, deconv_out_channels=None, loss=dict(type='KeypointMSELoss', use_target_weight=True), decoder=codec), test_cfg=dict( flip_test=True, flip_mode='heatmap', shift_heatmap=True, ))

逐项说明:

  • TopdownPoseEstimator:MMPose 的 topdown 姿态估计器(实现于 mmpose/models/pose_estimators),其数据流为"裁剪实例 → 骨干提取特征 → 头部预测热图 → 解码坐标";
  • PoseDataPreprocessor:对输入图像做 ImageNet 风格标准化(mean/std 为 BGR 顺序的 ImageNet 统计值),bgr_to_rgb=True说明默认读取的图像通道顺序为 BGR;
  • HRNet 骨干:通过extra字段描述四阶段多分支高分辨率网络结构——stage1 为 1 分支 Bottleneck(64 通道),stage2 扩展为 2 分支(32/64 通道),stage3 为 3 分支(32/64/128),stage4 为 4 分支(32/64/128/256)。HRNet 的核心设计是全程保持高分辨率特征分支,并通过重复的多尺度融合(num_modules控制重复模块数)在不同分辨率分支间反复交换信息,这是它相比"编码器-解码器"结构在关键点定位精度上的优势所在。HRNet 的完整实现见 mmpose/models/backbones/hrnet.py;
  • W48 差异num_channels变为 stage2 (48, 96)、stage3 (48, 96, 192)、stage4 (48, 96, 192, 384),且in_channels=48,使用 HRNet-W48 预训练权重hrnet_w48-8ef0771d.pth
  • HeatmapHeadin_channels=32(取 HRNet 最高分辨率分支的通道数,W48 为 48),out_channels=133对应 133 个关键点各输出一张热图;deconv_out_channels=None表示不使用反卷积升维,直接由骨干的高分辨率特征预测热图;
  • 损失KeypointMSELossuse_target_weight=True表示用 codec 生成的关键点权重对每个关键点的 MSE 损失进行加权(可见与不可见关键点区别对待);
  • 测试配置flip_test=True开启水平翻转测试增强(原图与翻转图各自预测后融合),flip_mode='heatmap'表示在热图层面进行翻转融合,shift_heatmap=True则对翻转后热图做 1 像素偏移校正(弥补翻转采样导致的亚像素偏差)。

3.5 数据集与数据流水线

dataset_type = 'CocoWholeBodyDataset' data_mode = 'topdown' data_root = 'data/coco/' train_pipeline = [ dict(type='LoadImage'), dict(type='GetBBoxCenterScale'), dict(type='RandomFlip', direction='horizontal'), dict(type='RandomHalfBody'), dict(type='RandomBBoxTransform'), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='GenerateTarget', encoder=codec), dict(type='PackPoseInputs') ] val_pipeline = [ dict(type='LoadImage'), dict(type='GetBBoxCenterScale'), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='PackPoseInputs') ]
  • 数据集类CocoWholeBodyDataset实现于 mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py,其parse_data_info方法将标注中的keypointsfoot_kptsface_kptslefthand_kptsrighthand_kpts五段关键点拼接为 133 维(coco_wholebody_dataset.py),并将可见性统一映射为 0/1;
  • 训练流水线:加载图像 → 由 bbox 计算中心与尺度 → 水平随机翻转 → 随机半身采样(RandomHalfBody,强制包含上半身或下半身关键点,提升半身场景鲁棒性)→ 随机 bbox 扰动(缩放/平移/旋转)→ topdown 仿射变换到input_size→ 按 codec 生成热图标签 → 打包;
  • 验证流水线:不含任何随机增强,仅做仿射变换到固定尺寸;
  • 数据加载器:训练集使用coco_wholebody_train_v1.0.json、图片前缀train2017/,batch size 64(W48 为 32),shuffle 开启;验证集使用coco_wholebody_val_v1.0.json、图片前缀val2017/

3.6 验证检测框来源:bbox_file

val_dataloader = dict( ... dataset=dict( ... bbox_file='data/coco/person_detection_results/' 'COCO_val2017_detections_AP_H_56_person.json', pipeline=val_pipeline, ))

验证与测试阶段不直接使用标注中的 GT bbox,而是加载COCO_val2017_detections_AP_H_56_person.json这一检测结果文件(即文档标题所注"detector having human AP of 56.4 on COCO val2017"的检测器输出),从而在"检测+姿态"的完整链路上公平衡量姿态模型的性能。使用 GT bbox 与使用检测 bbox 的评测结果通常有明显差异,这是阅读精度表时必须注意的前提条件。

3.7 评估器:CocoWholeBodyMetric 分区评估

val_evaluator = dict( type='CocoWholeBodyMetric', ann_file=data_root + 'annotations/coco_wholebody_val_v1.0.json')

CocoWholeBodyMetric实现于 mmpose/evaluation/metrics/coco_wholebody_metric.py,它继承CocoMetric,将 133 个关键点按body_num=17, foot_num=6, face_num=68, left_hand_num=21, right_hand_num=21切分为五个分区,并使用COCOeval依次对keypoints_bodykeypoints_footkeypoints_facekeypoints_lefthandkeypoints_righthand以及全量keypoints_wholebody六组配置分别执行 OKS 评估(coco_wholebody_metric.py)。不同分区使用不同的sigmas(从数据集元信息sigmas字段读取,反映各关键点的归一化标准差),因此表格中的 Body / Foot / Face / Hand / Whole 指标是各自独立的评估结果,不可混为一谈。评估器还支持format_only模式,可在无 GT 标注时仅输出 COCO 格式的预测结果文件用于提交。

四、从源码看数据与标注的完整链路

综合上述源码可以梳理出 HRNet 全身姿态训练的数据链路:

  1. CocoWholeBodyDataset.parse_data_info把五段关键点拼接成 (1, 133, 3) 并裁剪 bbox 到图像边界,同时计算实例面积(coco_wholebody_dataset.py);
  2. 数据流水线将裁剪实例仿射到 256×192(或 384×288);
  3. MSRAHeatmap.encode把图像坐标除以 4 的缩放因子,以 sigma=2(或 3)在 48×64(或 72×96)热图上铺置高斯峰,输出 (133, H, W) 标签(msra_heatmap.py);
  4. HRNet 输出 32(或 48)通道高分辨率特征,HeatmapHead预测 133 通道热图,与标签计算加权 MSE 损失;
  5. 验证时CocoWholeBodyMetric把预测结果按五个分区拆分,用各自 sigmas 计算 AP/AR,并在save_best钩子中跟踪coco-wholebody/AP

五、训练与测试命令

仓库提供了标准训练/测试入口 tools/train.py 与 tools/test.py,以及分布式脚本 tools/dist_train.sh、tools/dist_test.sh。单机多卡训练命令形如:

# 8 卡训练 HRNet-W32 256x192 配置 bash tools/dist_train.sh \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_hrnet-w32_8xb64-210e_coco-wholebody-256x192.py \ 8

测试(验证)命令:

bash tools/dist_test.sh \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_hrnet-w32_8xb64-210e_coco-wholebody-256x192.py \ <checkpoint路径> 8

运行前提:按 docs/zh_cn/user_guides/prepare_datasets.md 将 COCO-WholeBody 数据放置于data/coco/目录(标注文件annotations/coco_wholebody_*_v1.0.jsontrain2017/val2017/图片),并将检测框文件COCO_val2017_detections_AP_H_56_person.json放到data/coco/person_detection_results/下,否则验证阶段会因缺少检测框文件而无法进行标准评测。数据集准备细节还可参考 docs/zh_cn/user_guides/train_and_test.md。

六、同目录配置对比与选型建议

在 configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody 目录下,MMPose 还提供了同一任务的其他骨干配置,便于横向对比与选型:

  • HRNet(本文主体):精度与速度的均衡选择,W32/W48 两个规模、两种分辨率共 4 个基准,另有 2 个 DarkPose 变体(见 hrnet_dark_coco-wholebody.md);
  • ResNet-50/101/152:经典"简单基线"结构(SimpleBaselines),td-hm_res50_8xb64-210e_coco-wholebody-256x192.py等 6 个配置(见 resnet_coco-wholebody.md);
  • VIPNAS:轻量骨干方案,含 DarkPose 变体(见 vipnas_coco-wholebody.md 与 vipnas_dark_coco-wholebody.md);
  • CSPNeXt(RTMPose 系列):新一代高精度高效配置(见 cspnext_udp_coco-wholebody.md)。

选型时可遵循的规律(依据上述基准表):追求全身整体精度选 HRNet-W48 384×288;对脚/脸等小目标精细关键点要求高时优先提高输入分辨率;资源受限场景可考虑 VIPNAS 或 CSPNeXt 轻量配置。

七、总结

本文围绕 MMPose 的 HRNet × COCO-WholeBody 模型库,从任务定义(133 关键点五分区)、精度基准(4 个官方配置)、配置逐段解析(优化策略、codec、模型结构、流水线、评估器)到源码级数据链路与训练命令,完成了完整闭环。核心要点可归纳为:

  • COCO-WholeBody 的 133 关键点由身体(17)+ 脚(6)+ 脸(68)+ 手(42)组成,MMPose 通过CocoWholeBodyDataset一次性拼接加载;
  • 配置使用MSRAHeatmapcodec 将关键点编码为 1/4 分辨率的高斯热图,解码时带亚像素细化与可选翻转测试增强;
  • 评估采用CocoWholeBodyMetric对五个分区分别计算 AP/AR,模型库表格中的每列指标对应独立的 OKS 评估流程;
  • 复现基准时需同时准备训练/验证标注、对应图片与人体检测框文件,并可通过dist_train.sh/dist_test.sh一键训练与评测。

读者可基于上述任一配置文件,替换主干网络、调整输入分辨率或修改 codec 参数(如启用 DarkPose 无偏编解码),在同一数据与评估协议下开展自己的算法实验。

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询