全身姿态估计怎么做?MMPose 133 关键点实战指南
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
MMPose 是 OpenMMLab 开源的姿态估计工具箱。做全身姿态估计时,它能在一张图上定位 133 个关键点:身体 17 个、足部 6 个、面部 68 个、双手 42 个,直接输出带置信度的像素坐标。
全身姿态估计:它到底能干什么
输入一张图片或者一段视频,每个被检测到的人都会得到一组 133 个关键点的坐标。关键点覆盖躯干四肢的主关节、双脚、脸部和两只手,每个点附置信度。人体框不需要自己画,可以由检测器自动完成,也可以手动传入现成的框。整条流程是 Top-Down:先定位人,再逐人估计姿态。
| 输入 | 输出 | 部位覆盖 | 可用规模 |
|---|---|---|---|
| 图片/视频,人体框自动检测或手动传入 | 每人 133 个关键点坐标 + 置信度 | 身体 17、足部 6、面部 68、双手 42 | RTMPose m/l 等,256x192 与 384x288 两档输入 |
图:COCO 测试图,整图输入即可得到框内人物的全身姿态结果。
技术内核拆解
一个头出 133 个通道,而不是拆成四个小网络
RTMPose 全身模型并没有为身体、脸、手、脚各跑一遍网络,而是一个 CSPNeXt 骨干接一个检测头,一次前向输出全部 133 个通道。这样取舍的理由是:单次推理比多次快得多,且身体与手脸共享同一份图像上下文,互相补位。点位密度差异带来的难点,靠配置里按关键点单独调的joint_weights和各部位分阶段训练来消化。133 点的构成就定义在数据集类里:mmpose/datasets/datasets/wholebody/coco_wholebody_dataset.py。
用 SimCC 替代热图,小分辨率也能稳住手指
256x192 的输入经 32 倍下采样后只剩 8x6 的特征图,这个粒度画热图,手指关节根本分不开。RTMPose 换成 SimCC:把每个关键点表示成 x、y 两条一维分布,再按 2 倍比例拉长,等效拿到约 16x12 的分辨率,代价几乎不变。训练用 KLDiscretLoss 优化这两条分布,换来亚像素级定位精度,实时性不受影响。编解码实现见 mmpose/codecs/simcc_label.py。
MMPose 133 关键点效果对比:精度到底多少
下表数据来自仓库内的官方 benchmark,测速基于 COCO-WholeBody v1.0 验证集,人体检测器 AP 为 56.4:
| 模型规格 | 输入分辨率 | Whole AP / AR | FLOPS (G) | 推理耗时(RTX 3090,TRT-FP16) |
|---|---|---|---|---|
| RTMPose-m | 256x192 | 60.4 / 66.7 | 2.22 | 1.17~1.84 ms |
| RTMPose-l | 256x192 | 63.2 / 69.4 | 4.52 | 1.44~2.61 ms |
| RTMPose-l | 384x288 | 67.0 / 72.3 | 10.07 | 1.75~4.24 ms |
从这张表能读出三件事:桌面 GPU 上 133 点全身推理不到 3 毫秒,整条流水线的瓶颈往往在前置的人体检测而不是姿态模型;分辨率从 256x192 提到 384x288,AP 涨了约 4 个点,但 FLOPS 翻了 2 倍多,收益递减明显;同一模型在 Jetson Orin NX 上是 3.5~7.2 毫秒,边缘设备也够用。完整测速矩阵在 projects/rtmpose/benchmark/README_CN.md。
图:CrowdPose 人群场景测试图,遮挡与密集人群是全身姿态估计的典型难点。
真实场景怎么用
从单张图片检出全身骨架
17 点身体模型看不到手指和脸,做体态分析、形象类应用时信息量不够。MMPose 用单个全身模型一次输出 133 点,人体框由检测器自动补全。命令行入口是demo/image_demo.py,文档在demo/docs/zh_cn/2d_wholebody_pose_demo.md。如果你想快速跑通:
from mmpose.apis import Pose2DInferencer inferencer = Pose2DInferencer( model='configs/wholebody_2d_keypoint/rtmpose/coco-wholebody/' 'rtmpose-m_8xb64-270e_coco-wholebody-256x192.py', weights='rtmpose-m_simcc-coco-wholebody_pt-aic-coco_270e-256x192-cd5e845c_20230123.pth', det_model='rtmdet-m') result = inferencer('tests/data/coco/000000196141.jpg')给舞蹈或健身动作打分
教培场景里教练打分主观、无法规模化复制。全身关键点把"动作"变成可计算的坐标序列,官方示例projects/just_dance就做了这件事:对齐学生与教练的关键点序列,逐帧算相似度作为评分,核心逻辑见 projects/just_dance/calculate_similarity.py。
用 42 个手部关键点做手势分类
手部区域拿身体模型去套基本失准,手势识别需要足够密的手指点位。仓库提供 OneHand10K 和 hand5(五指 21 点)的 RTMPose 预训练配置,比如configs/hand_2d_keypoint/rtmpose/hand5/rtmpose-m_8xb256-210e_hand5-256x256.py,加载后即可输出每只手的 21 个点位供下游分类。
从 Demo 到生产
云端:把全身姿态估计做成容器化服务
仓库自带 TorchServe 容器方案,镜像构建脚本在docker/serve/Dockerfile,端口与模型目录由 docker/serve/config.properties 控制,inference_address默认监听 8080。最简启动:docker build -f docker/serve/Dockerfile -t mmpose-serve .,然后docker run -p 8080:8080 mmpose-serve。训练侧同理:自定义数据先转 COCO-WholeBody 格式,用tools/dataset_converters/下的脚本转换,再改一份现有配置跑tools/train.py,微调时数据管线、EMA、学习率衰减都是现成的。
边缘:让人体姿态估计 Python 库跑进 Jetson 和手机
- 剪枝:Group Fisher 剪枝加微调的完整流程在 projects/rtmpose/rtmpose/pruning/,含 prune 与 deploy 两套配置
- 推理引擎:benchmark 给出了 ONNX Runtime(i7 CPU)、TensorRT FP16(1660Ti/3090)、ncnn(骁龙 865)、Jetson Orin 全系实测延迟,17 点 RTMPose-t 在 3090 上仅 1.12 毫秒
- 手机端
projects/rtmpose/examples/内有 ncnn 推理的 C++ 示例代码 - 预算紧张时的取舍:133 点全身模型 FLOPS 约 2.2G 起,也可以改用 17 点身体模型加独立手部模型,用一点流水线复杂度换端侧延迟
周边生态与下一步
同仓库的demo/topdown_demo_with_mmdet.py直接把 MMDet 的 RTMDet 检测器和 MMPose 姿态模型串成端到端流水线,视频场景在demo/mmtracking_cfg/里也备好了 MMTracking 的 DeepSORT 配置,部署链则对接 MMDeploy,上文的测速数字就是用 MMDeploy 的 profiler 测出来的。往 3D 走,projects/rtmpose3d提供 3D 版模型,demo/body3d_pose_lifter_demo.py能把 2D 关键点直接提升到 3D;手部方向还有 InterHand3D 的完整配置。
133 个全身关键点、GPU 上不到 2 毫秒的推理,一条命令跑通的全身姿态估计,就是 MMPose 给工程侧留出的全部门槛。
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考