MMPose 中 HRNet 在 PoseTrack18 上的 Top-Down 热图人体姿态估计:配置、训练策略与评测全流程解析
2026/9/16 15:48:03 网站建设 项目流程

MMPose 中 HRNet 在 PoseTrack18 上的 Top-Down 热图人体姿态估计:配置、训练策略与评测全流程解析

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

本文以 MMPose 模型库文档 hrnet_posetrack18.md 为主体,完整梳理 HRNet 系列模型在 PoseTrack2018 验证集上的两套评测结果(GT 检测框与 Cascade R-CNN 检测器),并逐段解读对应训练配置文件(w32 配置、w48 配置),深入讲解 PoseTrack18 的 17 关键点定义、热图解码器、学习率策略、检测框过滤与 poseval 评测指标的底层实现,帮助读者完整复现并理解该任务的训练与评测流程。

1. 模型库结果总览:两套评测设置下的 AP 指标

hrnet_posetrack18.md 给出的核心信息是 PoseTrack2018 验证集上的两组 AP 结果。PoseTrack18 是视频姿态估计基准,其关键特点是人物通常较小、被遮挡且密集,因此模型输入与网络容量对精度影响显著;文档同时报告了 HRNet-W32 与 HRNet-W48 两种宽度、两种输入分辨率共 4 个模型的结果。

1.1 使用 GT(ground-truth)检测框评测

架构输入尺寸HeadShouElbWriHipKneeAnklTotal
HRNet-W32256x19286.289.084.579.282.382.578.783.4
HRNet-W32384x28887.189.085.180.280.682.879.683.7
HRNet-W48256x19288.390.286.081.080.783.380.684.6
HRNet-W48384x28887.890.086.281.381.083.480.984.6

1.2 使用 Cascade R-CNN (X-101-64x4d-FPN) 人体检测器评测

模型库文档明确说明:第二组结果使用 MMDetection 预训练的 Cascade R-CNN(X-101-64x4d-FPN)人体检测器提供的检测框进行评测。该检测器配置在仓库中同样有对应文件,可参考 cascade_rcnn_x101_64x4d_fpn_1class.py。

架构输入尺寸HeadShouElbWriHipKneeAnklTotal
HRNet-W32256x19278.082.979.573.876.976.670.276.9
HRNet-W32384x28879.983.680.474.574.876.170.577.3
HRNet-W48256x19280.183.480.674.874.376.870.577.4
HRNet-W48384x28880.283.880.975.274.776.771.777.8

两组结果相差约 6~7 个 Total AP 点,直观体现了上游人体检测框质量对 Top-Down 两阶段流水线的制约:检测框质量提升时,小目标/密集场景下姿态精度的衰减被放大(Ankl 降幅最大)。这与 PoseTrack 场景中目标尺寸偏小的特性一致。

文档同时说明:所有模型先在 COCO 数据集上预训练,再在 PoseTrack18 上微调。这一流程在配置文件中通过load_from字段落实(见下文第 4 节)。

2. PoseTrack18 数据集:17 关键点定义与元信息

PoseTrack18 相对 COCO 的 17 个关键点定义更为特殊:头部被拆分为多个关键点。从数据集类 PoseTrack18Dataset 的源码可以看到,它直接继承BaseCocoStyleDataset,关键点顺序为:

0: nose 1: head_bottom 2: head_top 3: left_ear 4: right_ear 5: left_shoulder 6: right_shoulder 7: left_elbow 8: right_elbow 9: left_wrist 10: right_wrist 11: left_hip 12: right_hip 13: left_knee 14: right_knee 15: left_ankle 16: right_ankle

其元信息(关键点对、颜色、骨架连接、joint_weightssigmas)集中在 posetrack18.py 中:

  • joint_weights:左右肘权重为 1.2、左右腕为 1.5,高于躯干与腿部关键点的 1.0 或 1.2,用于评测时按权重汇总 AP;
  • sigmas:每个关键点独立的 OKS 尺度标准差(例如 nose 为 0.026、hip 为 0.107),是 OKS 相似度计算的核心参数;
  • 头部关键点(nose/head_bottom/head_top)与左右耳均标记type='upper',左右关键点成对声明swap关系,用于水平翻转增广时自动交换。

PoseTrack18Dataset还支持bbox_filefilter_cfg参数:当设置了检测框文件时,评测阶段会改用检测框而非 GT 框,这正是第 1.2 节结果的来源(源码见 posetrack18_dataset.py#L34-L45)。对应测试用例位于 test_posetrack18_dataset.py 与 test_posetrack18_video_dataset.py。

3. 配置文件逐段解读:以 HRNet-W32 (256x192) 为主线

以下解析基于 td-hm_hrnet-w32_8xb64-20e_posetrack18-256x192.py,其余三个配置(w32-384x288、w48-256x192、w48-384x288)结构一致,仅网络宽度与输入分辨率不同。

3.1 热图解码器 codec

codec = dict( type='MSRAHeatmap', input_size=(192, 256), heatmap_size=(48, 64), sigma=2)
  • MSRAHeatmap是 SimpleBaseline 风格的仿射高斯热图编解码器,输入裁剪图 (高 x 宽) 为 192×256,对应热图 (48×64),即 4 倍下采样;
  • sigma控制高斯峰宽度:256x192 输入用sigma=2,384x288 输入(热图 72×96)用sigma=3(见 w48-384x288 配置 L38-L39),分辨率越高高斯越宽,与像素密度匹配。

3.2 模型主体: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)))), head=dict( type='HeatmapHead', in_channels=32, out_channels=17, 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))

各要点说明:

  • HRNet 四阶段多分辨率结构:stage2 起保留 2/4/8/16 倍下采样共 4 个分支,分支间通过交叉交换融合,全程维持高分辨率特征。W32 与 W48 的差异仅在通道数——W48 各阶段通道为(48, 96, 192, 384)(见 w48 配置 L64-L77),而 W32 为(32, 64, 128, 256)
  • out_channels=17直接对应 PoseTrack18 的 17 个关键点;W32 的头部输入通道in_channels=32即 HRNet 最高分辨率分支的通道数,W48 对应为 48;
  • KeypointMSELoss(use_target_weight=True):按关键点所在像素的高斯幅值加权 MSE 损失,使峰值区域权重更高;
  • flip_test=True, flip_mode='heatmap', shift_heatmap=True:测试时做左右翻转推理并对热图取平均(flip 后热图镜像叠加),shift_heatmap=True在解码时采用 1/4 像素的局部极大值细化,这两项是 Top-Down 热图模型的标准测试增强;
  • norm_cfg = dict(type='SyncBN', requires_grad=True):使用同步 BatchNorm,配合多卡训练;基础运行时配置 default_runtime.py 中的SyncBuffersHook会在每个 epoch 结束同步各卡 BN 的 running 统计量,保证训练期与测试期 BN 行为一致。

3.3 训练策略:优化器、学习率与自动缩放

train_cfg = dict(max_epochs=20, val_interval=1) optim_wrapper = dict(optimizer=dict(type='Adam', lr=5e-4)) param_scheduler = [ dict(type='LinearLR', begin=0, end=500, start_factor=0.001, by_epoch=False), # warm-up dict(type='MultiStepLR', begin=0, end=20, milestones=[10, 15], gamma=0.1, by_epoch=True) ] auto_scale_lr = dict(base_batch_size=512)
  • 微调共 20 个 epoch,Adam 初始学习率 5e-4(远低于从头训练的 1e-3 量级,符合微调惯例);
  • 前 500 个 iteration 线性 warmup(从 0.001×lr 升至 lr);之后在第 10、15 个 epoch 将学习率各乘以 0.1;
  • auto_scale_lrbase_batch_size=512线性缩放学习率:默认配置每卡batch_size=64,8 卡时总 batch 恰为 512,学习率不变;换用 4 卡则 lr 自动减半,便于不同硬件规模复现。

最佳模型保存策略也值得注意:

default_hooks = dict( checkpoint=dict(save_best='posetrack18/Total AP', rule='greater', interval=1))

以验证集posetrack18/Total AP为准则按 epoch 保存最优权重,其中指标前缀posetrack18来自PoseTrack18Metricdefault_prefix(见第 5 节)。

3.4 数据管线与预训练权重加载

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') ]

这是 Top-Down 热图训练的标准增强链:GetBBoxCenterScale由检测框计算中心与尺度 →RandomFlip水平翻转 →RandomHalfBody随机保留半身框(对遮挡/截断场景尤为重要)→RandomBBoxTransform随机缩放平移 →TopdownAffine仿射裁剪到输入尺寸 →GenerateTargetMSRAHeatmap编码生成热图标签。验证管线则去掉随机增广,保持确定性裁剪。

配置文件第 35 行通过load_from指定 COCO 预训练权重(如 W32-256x192 加载td-hm_hrnet-w32_8xb64-210e_coco-256x192权重),即文档中“先在 COCO 预训练再在 PoseTrack18 微调”的具体落地。注意load_from与断点续训的resume不同:前者只加载权重用于迁移微调,后者恢复完整训练状态,定义见 default_runtime.py#L45-L46。

数据加载器配置:

val_dataloader = dict( batch_size=32, ..., dataset=dict( type=dataset_type, data_root=data_root, # 'data/posetrack18/' data_mode=data_mode, # 'topdown' ann_file='annotations/posetrack18_val.json', # comment `bbox_file` and '`filter_cfg` if use gt bbox for evaluation bbox_file='data/posetrack18/annotations/' 'posetrack18_val_human_detections.json', filter_cfg=dict(bbox_score_thr=0.4), ...))

这里同时给出两种评测模式的切换方法:注释掉bbox_filefilter_cfg即回到 GT 检测框评测(对应 1.1 节结果);保留二者则使用检测器输出,且bbox_score_thr=0.4会丢弃置信度低于 0.4 的检测框(对应 1.2 节结果)。训练集使用annotations/posetrack18_train.json

4. 训练与评测命令

在 MMPose 仓库根目录下(已安装依赖并准备data/posetrack18/数据集),多卡训练与评测的标准命令为:

# 多机多卡训练(单机 8 卡) python -m torch.distributed.launch --nnodes=1 --nproc_per_node=8 \ --master_port=29500 tools/train.py \ configs/body_2d_keypoint/topdown_heatmap/posetrack18/td-hm_hrnet-w32_8xb64-20e_posetrack18-256x192.py # 评测(--work-dir 与训练时一致;AP 评测需安装 poseval,见 requirements/optional.txt) python -m torch.distributed.launch --nnodes=1 --nproc_per_node=8 \ --master_port=29500 tools/test.py \ configs/body_2d_keypoint/topdown_heatmap/posetrack18/td-hm_hrnet-w32_8xb64-20e_posetrack18-256x192.py \ work_dirs/.../latest.pth --evaluate AP

单机单卡可将 launch 命令替换为python tools/train.py <config>。训练入口与测试入口分别为 tools/train.py 与 tools/test.py。

5. 评测指标底层实现:PoseTrack18Metric

配置中声明的评测器:

val_evaluator = dict( type='PoseTrack18Metric', ann_file=data_root + 'annotations/posetrack18_val.json')

其实现位于 posetrack18_metric.py,核心事实如下:

  • 依赖 poseval:类构造时检测poseval包是否可用,缺失则直接抛出 ImportError(要求安装见 requirements/optional.txt),避免评测长时间空跑;
  • 按视频序列分文件导出results2json会遍历 GT 目录下每个视频序列的 json 文件,将预测结果按序列逐一写出,再交给 poseval 的eval_helpers.load_data_dir+evaluateAP做逐帧多人 AP 计算(_do_python_keypoint_eval);
  • 评测口径:输出Head AP / Shou AP / Elb AP / Wri AP / Hip AP / Knee AP / Ankl AP / AP8 项统计量,与模型库表格中 7 个部位列加 Total 列完全对应;
  • 默认参数score_mode='bbox_keypoint'(关键点分数回填检测框分数,keypoint_score_thr=0.2)、nms_mode='oks_nms'nms_thr=0.9,即按 OKS 相似度做非极大值抑制。这些默认值在 posetrack18_metric.py#L74-L83 中定义;
  • 指标前缀default_prefix = 'posetrack18',所以日志与最佳权重选择中的指标名为posetrack18/Total AP,与第 3.3 节 checkpoint hook 的配置呼应。

6. 结果解读与配置选择建议

综合模型库数据与配置实现,可以得到以下可操作的结论:

  1. 网络宽度的收益 > 输入分辨率的收益:GT 框设置下,W32→W48 在 256x192 下 Total 从 83.4 提升到 84.6(+1.2),而 W32 提高分辨率只带来 +0.3;若追求精度优先选 W48-256x192 配置(精度与 W48-384x288 持平但推理更省)。
  2. 检测框是端到端场景的第一瓶颈:Cascade R-CNN 框下各模型 Total 仅 76.9~77.8,其中 Ankl 全部跌破 72。若部署时检测器可换更强的模型(仓库提供 cascade_rcnn_x101_64x4d_fpn_1class.py 等检测器配置可复用),整体 AP 会显著优于姿态网络本身的提升空间。
  3. 微调策略固定:所有配置均为 COCO 预训练 + 20 epoch 微调 + Adam 5e-4 + [10,15] 里程碑衰减,复现或迁移到类似视频基准(如 Posetrack 其他年份)时可沿用这套训练策略模板。

7. 相关文件索引

内容路径
模型库文档(本文主体)hrnet_posetrack18.md
W32 训练配置(256x192 / 384x288)256x192 / 384x288
W48 训练配置(256x192 / 384x288)256x192 / 384x288
模型元数据(结果 YAML)hrnet_posetrack18.yml
数据集类posetrack18_dataset.py
数据集元信息(关键点/sigmas/joint_weights)posetrack18.py
评测指标posetrack18_metric.py
默认运行时(hooks/SyncBuffers)default_runtime.py
训练/测试入口train.py / test.py
数据集测试test_posetrack18_dataset.py

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

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

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

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

立即咨询