MMPose 2D 人体全身姿态估计(Whole-Body)全指南:数据集、模型配置与实战推理
2026/9/17 16:29:12 网站建设 项目流程

MMPose 2D 人体全身姿态估计(Whole-Body)全指南:数据集、模型配置与实战推理

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

2D 人体全身姿态估计(Whole-Body Pose Estimation)的目标是在一张图像中同时定位人体的身体、面部、手部和脚部等全部稠密关键点,是理解人体姿态与交互行为的基础技术。本指南以 configs/wholebody_2d_keypoint/README.md 为核心骨架,结合仓库内的数据准备文档、完整模型配置与源码实现,系统讲解 MMPose 中全身姿态估计的任务定义、主流方法(Top-down / Bottom-up)、支持的数据集与模型、训练配置要点以及可直接运行的推理 Demo。读完本文,你将掌握如何在 MMPose 中准备 COCO-WholeBody / Halpe / UBody 数据、选择并配置合适的全身姿态模型,以及通过多种方式完成单图、视频与流式输入的人体全身关键点检测。

任务定义:什么是 2D 人体全身姿态估计

2D 人体全身姿态估计旨在定位整个人体上的稠密关键点,包括身体(body)、面部(face)、手部(hands)与脚部(feet)。与仅关注 17 个身体关节点的常规人体姿态估计不同,全身姿态估计需要同时处理不同尺度、不同精细度的多个身体部件,例如面部表情关键点与手指关节关键点通常位于低分辨率区域,对模型的细粒度定位能力提出了更高要求。

以仓库中实际使用的 COCO-WholeBody 数据集为例,其关键点共133 个,编号分布如下(见 mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py 的注释说明):

  • 0-16:17 个身体关键点
  • 17-22:6 个脚部关键点
  • 23-90:68 个面部关键点
  • 91-132:42 个手部关键点

Top-down 与 Bottom-up 两大类方法

现有方法可归为两类:

  • Top-down 方法:将任务拆分为"人体检测 + 单人体姿态估计"两个阶段。先用检测器得到每个人的边界框,再对每个框执行单人全身姿态估计。其精度通常更高,但推理速度受检测器影响。
  • Bottom-up 方法(如 Associative Embedding, AE):先在整张图像上检测出所有全身关键点,再通过分组/关联算法将关键点聚合到各个人体实例上。其速度快,但在拥挤场景下分组难度较大。

在 MMPose 仓库中,configs/wholebody_2d_keypoint/目录下目前主要提供的是 Top-down 体系的方法,共分为三大系列,各自目录下都带有独立的 README:

系列目录技术特点
热力图 Top-downtopdown_heatmapHRNet / ResNet / CSPNeXt / ViPNAS 等骨干网络 + 高斯热图回归
RTMPosertmposeSimCC 坐标分类 + CSPNeXt 骨干,面向实时推理
DWPosedwpose基于 RTMPose 的两阶段知识蒸馏方案

数据准备:三大全身数据集

数据准备请遵循 docs/en/dataset_zoo/2d_wholebody_keypoint.md。官方建议将数据集根目录软链接到$MMPOSE/data;如果你的目录结构不同,需要相应修改配置文件中的路径。

MMPose 支持的全身姿态数据集包括COCO-WholeBodyHalpeUBody三种,此外配置文件还涉及基于它们衍生或组合训练的变体(如 cocktail14 混合数据集)。

COCO-WholeBody(ECCV'2020)

COCO-WholeBody 在 COCO 2017 图像基础上扩充了全身标注,图像可直接从 COCO 官网下载 2017 Train/Val 集,标注文件(coco_wholebody_train_v1.0.jsoncoco_wholebody_val_v1.0.json)需按官方指引单独下载。建议的数据目录结构如下:

mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── coco │-- annotations │ │-- coco_wholebody_train_v1.0.json │ |-- coco_wholebody_val_v1.0.json |-- person_detection_results | |-- COCO_val2017_detections_AP_H_56_person.json │-- train2017 │ │-- 000000000009.jpg │ │-- ... `-- val2017 │-- 000000000139.jpg │-- ...

注意person_detection_results目录下的检测结果文件(COCO val2017 人体检测框)是评估阶段必需的:Top-down 模型在验证时使用这些预检测的人体框,而不是真实框。评估 COCO-WholeBody 还需要安装扩展版 COCO API(版本不低于 1.5):

pip install xtcocotools

Halpe(CVPR'2020)

Halpe(PaStaNet 项目配套数据集)训练集图像来自 HICO-Det,验证集图像来自 COCO val2017。将下载的图像、标注与检测结果按如下结构放置:

mmpose ├── ... `── data │── halpe │-- annotations │ │-- halpe_train_v1.json │ |-- halpe_val_v1.json |-- person_detection_results | |-- COCO_val2017_detections_AP_H_56_person.json │-- hico_20160224_det │ │-- anno_bbox.mat │ │-- anno.mat │ │-- README │ │-- images │ │ │-- train2015 │ │ │ │-- HICO_train2015_00000001.jpg │ │ │ │-- ... │ │ │-- test2015 │ │-- tools `-- val2017 │-- 000000000139.jpg │-- ...

Halpe 评估同样需要pip install xtcocotools

UBody(CVPR'2023)

UBody 是一个面向真实生活场景的全身视频数据集,包含 ConductMusic、Fitness、Interview、Movie、Olympic、Online_class、SignLanguage、Singing、Speech、TVShow、VideoConference 等 15 类场景,每类下都有对应的annotationsvideossplits目录。数据准备包括三步:

  1. 从 OSX 项目主页下载视频与标注,解压到$MMPOSE/data/UBody/
  2. 运行仓库提供的转换脚本,将视频转成图像并按 train/val 拆分:
python tools/dataset_converters/ubody_kpts_to_coco.py
  1. 同样安装xtcocotools以支持 COCO-WholeBody 格式的评估。

由于 UBody 覆盖了丰富的手势与面部表情,它成为 DWPose 蒸馏训练与 RTMPose UBody 系列模型的关键数据来源。

模型库与精度一览

Top-down 热力图系列(COCO-WholeBody / UBody2D)

热力图系列遵循 Simple Baselines 范式:不直接回归关键点坐标,而是让网络输出表征"该位置是关键点"可能性大小的热图。其结果表位于 configs/wholebody_2d_keypoint/topdown_heatmap/README.md,评估条件为:COCO-WholeBody v1.0 val,检测器在 COCO val2017 上的人体 AP 为 56.4。

模型输入尺寸Whole APWhole AR配置
HRNet-w48+Dark384x2880.6610.743hrnet_dark_coco-wholebody.md
HRNet-w32+Dark256x1920.5820.671hrnet_dark_coco-wholebody.md
HRNet-w48256x1920.5790.681hrnet_coco-wholebody.md
CSPNeXt-m256x1920.5670.641cspnext_udp_coco-wholebody.md
HRNet-w32256x1920.5490.646hrnet_ubody-coco-wholebody.md
ResNet-152256x1920.5480.661resnet_coco-wholebody.md
HRNet-w32256x1920.5360.636hrnet_coco-wholebody.md
ResNet-101256x1920.5310.645resnet_coco-wholebody.md
S-ViPNAS-Res50+Dark256x1920.5280.632vipnas_dark_coco-wholebody.md
ResNet-50256x1920.5210.633resnet_coco-wholebody.md
S-ViPNAS-Res50256x1920.4950.607vipnas_coco-wholebody.md

在 UBody2D 数据集(val 集,使用 GT 关键点评估)上,HRNet-w32(256x192)取得Whole AP 0.690 / Whole AR 0.729,对应配置为 td-hm_hrnet-w32_8xb64-210e_ubody-256x192.py。

RTMPose 系列(COCO-WholeBody)

RTMPose 是 MMPose 团队提出的高性能实时多人姿态估计框架。官方 README 中给出的 COCO-WholeBody 结果(同样基于人体 AP 56.4 的检测器)如下:

模型输入尺寸Whole APWhole AR详情
RTMPose-m256x1920.5820.674rtmpose_coco-wholebody.md
RTMPose-l256x1920.6110.700rtmpose_coco-wholebody.md
RTMPose-l384x2880.6480.730rtmpose_coco-wholebody.md

更细粒度的部件级指标(Body / Foot / Face / Hand AP)记录在 configs/wholebody_2d_keypoint/rtmpose/coco-wholebody/rtmpose_coco-wholebody.md 中。例如 384x288 输入的 RTMPose-l,其 Whole AP 0.648 分解为:Body AP 0.712、Foot AP 0.693、Face AP 0.882、Hand AP 0.579,可见手部关键点是最难的子任务。

RTMW:Cocktail14 混合训练系列

cocktail14表示模型在14 个公开数据集上混合训练,包括 AI Challenger、CrowdPose、MPII、sub-JHMDB、Halpe、PoseTrack18、COCO-WholeBody、UBody、Human-Art、WFLW、300W、COFW、LaPa、InterHand(详见 rtmw_cocktail14.md)。RTMW 使用RTMWHead(支持可见性解码)与跨尺度的高斯注意力,384x288 输入下 RTMW-x 达到Whole AP 0.702 / Whole AR 0.781,其中 Face AP 0.884、Hand AP 0.664。

DWPose:两阶段蒸馏系列

DWPose README 提出了Distillation forWhole-bodyPose 两阶段蒸馏方案:

  • 第一阶段:设计权重衰减策略,利用教师模型的中间层特征与最终 logits(同时包含可见与不可见关键点)从零监督学生模型;
  • 第二阶段:对学生模型自身进行自蒸馏,仅需约 20% 的训练时间对 head 进行微调,是一种即插即用的训练策略。

DWPose 在 COCO-WholeBody 上把 RTMPose-l 的 whole-body AP 从 64.8% 提升到 66.5%,甚至超过了 65.3% AP 的 RTMPose-x 教师模型。各尺寸模型结果如下:

模型输入尺寸Whole APWhole ARFLOPS(G)ORT-Latency(ms, i7-11700)TRT-FP16-Latency(ms, GTX 1660Ti)
DWPose-t256x19248.558.40.5--
DWPose-s256x19253.863.20.9--
DWPose-m256x19260.669.52.2213.504.00
DWPose-l256x19263.171.74.5223.415.67
DWPose-l384x28866.574.310.0744.587.68

从表中可以直观看到模型尺寸、精度与延迟之间的权衡,DWPose-m 在 4ms 量级的 TRT-FP16 延迟下即可达到 60% 以上的 Whole AP。

读懂全身姿态模型配置文件

RTMPose 配置拆解

以 rtmpose-l_8xb32-270e_coco-wholebody-384x288.py 为例,一个完整的 RTMPose 全身姿态配置由以下几部分组成:

训练策略max_epochs=270,其中最后 30 个 epoch 通过PipelineSwitchHook切换到 stage2 数据增强(旋转幅度从 80° 收窄到 60°、尺度扰动收窄到 [0.75, 1.25]、CoarseDropout 概率降为 0.5),配合 EMA 权重平均(ExpMomentumEMA,momentum=0.0002)与auto_scale_lrbase_batch_size=512)实现学习率的自动缩放。

SimCC 编解码器(codec):RTMPose 不使用传统热图,而使用坐标分类范式:

codec = dict( type='SimCCLabel', input_size=(288, 384), sigma=(6., 6.93), simcc_split_ratio=2.0, normalize=False, use_dark=False)

其底层实现见 mmpose/codecs/simcc_label.py:simcc_split_ratio决定标签分辨率,例如输入宽w时 x 轴标签长度为w * simcc_split_ratiosigma控制高斯标签的宽度;normalize=False表示不对标签做归一化;use_dark=True时解码阶段会调用 DARK 精细化后处理(refine_simcc_dark)。

模型结构TopdownPoseEstimator+ mmdet 作用域下的 CSPNeXt 骨干(arch='P5'channel_attention=True)+RTMCCHeadout_channels=133,即全身 133 个关键点,final_layer_kernel_size=7,内含高斯注意力模块gau_cfg)+KLDiscretLossbeta=10.label_softmax=True)。

数据流水线:训练时依次执行LoadImageGetBBoxCenterScaleRandomFlipRandomHalfBodyRandomBBoxTransform(scale_factor=[0.6, 1.4],rotate_factor=80)→TopdownAffinemmdet.YOLOXHSVRandomAugAlbumentation(Blur / MedianBlur / CoarseDropout)→GenerateTargetPackPoseInputs

评估配置val_dataloader中通过bbox_file='data/coco/person_detection_results/COCO_val2017_detections_AP_H_56_person.json'指定检测框文件,val_evaluator使用CocoWholeBodyMetric,checkpoint 以coco-wholebody/AP为保存依据。

热力图系列配置对比

热力图系列使用MSRAHeatmapcodec。以 td-hm_hrnet-w48_dark-8xb32-210e_coco-wholebody-384x288.py 为例:输入 384x288、热图 96x72(heatmap_size=(72, 96))、sigma=3unbiased=True(即 DARK 中的无偏编码);优化器为 Adam(lr=5e-4),采用 500 iter 线性 warm-up + MultiStepLR(milestones=[170, 200]);骨干为 HRNet(w48,多分支并联高分辨率表示)。UBody2D 上的 td-hm_hrnet-w32_8xb64-210e_ubody-256x192.py 结构与之相同,只是输入降为 256x192、热图 64x48、sigma=2

实战 Demo:三种推理方式

Demo 完整说明见 demo/docs/en/2d_wholebody_pose_demo.md。

方式一:整图作为边界框输入

python demo/image_demo.py \ ${IMG_FILE} ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --out-file ${OUTPUT_FILE} \ [--device ${GPU_ID or CPU}] \ [--draw_heatmap]

以 ViPNAS-Res50+Dark 模型为例:

python demo/image_demo.py \ tests/data/coco/000000000785.jpg \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_vipnas-res50_dark-8xb64-210e_coco-wholebody-256x192.py \ https://download.openmmlab.com/mmpose/top_down/vipnas/vipnas_res50_wholebody_256x192_dark-67c0ce35_20211112.pth \ --out-file vis_results.jpg

CPU 推理时追加--device=cpu即可。

方式二:mmdet 人体检测 + mmpose 姿态估计

这是最常用的 Top-down 完整流程,需要先安装 mmdet(版本 >= 3.0):

python demo/topdown_demo_with_mmdet.py \ ${MMDET_CONFIG_FILE} ${MMDET_CHECKPOINT_FILE} \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --input ${INPUT_PATH} \ [--output-root ${OUTPUT_DIR}] [--save-predictions] \ [--show] [--draw-heatmap] [--device ${GPU_ID or CPU}] \ [--bbox-thr ${BBOX_SCORE_THR}] [--kpt-thr ${KPT_SCORE_THR}]

示例命令(检测器用 RTMDet-m person 模型,姿态模型用 HRNet-w48+Dark):

python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_m_8xb32-100e_coco-obj365-person-235e8209.pth \ configs/wholebody_2d_keypoint/topdown_heatmap/coco-wholebody/td-hm_hrnet-w48_dark-8xb32-210e_coco-wholebody-384x288.py \ https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_wholebody_384x288_dark-f5726563_20200918.pth \ --input tests/data/coco/000000196141.jpg \ --output-root vis_results/ --show

该脚本同样支持以视频文件或 URL 作为--input,实现视频全身姿态估计。如需保存预测结果到磁盘,请指定--save-predictions。检测器的配置文件位于 demo/mmdetection_cfg/,其中rtmdet_m_640-8xb32_coco-person.pyrtmdet_nano_320-8xb32_coco-person.py专为人体检测定制。

方式三:Inferencer 统一推理接口

Inferencer 支持用模型别名替代配置+权重路径,并接受图像路径、视频路径、图像目录与摄像头等多种输入:

python demo/inferencer_demo.py tests/data/crowdpose \ --pose2d wholebody --vis-out-dir vis_results/crowdpose

该命令会推断tests/data/crowdpose目录下所有图像,并将可视化结果保存到vis_results/crowdpose

推理加速技巧

官方 README 给出了两个提速建议:

  1. 对 Top-down 模型,可在配置中将model.test_cfg.flip_test=False关闭翻转测试(例如 td-hm_hrnet-w48_dark-8xb32-210e_coco-wholebody-384x288.py 中的对应字段),以牺牲少量精度换取近一倍推理速度;
  2. 换用更快的人体边界框检测器。

训练与蒸馏:从 RTMPose 到 DWPose

常规训练

以 RTMPose-l(COCO-WholeBody, 384x288)为例,使用 8 卡分布式训练:

bash tools/dist_train.sh \ configs/wholebody_2d_keypoint/rtmpose/coco-wholebody/rtmpose-l_8xb32-270e_coco-wholebody-384x288.py 8

单卡训练与测试分别使用 tools/train.py 与 tools/test.py,集群环境可使用 tools/slurm_train.sh。

DWPose 两阶段蒸馏训练

DWPose 的训练流程分为四个步骤(见 configs/wholebody_2d_keypoint/dwpose/README.md):

Step 1:第一阶段蒸馏训练。rtmpose_x_dis_l_coco-ubody-384x288.py(教师为 RTMPose-x、学生为 RTMPose-l)为例:

bash tools/dist_train.sh configs/wholebody_2d_keypoint/dwpose/ubody/s1_dis/rtmpose_x_dis_l_coco-ubody-384x288.py 8

该配置的结构很能说明问题:它基于学生模型配置(_base_指向rtmpose-l_8xb32-270e_coco-ubody-wholebody-384x288.py),然后将model整体替换为DWPoseDistiller,其中teacher_pretrained指向教师权重、teacher_cfgstudent_cfg分别指向师生配置,distill_cfg定义了FeaLoss(特征蒸馏,alpha_fea=0.00007,将学生 1024 通道特征对齐到教师 1280 通道)与KDLoss(logits 蒸馏,weight=0.1)两类损失。

Step 2:权重转换。蒸馏模型不是标准姿态模型,需用 tools/misc/pth_transfer.py 转换:

python tools/misc/pth_transfer.py $dis_ckpt $new_pose_ckpt

脚本会剥离student.前缀,仅保留学生模型的 state_dict 并重新打包。

Step 3:第二阶段蒸馏。开始前需将 Step 2 得到的模型路径填入 S2 蒸馏配置的teacher_pretrained字段,然后:

bash tools/dist_train.sh configs/wholebody_2d_keypoint/dwpose/ubody/s2_dis/dwpose_l-ll_coco-ubody-384x288.py 8

Step 4:再次转换权重。第二阶段的转换需要--two_dis标志,因为此时需要从蒸馏器中拼接出"教师骨干 + 学生 head"的完整结构:

python tools/misc/pth_transfer.py $dis_ckpt $new_pose_ckpt --two_dis

DWPoseDistiller 源码要点

蒸馏器的核心实现在 mmpose/models/distillers/dwpose_distiller.py:

  • teacherteacher_cfg构建并冻结(requires_grad=False),studentstudent_cfg构建;
  • distill_cfg中所有use_this=True的损失会被注册进distill_lossesnn.ModuleDict);
  • init_weights()会先加载teacher_pretrained权重再初始化学生;
  • two_dis开关区分第一/第二阶段蒸馏,第二阶段会额外使用loss_mgd等自蒸馏损失。

这也解释了为何 README 中反复强调"转换"步骤:蒸馏器本身不是可直接部署的姿态估计模型,只有通过pth_transfer.py转换后才可用于常规推理与评估。

小结

MMPose 的configs/wholebody_2d_keypoint/目录为 2D 全身姿态估计提供了一条从数据、模型到部署的完整链路:

  • 数据层面:COCO-WholeBody / Halpe / UBody 三大数据集均有规范的准备流程与目录结构说明;
  • 模型层面:覆盖传统热图范式(HRNet、ResNet、CSPNeXt、ViPNAS)、实时坐标分类范式(RTMPose、RTMW/Cocktail14)以及蒸馏增强范式(DWPose),并附有部件级精度明细与部署延迟参考;
  • 工程层面:单图/视频/Inferencer 三种推理方式可直接运行,分布式训练与 DWPose 两阶段蒸馏的完整命令均可复现。

无论是追求极致精度的学术研究,还是追求低延迟的实时应用(如数字人、动作捕捉、人机交互),都可以在本目录中找到可落地的模型配置与训练方案。

参考文档与配置索引

  • 任务总览:configs/wholebody_2d_keypoint/README.md
  • 数据准备:docs/en/dataset_zoo/2d_wholebody_keypoint.md
  • Demo 指南:demo/docs/en/2d_wholebody_pose_demo.md
  • Top-down 热图系列:configs/wholebody_2d_keypoint/topdown_heatmap/README.md
  • RTMPose 系列:configs/wholebody_2d_keypoint/rtmpose/README.md
  • DWPose 系列:configs/wholebody_2d_keypoint/dwpose/README.md
  • SimCC 编解码器实现:mmpose/codecs/simcc_label.py
  • 数据集类实现:mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py
  • 蒸馏器实现:mmpose/models/distillers/dwpose_distiller.py
  • 权重转换工具:tools/misc/pth_transfer.py

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

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

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

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

立即咨询