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-down | topdown_heatmap | HRNet / ResNet / CSPNeXt / ViPNAS 等骨干网络 + 高斯热图回归 |
| RTMPose | rtmpose | SimCC 坐标分类 + CSPNeXt 骨干,面向实时推理 |
| DWPose | dwpose | 基于 RTMPose 的两阶段知识蒸馏方案 |
数据准备:三大全身数据集
数据准备请遵循 docs/en/dataset_zoo/2d_wholebody_keypoint.md。官方建议将数据集根目录软链接到$MMPOSE/data;如果你的目录结构不同,需要相应修改配置文件中的路径。
MMPose 支持的全身姿态数据集包括COCO-WholeBody、Halpe与UBody三种,此外配置文件还涉及基于它们衍生或组合训练的变体(如 cocktail14 混合数据集)。
COCO-WholeBody(ECCV'2020)
COCO-WholeBody 在 COCO 2017 图像基础上扩充了全身标注,图像可直接从 COCO 官网下载 2017 Train/Val 集,标注文件(coco_wholebody_train_v1.0.json与coco_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 xtcocotoolsHalpe(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 类场景,每类下都有对应的annotations、videos与splits目录。数据准备包括三步:
- 从 OSX 项目主页下载视频与标注,解压到
$MMPOSE/data/UBody/; - 运行仓库提供的转换脚本,将视频转成图像并按 train/val 拆分:
python tools/dataset_converters/ubody_kpts_to_coco.py- 同样安装
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 AP | Whole AR | 配置 |
|---|---|---|---|---|
| HRNet-w48+Dark | 384x288 | 0.661 | 0.743 | hrnet_dark_coco-wholebody.md |
| HRNet-w32+Dark | 256x192 | 0.582 | 0.671 | hrnet_dark_coco-wholebody.md |
| HRNet-w48 | 256x192 | 0.579 | 0.681 | hrnet_coco-wholebody.md |
| CSPNeXt-m | 256x192 | 0.567 | 0.641 | cspnext_udp_coco-wholebody.md |
| HRNet-w32 | 256x192 | 0.549 | 0.646 | hrnet_ubody-coco-wholebody.md |
| ResNet-152 | 256x192 | 0.548 | 0.661 | resnet_coco-wholebody.md |
| HRNet-w32 | 256x192 | 0.536 | 0.636 | hrnet_coco-wholebody.md |
| ResNet-101 | 256x192 | 0.531 | 0.645 | resnet_coco-wholebody.md |
| S-ViPNAS-Res50+Dark | 256x192 | 0.528 | 0.632 | vipnas_dark_coco-wholebody.md |
| ResNet-50 | 256x192 | 0.521 | 0.633 | resnet_coco-wholebody.md |
| S-ViPNAS-Res50 | 256x192 | 0.495 | 0.607 | vipnas_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 AP | Whole AR | 详情 |
|---|---|---|---|---|
| RTMPose-m | 256x192 | 0.582 | 0.674 | rtmpose_coco-wholebody.md |
| RTMPose-l | 256x192 | 0.611 | 0.700 | rtmpose_coco-wholebody.md |
| RTMPose-l | 384x288 | 0.648 | 0.730 | rtmpose_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 AP | Whole AR | FLOPS(G) | ORT-Latency(ms, i7-11700) | TRT-FP16-Latency(ms, GTX 1660Ti) |
|---|---|---|---|---|---|---|
| DWPose-t | 256x192 | 48.5 | 58.4 | 0.5 | - | - |
| DWPose-s | 256x192 | 53.8 | 63.2 | 0.9 | - | - |
| DWPose-m | 256x192 | 60.6 | 69.5 | 2.22 | 13.50 | 4.00 |
| DWPose-l | 256x192 | 63.1 | 71.7 | 4.52 | 23.41 | 5.67 |
| DWPose-l | 384x288 | 66.5 | 74.3 | 10.07 | 44.58 | 7.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_lr(base_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_ratio;sigma控制高斯标签的宽度;normalize=False表示不对标签做归一化;use_dark=True时解码阶段会调用 DARK 精细化后处理(refine_simcc_dark)。
模型结构:TopdownPoseEstimator+ mmdet 作用域下的 CSPNeXt 骨干(arch='P5'、channel_attention=True)+RTMCCHead(out_channels=133,即全身 133 个关键点,final_layer_kernel_size=7,内含高斯注意力模块gau_cfg)+KLDiscretLoss(beta=10.,label_softmax=True)。
数据流水线:训练时依次执行LoadImage→GetBBoxCenterScale→RandomFlip→RandomHalfBody→RandomBBoxTransform(scale_factor=[0.6, 1.4],rotate_factor=80)→TopdownAffine→mmdet.YOLOXHSVRandomAug→Albumentation(Blur / MedianBlur / CoarseDropout)→GenerateTarget→PackPoseInputs。
评估配置: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=3、unbiased=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.jpgCPU 推理时追加--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.py与rtmdet_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 给出了两个提速建议:
- 对 Top-down 模型,可在配置中将
model.test_cfg.flip_test=False关闭翻转测试(例如 td-hm_hrnet-w48_dark-8xb32-210e_coco-wholebody-384x288.py 中的对应字段),以牺牲少量精度换取近一倍推理速度; - 换用更快的人体边界框检测器。
训练与蒸馏:从 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_cfg与student_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 8Step 4:再次转换权重。第二阶段的转换需要--two_dis标志,因为此时需要从蒸馏器中拼接出"教师骨干 + 学生 head"的完整结构:
python tools/misc/pth_transfer.py $dis_ckpt $new_pose_ckpt --two_disDWPoseDistiller 源码要点
蒸馏器的核心实现在 mmpose/models/distillers/dwpose_distiller.py:
teacher由teacher_cfg构建并冻结(requires_grad=False),student由student_cfg构建;distill_cfg中所有use_this=True的损失会被注册进distill_losses(nn.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),仅供参考