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)检测框评测
| 架构 | 输入尺寸 | Head | Shou | Elb | Wri | Hip | Knee | Ankl | Total |
|---|---|---|---|---|---|---|---|---|---|
| HRNet-W32 | 256x192 | 86.2 | 89.0 | 84.5 | 79.2 | 82.3 | 82.5 | 78.7 | 83.4 |
| HRNet-W32 | 384x288 | 87.1 | 89.0 | 85.1 | 80.2 | 80.6 | 82.8 | 79.6 | 83.7 |
| HRNet-W48 | 256x192 | 88.3 | 90.2 | 86.0 | 81.0 | 80.7 | 83.3 | 80.6 | 84.6 |
| HRNet-W48 | 384x288 | 87.8 | 90.0 | 86.2 | 81.3 | 81.0 | 83.4 | 80.9 | 84.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。
| 架构 | 输入尺寸 | Head | Shou | Elb | Wri | Hip | Knee | Ankl | Total |
|---|---|---|---|---|---|---|---|---|---|
| HRNet-W32 | 256x192 | 78.0 | 82.9 | 79.5 | 73.8 | 76.9 | 76.6 | 70.2 | 76.9 |
| HRNet-W32 | 384x288 | 79.9 | 83.6 | 80.4 | 74.5 | 74.8 | 76.1 | 70.5 | 77.3 |
| HRNet-W48 | 256x192 | 80.1 | 83.4 | 80.6 | 74.8 | 74.3 | 76.8 | 70.5 | 77.4 |
| HRNet-W48 | 384x288 | 80.2 | 83.8 | 80.9 | 75.2 | 74.7 | 76.7 | 71.7 | 77.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_weights、sigmas)集中在 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_file与filter_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_lr按base_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来自PoseTrack18Metric的default_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仿射裁剪到输入尺寸 →GenerateTarget用MSRAHeatmap编码生成热图标签。验证管线则去掉随机增广,保持确定性裁剪。
配置文件第 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_file与filter_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. 结果解读与配置选择建议
综合模型库数据与配置实现,可以得到以下可操作的结论:
- 网络宽度的收益 > 输入分辨率的收益:GT 框设置下,W32→W48 在 256x192 下 Total 从 83.4 提升到 84.6(+1.2),而 W32 提高分辨率只带来 +0.3;若追求精度优先选 W48-256x192 配置(精度与 W48-384x288 持平但推理更省)。
- 检测框是端到端场景的第一瓶颈:Cascade R-CNN 框下各模型 Total 仅 76.9~77.8,其中 Ankl 全部跌破 72。若部署时检测器可换更强的模型(仓库提供 cascade_rcnn_x101_64x4d_fpn_1class.py 等检测器配置可复用),整体 AP 会显著优于姿态网络本身的提升空间。
- 微调策略固定:所有配置均为 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),仅供参考