MMPose 人体 2D 姿态估计完全指南:Top-down 与 Bottom-up 范式、算法族与实战运行
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
多人体 2D 姿态估计是计算机视觉的核心任务之一,其目标是从一张输入图像中同时检测出所有人的姿态(关键点集合),是行为识别、人机交互、运动分析、增强现实等众多上层应用的基础能力。本指南以 MMPose 仓库中 configs/body_2d_keypoint/README.md 为主线,系统梳理该任务的两大技术路线(Top-down 与 Bottom-up)、MMPose 中对应实现的全部算法族、COCO/MPII 等数据集准备流程,以及图片、视频与统一 Inferencer 三种推理方式,帮助你从原理到配置再到运行,完整掌握在 MMPose 中落地人体 2D 姿态估计的方法。
任务定义:什么是多人体 2D 姿态估计
按 MMPose 的定义,多人体姿态估计(Multi-person human pose estimation)被描述为:从输入图像中检测所有人体(及其关键点)姿态的任务。与单人姿态估计不同,多人体场景天然面临三个叠加的挑战:
- 人数未知:图像中可能出现任意数量、任意尺度、任意姿态的人;
- 实例分离:模型不仅要知道"哪里是关键点",还要回答"这些关键点属于哪一个人";
- 遮挡与拥挤:密集人群场景中,人体之间相互遮挡,关键点归属判定尤为困难。
围绕"如何同时解决检测与分组",学术界演化出两种截然不同的方法论:自顶向下(Top-down)与自底向上(Bottom-up)。MMPose 的 configs/body_2d_keypoint 目录正是围绕这两大范式组织全部算法与配置的。
两大技术路线:Top-down 与 Bottom-up
Top-down:先检测,再估计
Top-down 方法将任务拆分为两个阶段(以 DeepPose 为代表):
- 人体检测:先用目标检测器找出图像中所有人体,得到每个人的边界框(bounding box);
- 单人姿态估计:对每个边界框裁剪出的人体区域,运行单人姿态估计模型,预测该人的关键点坐标。
这种串行结构使模型可以"聚焦"到每个人身上,因此精度普遍较高,是目前公开基准(如 COCO)上 AP 排行榜的常客;但其代价是推理耗时随人数线性增长——检测出 N 个人就要跑 N 次单人姿态估计,在人多的场景(如演唱会、体育场)会明显变慢。MMPose 中属于 Top-down 范式的方法有:
- topdown_heatmap:热力图法(见下文"坐标解码方式");
- topdown_regression:直接回归关键点坐标;
- integral_regression:积分回归(IPR),将热力图与坐标回归可微地统一;
- simcc:把坐标估计建模为两个方向上的分类问题;
- rtmpose:基于 SimCC 的高性能实时姿态估计框架。
Bottom-up:先检测全部关键点,再分组归人
Bottom-up 方法(以 Associative Embedding 为代表)走的是相反路径:
- 全图关键点检测:一次性输出图像中所有候选关键点(包括被遮挡的人的可见关键点);
- 分组/关联:通过额外预测的"分组标签"将属于同一个人的关键点聚合成一个实例。
因为无需人体检测器、关键点检测只有一次前向,Bottom-up 的推理时间与人数的关系更平缓,在拥挤场景下往往更具实时优势;但分组环节的误差会直接传导到最终结果,精度上限通常低于 Top-down 范式。MMPose 中属于 Bottom-up 范式的有:
- associative_embedding:Associative Embedding(AE);
- dekr:解耦关键点回归;
- cid:上下文实例解耦(Contextual Instance Decoupling);
- rtmo:基于 YOLO 架构的一阶段实时模型;
- yoloxpose:基于 YOLOX 检测框架的统一检测与姿态模型。
MMPose 中的坐标解码方式与算法族深读
虽然范式只有两类,但"如何从网络输出得到关键点坐标"存在多种编码-解码方式,这直接决定模型结构与精度表现。MMPose 在每个子目录的 README 中给出了明确的技术定位,以下逐一解读。
热力图法(Top-down Heatmap)
topdown_heatmap 遵循 Simple Baselines 开创的范式:姿态估计器不直接回归坐标,而是为每个关键点输出一张似然热力图,图中峰值位置即对应关键点。MMPose 在此目录下提供了从 AlexNet、CPM、ShuffleNet 到 HRNet、MSPN、RSN、HRFormer、Swin、ViTPose、CSPNeXt 等二十余种骨干网络的完整实现,并覆盖 COCO、MPII、CrowdPose、AIC、JHMDB、PoseTrack2018、Human-Art 等多个数据集。例如在 COCO val2017(人体检测器 AP 56.4)上,hrnet_coco.md 记录了 HRNet-w32 256x192 输入下 AP 0.749 / AR 0.804 的结果,其对应配置为 td-hm_hrnet-w32_8xb64-210e_coco-256x192.py。
直接回归法(Top-down Regression)
topdown_regression 遵循 DeepPose 的思路,由骨干网络直接回归关键点坐标。这类方法结构简单、便于部署,但传统上精度弱于热力图法。MMPose 特别实现了RLE(Residual Log-likelihood Estimation)变体——通过建模关键点标注的不确定性显著提升回归精度:COCO val2017 上 ResNet-50+RLE 达到 AP 0.706,而同一骨干的纯回归只有 AP 0.528(见 resnet_rle_coco.md)。
积分回归法(Integral Regression)
integral_regression 采用 Integral Human Pose Regression),在 COCO val2017 上 ResNet-50 基础下,IPR AP 0.633、DSNT AP 0.674、Debias-IPR AP 0.675。
SimCC 坐标分类法
simcc 遵循 SimCC)。
RTMPose:面向工业部署的实时框架
rtmpose 是 MMPose 团队提出的高性能实时多人体姿态估计框架。它从范式、骨干网络、定位算法、训练策略、部署推理五个维度系统优化,在 COCO val2017 上 RTMPose-l 达到 AP 0.758,同时保持极高的推理速度。仓库文档明确报告:RTMPose-m 在 Intel i7-11700 CPU 上可达 90+ FPS,在 NVIDIA GTX 1660 Ti GPU 上可达 430+ FPS。以 rtmpose-m_8xb256-420e_coco-256x192.py 为例,其配置核心要素包括:
- 编解码器:
codec = dict(type='SimCCLabel', input_size=(192, 256), sigma=(4.9, 5.66), simcc_split_ratio=2.0, ...),即采用 SimCC 坐标分类,simcc_split_ratio=2.0表示将每个像素再细分为 2 个 bin; - 骨干网络:复用 mmdet 的
CSPNeXt(_scope_='mmdet'),并通过init_cfg加载预训练权重; - 预测头:
RTMCCHead,内部包含 GAU(Gating Attention Unit)模块,配合KLDiscretLoss进行蒸馏式分类训练(beta=10.0, label_softmax=True); - 两阶段训练:通过
mmdet.PipelineSwitchHook在max_epochs - stage2_num_epochs(即 390 epoch)处切换到第二阶段数据增强(更小的尺度扰动scale_factor=[0.75, 1.25]); - 优化策略:AdamW(lr=4e-3,weight_decay=0.05),前 1000 iter 线性预热,后半程余弦退火,并启用
EMAHook(momentum=0.0002)稳定训练。
Associative Embedding(AE)
associative_embedding 是最经典的自底向上方法之一:网络为每个检测到的关键点额外预测一个标签(tag)——同一个人的标签彼此接近,不同人的标签彼此远离,据此即可把全图关键点聚合成个人实例。仓库以 HRNet 为骨干提供了 COCO 上的完整实现与训练配置(associative_embedding/coco)。
DEKR:解耦关键点回归
dekr(CVPR'2021)同样走 Bottom-up 路线,但它同时检测所有实例中心,并回归从实例中心到各关节的偏移。为提高偏移精度,不同关节的偏移使用带可变形卷积的独立分支回归,让每个关节都能以不同形状的卷积核提取针对性特征。配置见 dekr/coco 与 dekr/crowdpose,是下方 Bottom-up Demo 的默认示例模型。
RTMO:一阶段实时模型
rtmo(arXiv:2312.07526)把坐标分类无缝集成进 YOLO 架构,属于一阶段模型:其核心是Dynamic Coordinate Classifier(DCC)模块,通过双 1D 热力图完成关键点定位——DCC 采用动态 bin 分配,将坐标 bin 定位到每个预测框附近以提高效率,并基于位置编码构造可学习的 bin 表示,计算 bin 与关键点的相似度实现精确定位。训练时使用多任务损失(框回归、关键点 MLE 分类损失、坐标代理回归、可见性分类);推理时基于网格稠密预测单次前向同时输出人体框与姿态,且只在 NMS 后对高置信网格解码热力图,从而控制计算量。相对此前直接回归坐标的一阶段方法,RTMO 在保持实时速度的同时显著提升了精度。
CID 与 YOLOX-Pose
- CID(configs/body_2d_keypoint/cid):上下文实例解耦方法,以 HRNet-w32/w48 为骨干提供 COCO 配置,属于 Bottom-up 家族;
- YOLOX-Pose(yoloxpose):基于 YOLOX 检测框架实现 YOLO-Pose,在单次前向中同时完成人体检测与关键点回归,不同关节通过带自适应卷积的独立分支预测偏移,从而统一了目标检测与姿态估计两条任务线。
数据准备:2D 人体关键点数据集
进入训练或评估前,需先按 2D Body Keypoint Datasets 指南 准备数据。MMPose 官方推荐将数据集根目录软链接到$MMPOSE/data;若目录结构与默认不同,需要在对应配置中修改data_root等路径。该指南覆盖了图像类与视频类共 11 个数据集,最常使用的是前两者:
- COCO:下载 2017 Train/Val(关键点训练与验证均需要),并可选下载 person 检测结果文件(如
COCO_val2017_detections_AP_H_56_person.json)用于复现 Top-down 多人体结果。标准目录结构为data/coco/{annotations, person_detection_results, train2017, val2017}; - MPII:原始标注已由 MMPose 转换为 json 格式(
mpii_train.json、mpii_val.json等),放在data/mpii/annotations与data/mpii/images下。MPII 的预测结果默认保存为.mat,可用工具 mat2json.py 转换为可读 json:python tools/dataset_converters/mat2json ${PRED_MAT_FILE} ${GT_JSON_FILE} ${OUTPUT_PRED_JSON_FILE}
其余数据集(MPII-TRB、AIC、CrowdPose、OCHuman、MHP、Human-Art、ExLPose、PoseTrack18、sub-JHMDB)的下载地址、注解文件与目录布局均在 2d_body_keypoint.md 中逐一给出,其中 CrowdPose 的 Top-down 实验按官方惯例使用 YOLOv3 预训练权重生成人体框;PoseTrack18 的官方评测工具需另行安装pip install git+https://github.com/svenkreiss/poseval.git。仓库根目录还提供了tests/data/coco等迷你测试数据,可直接用于快速验证推理流程。
推理实战:图像、视频与统一 Inferencer
运行示例的完整说明见 2D Human Pose Demo。以下命令均可在本仓库直接执行。
方式一:整图直接输入(单人/单框)
使用 demo/image_demo.py,把整张图当作唯一的输入框,适合单人或把全图当作检测框的场景:
python demo/image_demo.py \ ${IMG_FILE} ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --out-file ${OUTPUT_FILE} \ [--device ${GPU_ID or CPU}] \ [--draw-heatmap]若使用热力图模型并加--draw-heatmap,可视化结果会同时叠加关键点与预测热力图。官方示例(HRNet-w48 COCO 模型):
python demo/image_demo.py \ tests/data/coco/000000000785.jpg \ configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_hrnet-w48_8xb32-210e_coco-256x192.py \ https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth \ --out-file vis_results.jpg \ --draw-heatmapCPU 运行只需追加--device=cpu。
方式二:mmdet 检测 + mmpose 估计(标准 Top-down 流水线)
先安装 mmdet(版本 >= 3.0),再运行 demo/topdown_demo_with_mmdet.py:
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}]其中--bbox-thr与--kpt-thr分别控制检测框与关键点的置信度阈值。官方示例使用 RTMDet-m 人体检测器 + RTMPose-m(SimCC 姿态模型):
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/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb256-420e_body8-256x192.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-body7_pt-body7_420e-256x192-e48f03d0_20230504.pth \ --input tests/data/coco/000000197388.jpg --show --draw-heatmap \ --output-root vis_results/视频输入完全相同,只需把--input换成视频文件路径或 URL,例如仓库测试数据 tests/data/posetrack18/videos/000001_mpiinew_test/000001_mpiinew_test.mp4。指定--save-predictions可将预测结果落盘保存。
方式三:Bottom-up 图像/视频 Demo
Bottom-up 模型不依赖人体检测器,使用 demo/bottomup_demo.py:
python demo/bottomup_demo.py \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --input ${INPUT_PATH} \ [--output-root ${OUTPUT_DIR}] [--save-predictions] \ [--show] [--device ${GPU_ID or CPU}] \ [--kpt-thr ${KPT_SCORE_THR}]官方示例直接使用仓库中的 DEKR 配置与对应权重:
python demo/bottomup_demo.py \ configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.py \ https://download.openmmlab.com/mmpose/v1/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512_ac7c17bf-20221228.pth \ --input tests/data/coco/000000197388.jpg --output-root=vis_results \ --show --save-predictions方式四:统一 Inferencer 接口
demo/inferencer_demo.py 提供统一推理接口,支持用模型别名替代配置文件与权重路径,输入可以是图片路径、视频路径、图片文件夹甚至摄像头:
python demo/inferencer_demo.py \ tests/data/posetrack18/videos/000001_mpiinew_test/000001_mpiinew_test.mp4 \ --pose2d human --vis-out-dir vis_results/posetrack18该命令对视频逐帧推理并将可视化结果保存到vis_results/posetrack18目录。
推理加速技巧
Top-down 模型的耗时主要在姿态估计与检测两端,官方建议:
- 关闭测试时的水平翻转融合——在配置中将
model.test_cfg.flip_test设为False(参见 td-hm_res50_8xb64-210e_coco-256x192.py),可显著减少推理计算量; - 更换更快速的人体检测器(如 RTMDet 系列,检测配置见 demo/mmdetection_cfg),从而缩短 Top-down 流水线第一阶段的耗时。
小结:如何选择合适的方法
综合仓库内全部子 README 给出的基准数据,可归纳如下选型思路:
| 场景需求 | 推荐方向 | 代表配置 |
|---|---|---|
| 追求极致精度(学术基准) | Top-down 热力图 | topdown_heatmap/coco(HRNet-w48、ViTPose-h 等) |
| 追求实时部署(CPU/边缘) | Top-down SimCC 实时框架 | rtmpose/coco(RTMPose-t/s/m/l) |
| 拥挤场景、人数众多 | Bottom-up 或一阶段 | dekr/crowdpose、rtmo |
| 无检测器、单次前向 | Bottom-up | associative_embedding/coco、cid/coco、yoloxpose/coco |
| 轻量骨干、移动端 | SimCC / 回归 | simcc/coco、topdown_regression/coco |
各模型的具体权重下载地址、训练日志与更细粒度指标(AP/AP50/AP75/AR、PCKh 等),均可通过对应子目录下的*_coco.md/*_mpii.md模型卡片查阅。至此,从范式原理、算法族对比、数据集准备到四种推理方式,你已经可以在 MMPose 中独立完成人体 2D 姿态估计的选型与运行。
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考