mmpose/projects/rtmpose/README_CN.md

93 KiB
Raw Permalink Blame History

RTMPose: Real-Time Multi-Person Pose Estimation toolkit based on MMPose

RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose

English | 简体中文


Abstract

近年来2D 姿态估计的研究在公开数据集上取得了出色的成绩,但是它在工业界的应用仍然受到笨重的模型参数和高推理延迟的影响。为了让前沿姿态估计算法在工业界落地,我们通过实验研究了多人姿态估计算法的五个方面:范式、骨干网络、定位算法、训练策略和部署推理,基于 MMPose 提出了一个高性能的实时多人姿态估计框架 RTMPose。我们的 RTMPose-m 模型在 COCO 上取得 75.8AP,在 Intel i7-11700 CPU 上达到 90+FPS,在 NVIDIA GTX 1660 Ti GPU 上达到 430+FPS。我们同样验证了在算力有限的设备上做实时姿态估计RTMPose-s 在移动端骁龙865芯片上可以达到 COCO 72.2%AP70+FPS。在 MMDeploy 的帮助下,我们的项目支持 CPU、GPU、Jetson、移动端等多种部署环境。

rtmpose_intro


📄 Table of Contents

🥳 最新进展 🔝

  • 2023 年 12 月:
    • 更新 RTMW 模型RTMW-l 在 COCO-Wholebody 验证集上去的 70.1 mAP。
  • 2023 年 9 月:
    • 发布混合数据集上训练的 RTMW 模型。Alpha 版本的 RTMW-x 在 COCO-Wholebody 验证集上取得了 70.2 mAP。在线 Demo 已支持 RTMW。技术报告正在撰写中。
    • 增加 HumanArt 上训练的 YOLOX 和 RTMDet 模型。
  • 2023 年 8 月:
    • 支持基于 RTMPose 模型蒸馏的 133 点 WholeBody 模型(由 DWPose 提供)。
      • 你可以在 sd-webui-controlnet 中使用 DWPose/RTMPose 作为姿态估计后端进行人物图像生成。升级 sd-webui-controlnet >= v1.1237 并选择 dw_openpose_full 即可使用。
      • 在线 Demo 已支持 DWPose试玩请选择 wholebody
  • 2023 年 7 月:
    • 在线 RTMPose 试玩 Demo
    • 支持面向艺术图片人体姿态估计的 17 点 Body 模型。
  • 2023 年 6 月:
    • 发布混合数据集训练的 26 点 Body 模型。
  • 2023 年 5 月:
    • 已导出的 SDK 模型ONNX、TRT、ncnn 等)可以从 OpenMMLab Deploee 直接下载。
    • 在线导出 SDK 模型ONNX、TRT、ncnn 等)。
    • 添加 代码示例,包括:
      • 纯 Python 推理代码示例,无 MMDeploy、MMCV 依赖
      • C++ 代码示例ONNXRuntime、TensorRT
      • Android 项目示例:基于 ncnn
    • 发布混合数据集训练的 Hand, Face, Body 模型。
  • 2023 年 3 月:发布 RTMPose。RTMPose-m 取得 COCO 验证集 75.8 mAP推理速度达到 430+ FPS 。

📖 简介 🔝

主要特性

  • 🚀 高精度,低延迟

    Model AP(COCO) CPU-FPS GPU-FPS
    t 68.5 300+ 940+
    s 72.2 200+ 710+
    m 75.8 90+ 430+
    l 76.5 50+ 280+
    l-384 78.3 - 160+
  • 🛠️ 易部署

    • 详细的部署代码教程,手把手教你模型部署
    • MMDeploy 助力
    • 支持多种部署后端
      • ONNX
      • TensorRT
      • ncnn
      • OpenVINO 等
    • 支持多种平台
      • Linux
      • Windows
      • NVIDIA Jetson
      • ARM 等
  • 🏗️ 为实际业务设计

    • 提供多种 Pipeline 推理接口和 SDK
      • Python
      • C++
      • C#
      • JAVA 等

🙌 社区共建 🔝

RTMPose 是一个长期优化迭代的项目,致力于业务场景下的高性能实时姿态估计算法的训练、优化和部署,因此我们十分期待来自社区的力量,欢迎分享不同业务场景中 RTMPose 的训练配置与技巧,助力更多的社区用户!

欢迎加入我们的社区交流群获得更多帮助:

  • 微信用户群

Pipeline 性能 🔝

说明

  • Pipeline 速度测试时开启了隔帧检测策略,默认检测间隔为 5 帧。
  • 环境配置:
    • torch >= 1.7.1
    • onnxruntime 1.12.1
    • TensorRT 8.4.3.1
    • cuDNN 8.3.2
    • CUDA 11.3
  • 更新:我们推荐你使用混合数据集训练的 Body8 模型,性能高于下表中提供的模型,传送门
Detection Config Pose Config Input Size
(Det/Pose)
Model AP
(COCO)
Pipeline AP
(COCO)
Params (M)
(Det/Pose)
Flops (G)
(Det/Pose)
ORT-Latency(ms)
(i7-11700)
TRT-FP16-Latency(ms)
(GTX 1660Ti)
Download
RTMDet-nano RTMPose-t 320x320
256x192
40.3
67.1
64.4 0.99
3.34
0.31
0.36
12.403 2.467 det
pose
RTMDet-nano RTMPose-s 320x320
256x192
40.3
71.1
68.5 0.99
5.47
0.31
0.68
16.658 2.730 det
pose
RTMDet-nano RTMPose-m 320x320
256x192
40.3
75.3
73.2 0.99
13.59
0.31
1.93
26.613 4.312 det
pose
RTMDet-nano RTMPose-l 320x320
256x192
40.3
76.3
74.2 0.99
27.66
0.31
4.16
36.311 4.644 det
pose
RTMDet-m RTMPose-m 640x640
256x192
62.5
75.3
75.7 24.66
13.59
38.95
1.93
- 6.923 det
pose
RTMDet-m RTMPose-l 640x640
256x192
62.5
76.3
76.6 24.66
27.66
38.95
4.16
- 7.204 det
pose

📊 模型库 🔝

说明

  • 此处提供的模型采用了多数据集联合训练以提高性能,模型指标不适用于学术比较。
  • 表格中为开启了 Flip Test 的测试结果。
  • RTMPose 在更多公开数据集上的性能指标可以前往 Model Zoo 查看。
  • RTMPose 在更多硬件平台上的推理速度可以前往 Benchmark 查看。
  • 如果你有希望我们支持的数据集,欢迎联系我们/Google Questionnaire

人体 2d 关键点

17 Keypoints

AIC+COCO
Config Input Size AP
(COCO)
PCK@0.1
(Body8)
AUC
(Body8)
Params
(M)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
ncnn-FP16-Latency
(ms)
(Snapdragon 865)
Download
RTMPose-t 256x192 68.5 91.28 63.38 3.34 0.36 3.20 1.06 9.02 pth
RTMPose-s 256x192 72.2 92.95 66.19 5.47 0.68 4.48 1.39 13.89 pth
RTMPose-m 256x192 75.8 94.13 68.53 13.59 1.93 11.06 2.29 26.44 pth
RTMPose-l 256x192 76.5 94.35 68.98 27.66 4.16 18.85 3.46 45.37 pth
RTMPose-m 384x288 77.0 94.32 69.85 13.72 4.33 24.78 3.66 - pth
RTMPose-l 384x288 77.3 94.54 70.14 27.79 9.35 - 6.05 - pth
Body8
Config Input Size AP
(COCO)
PCK@0.1
(Body8)
AUC
(Body8)
Params
(M)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
ncnn-FP16-Latency
(ms)
(Snapdragon 865)
Download
RTMPose-t* 256x192 65.9 91.44 63.18 3.34 0.36 3.20 1.06 9.02 pth
onnx
RTMPose-s* 256x192 69.7 92.45 65.15 5.47 0.68 4.48 1.39 13.89 pth
onnx
RTMPose-m* 256x192 74.9 94.25 68.59 13.59 1.93 11.06 2.29 26.44 pth
onnx
RTMPose-l* 256x192 76.7 95.08 70.14 27.66 4.16 18.85 3.46 45.37 pth
onnx
RTMPose-m* 384x288 76.6 94.64 70.38 13.72 4.33 24.78 3.66 - pth
onnx
RTMPose-l* 384x288 78.3 95.36 71.58 27.79 9.35 - 6.05 - pth
onnx
RTMPose-x* 384x288 78.8 - - 49.43 17.22 - - - pth
onnx
Human-Art
  • 面向艺术图片的人体姿态估计 RTMPose 模型由 Human-Art 提供。

人体检测模型:

Detection Config Input Size Model AP
(OneHand10K)
Flops
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMDet-tiny 640x640 46.6 - - - Det Model
RTMDet-s 640x640 50.6 - - - Det Model
YOLOX-nano 640x640 38.9 - - - Det Model
YOLOX-tiny 640x640 47.7 - - - Det Model
YOLOX-s 640x640 54.6 - - - Det Model
YOLOX-m 640x640 59.1 - - - Det Model
YOLOX-l 640x640 60.2 - - - Det Model
YOLOX-x 640x640 61.3 - - - Det Model

人体姿态估计模型:

Config Input Size AP
(Human-Art GT)
Params
(M)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
ncnn-FP16-Latency
(ms)
(Snapdragon 865)
Download
RTMPose-t* 256x192 65.5 3.34 0.36 3.20 1.06 9.02 pth
onnx
RTMPose-s* 256x192 69.8 5.47 0.68 4.48 1.39 13.89 pth
onnx
RTMPose-m* 256x192 72.8 13.59 1.93 11.06 2.29 26.44 pth
onnx
RTMPose-l* 256x192 75.3 27.66 4.16 18.85 3.46 45.37 pth
onnx

26 Keypoints

  • 关键点骨架定义遵循 Halpe26,详情见 meta info
  • 模型在 Body8 上进行训练和评估。
Config Input Size PCK@0.1
(Body8)
AUC
(Body8)
Params(M) FLOPS(G) ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
ncnn-FP16-Latency
(ms)
(Snapdragon 865)
Download
RTMPose-t* 256x192 91.89 66.35 3.51 0.37 - - - pth
onnx
RTMPose-s* 256x192 93.01 68.62 5.70 0.70 - - - pth
onnx
RTMPose-m* 256x192 94.75 71.91 13.93 1.95 - - - pth
onnx
RTMPose-l* 256x192 95.37 73.19 28.11 4.19 - - - pth
onnx
RTMPose-m* 384x288 95.15 73.56 14.06 4.37 - - - pth
onnx
RTMPose-l* 384x288 95.56 74.38 28.24 9.40 - - - pth
onnx
RTMPose-x* 384x288 95.74 74.82 50.00 17.29 - - - pth
onnx

模型剪枝

说明

Config Input Size AP
(COCO)
Params
(M)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
ncnn-FP16-Latency
(ms)
(Snapdragon 865)
Download
RTMPose-s-aic-coco-pruned 256x192 69.4 3.43 0.35 - - - pth

更多信息,请参考 GroupFisher Pruning for RTMPose.

人体全身 2d 关键点 (133 Keypoints)

COCO-WholeBody
Config Input Size Whole AP Whole AR FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMPose-m 256x192 58.2 67.4 2.22 13.50 4.00 pth
RTMPose-l 256x192 61.1 70.0 4.52 23.41 5.67 pth
RTMPose-l 384x288 64.8 73.0 10.07 44.58 7.68 pth
RTMPose-x 384x288 65.3 73.3 18.1 - - pth
Cocktail14
Config Input Size Whole AP Whole AR FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMW-m 256x192 58.2 67.3 4.3 - - pth
onnx
RTMW-l 256x192 66.0 74.6 7.9 - - pth
onnx
RTMW-x 256x192 67.2 75.2 13.1 - - pth
RTMW-l 384x288 70.1 78.0 17.7 - - pth
onnx
RTMW-x 384x288 70.2 78.1 29.3 - - pth
COCO+UBody
Config Input Size Whole AP Whole AR FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMPose-t 256x192 48.5 58.4 0.5 - - pth
onnx
RTMPose-s 256x192 53.8 63.2 0.9 - - pth
onnx
RTMPose-m 256x192 60.6 69.5 2.22 13.50 4.00 pth
onnx
RTMPose-l 256x192 63.1 71.7 4.52 23.41 5.67 pth
onnx
RTMPose-l 384x288 66.5 74.3 10.07 44.58 7.68 pth
onnx

动物 2d 关键点 (17 Keypoints)

Config Input Size AP
(AP10K)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMPose-m 256x256 72.2 2.57 14.157 2.404 pth
onnx

脸部 2d 关键点 (106 Keypoints)

Face6
Config Input Size NME
(LaPa)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMPose-t* 256x256 1.67 0.652 - - pth
onnx
RTMPose-s* 256x256 1.59 1.119 - - pth
onnx
RTMPose-m* 256x256 1.44 2.852 - - pth
onnx

手部 2d 关键点 (21 Keypoints)

Detection Config Input Size Model AP
(OneHand10K)
Flops
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMDet-nano
(alpha version)
320x320 76.0 0.31 - - pth
onnx
Hand5
Config Input Size PCK@0.2
(COCO-Wholebody-Hand)
PCK@0.2
(Hand5)
AUC
(Hand5)
FLOPS
(G)
ORT-Latency
(ms)
(i7-11700)
TRT-FP16-Latency
(ms)
(GTX 1660Ti)
Download
RTMPose-m*
(alpha version)
256x256 81.5 96.4 83.9 2.581 - - pth
onnx

预训练模型

我们提供了 UDP 预训练的 CSPNeXt 模型参数,训练配置请参考 pretrain_cspnext_udp folder

AIC+COCO
Model Input Size Params
(M)
Flops
(G)
AP
(GT)
AR
(GT)
Download
CSPNeXt-tiny 256x192 6.03 1.43 65.5 68.9 pth
CSPNeXt-s 256x192 8.58 1.78 70.0 73.3 pth
CSPNeXt-m 256x192 17.53 3.05 74.8 77.7 pth
CSPNeXt-l 256x192 32.44 5.32 77.2 79.9 pth
Body8
Model Input Size Params
(M)
Flops
(G)
AP
(COCO)
PCK@0.2
(Body8)
AUC
(Body8)
Download
CSPNeXt-tiny* 256x192 6.03 1.43 65.9 96.34 63.80 pth
CSPNeXt-s* 256x192 8.58 1.78 68.7 96.59 64.92 pth
CSPNeXt-m* 256x192 17.53 3.05 73.7 97.42 68.19 pth
CSPNeXt-l* 256x192 32.44 5.32 75.7 97.76 69.57 pth
CSPNeXt-m* 384x288 17.53 6.86 75.8 97.60 70.18 pth
CSPNeXt-l* 384x288 32.44 11.96 77.2 97.89 71.23 pth
CSPNeXt-x* 384x288 54.92 19.96 78.1 98.00 71.79 pth

ImageNet

我们提供了 ImageNet 分类训练的 CSPNeXt 模型参数,更多细节请参考 RTMDet

Model Input Size Params
(M)
Flops
(G)
Top-1 (%) Top-5 (%) Download
CSPNeXt-tiny 224x224 2.73 0.34 69.44 89.45 pth
CSPNeXt-s 224x224 4.89 0.66 74.41 92.23 pth
CSPNeXt-m 224x224 13.05 1.93 79.27 94.79 pth
CSPNeXt-l 224x224 27.16 4.19 81.30 95.62 pth
CSPNeXt-x 224x224 48.85 7.76 82.10 95.69 pth

👀 可视化 🔝

😎 快速尝试 🔝

我们提供了多种途径来让用户尝试 RTMPose 模型:

  • 在线 RTMPose Demo
  • Examples 基于 Python 和 ONNXRuntime (无 MMCV 依赖)
  • rtmlib 推理库 (无 MMCV、Pytorch 依赖)
  • MMPose demo 脚本 (基于 Pytorch
  • MMDeploy SDK 预编译包 推荐速度提升6-10倍

rtmlib 推理库

rtmlib 提供了开箱即用的 RTMPose 全系列官方及衍生模型的推理:

  • 无需安装 mmcvmmenginemmpose 等一系列训练库,无需 pytorch 环境,有 opencv 就能推理
  • 超级友好简洁的推理和可视化接口
  • 支持 CPU 和 GPU 推理
  • 自动下载和缓存 onnx 模型
  • 支持 RTMPose 全系列官方及衍生模型RTMPoseDWPoseRTMORTMW etc.

MMPose demo 脚本

通过 MMPose 提供的 demo 脚本可以基于 Pytorch 快速进行模型推理和效果验证。

提示:

  • 基于 Pytorch 推理并不能达到 RTMPose 模型的最大推理速度,只用于模型效果验证。
  • 输入模型路径可以是本地路径,也可以是下载链接。
# 前往 mmpose 目录
cd ${PATH_TO_MMPOSE}

# RTMDet 与 RTMPose 联合推理
# 输入模型路径可以是本地路径,也可以是下载链接。
python demo/topdown_demo_with_mmdet.py \
    projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    --input {YOUR_TEST_IMG_or_VIDEO} \
    --show

# 摄像头推理
# 输入模型路径可以是本地路径,也可以是下载链接。
python demo/topdown_demo_with_mmdet.py \
    projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    --input webcam \
    --show

效果展示:

topdown_inference_with_rtmdet

MMDeploy SDK 预编译包 (推荐)

MMDeploy 提供了预编译的 SDK用于对 RTMPose 项目进行 Pipeline 推理,其中推理所用的模型为 SDK 版本。

  • 所有的模型必须经过 tools/deploy.py 导出后才能使用 PoseTracker 进行推理。
  • 导出 SDK 版模型的教程见 SDK 推理,推理的详细参数设置见 Pipeline 推理
  • 你可以从 硬件模型库 直接下载 SDK 版模型ONNX、 TRT、ncnn 等)。
  • 同时我们也支持 在线模型转换

Linux\

说明:

  • GCC 版本需大于 7.5
  • cmake 版本需大于 3.20
Python 推理
  1. 安装 mmdeploy_runtime 或者 mmdeploy_runtime_gpu
# for onnxruntime
pip install mmdeploy-runtime

# for onnxruntime-gpu / tensorrt
pip install mmdeploy-runtime-gpu
  1. 下载预编译包:
# onnxruntime
# for ubuntu
wget -c  https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64-cxx11abi.tar.gz
# 解压并将 third_party 中第三方推理库的动态库添加到 PATH

# for centos7 and lower
wget -c https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64.tar.gz
# 解压并将 third_party 中第三方推理库的动态库添加到 PATH

# onnxruntime-gpu / tensorrt
# for ubuntu
wget -c  https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64-cxx11abi-cuda11.3.tar.gz
# 解压并将 third_party 中第三方推理库的动态库添加到 PATH

# for centos7 and lower
wget -c https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64-cuda11.3.tar.gz
# 解压并将 third_party 中第三方推理库的动态库添加到 PATH
  1. 下载 sdk 模型并解压到 ./example/python 下。(该模型只用于演示,如需其他模型,请参考 SDK 推理
# rtmdet-nano + rtmpose-m for cpu sdk
wget https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip

unzip rtmpose-cpu.zip
  1. 使用 pose_tracker.py 进行推理:
# 进入 ./example/python

# 请传入模型目录,而不是模型文件
# 格式:
# python pose_tracker.py cpu {det work-dir} {pose work-dir} {your_video.mp4}

# 示例:
python pose_tracker.py cpu rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_video.mp4

# 摄像头
python pose_tracker.py cpu rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ 0
ONNX
# 下载预编译包
wget https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64-cxx11abi.tar.gz

# 解压文件
tar -xzvf mmdeploy-1.0.0-linux-x86_64-cxx11abi.tar.gz

# 切换到 sdk 目录
cd mmdeploy-1.0.0-linux-x86_64-cxx11abi

# 设置环境变量
source set_env.sh

# 如果系统中没有安装 opencv 3+,请执行以下命令。如果已安装,可略过
bash install_opencv.sh

# 编译可执行程序
bash build_sdk.sh

# 图片推理
# 请传入模型目录,而不是模型文件
./bin/det_pose rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_img.jpg --device cpu

# 视频推理
# 请传入模型目录,而不是模型文件
./bin/pose_tracker rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_video.mp4 --device cpu

# 摄像头推理
# 请传入模型目录,而不是模型文件
./bin/pose_tracker rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ 0 --device cpu
TensorRT
# 下载预编译包
wget https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-linux-x86_64-cxx11abi-cuda11.3.tar.gz

# 解压文件
tar -xzvf mmdeploy-1.0.0-linux-x86_64-cxx11abi-cuda11.3.tar.gz

# 切换到 sdk 目录
cd mmdeploy-1.0.0-linux-x86_64-cxx11abi-cuda11.3

# 设置环境变量
source set_env.sh

# 如果系统中没有安装 opencv 3+,请执行以下命令。如果已安装,可略过
bash install_opencv.sh

# 编译可执行程序
bash build_sdk.sh

# 图片推理
# 请传入模型目录,而不是模型文件
./bin/det_pose rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_img.jpg --device cuda

# 视频推理
# 请传入模型目录,而不是模型文件
./bin/pose_tracker rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_video.mp4 --device cuda

# 摄像头推理
# 请传入模型目录,而不是模型文件
./bin/pose_tracker rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ 0 --device cuda

详细参数设置见 Pipeline 推理

Windows

Python 推理
  1. 安装 mmdeploy_runtime 或者 mmdeploy_runtime_gpu
# for onnxruntime
pip install mmdeploy-runtime
# 下载 [sdk](https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-windows-amd64.zip) 并将 third_party 中第三方推理库的动态库添加到 PATH

# for onnxruntime-gpu / tensorrt
pip install mmdeploy-runtime-gpu
# 下载 [sdk](https://github.com/open-mmlab/mmdeploy/releases/download/v1.0.0/mmdeploy-1.0.0-windows-amd64-cuda11.3.zip) 并将 third_party 中第三方推理库的动态库添加到 PATH
  1. 下载 sdk 模型并解压到 ./example/python 下。(该模型只用于演示,如需其他模型,请参考 SDK 推理
# rtmdet-nano + rtmpose-m for cpu sdk
wget https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip

unzip rtmpose-cpu.zip
  1. 使用 pose_tracker.py 进行推理:
# 进入 ./example/python
# 请传入模型目录,而不是模型文件
python pose_tracker.py cpu rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_video.mp4

# 摄像头
# 请传入模型目录,而不是模型文件
python pose_tracker.py cpu rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ 0
可执行文件推理
  1. 安装 cmake
  2. 前往 mmdeploy 下载 win 预编译包。
  3. 解压文件,进入 sdk 目录。
  4. 使用管理员权限打开 PowerShell执行以下命令
set-ExecutionPolicy RemoteSigned
  1. 安装 OpenCV
# in sdk folder:
.\install_opencv.ps1
  1. 配置环境变量:
# in sdk folder:
. .\set_env.ps1
  1. 编译 sdk
# in sdk folder:
# 如果你通过 .\install_opencv.ps1 安装 opencv直接运行如下指令
.\build_sdk.ps1
# 如果你自行安装了 opencv需要指定 OpenCVConfig.cmake 的路径:
.\build_sdk.ps1 "path/to/folder/of/OpenCVConfig.cmake"
  1. 可执行文件会在如下路径生成:
example\cpp\build\Release

MMPose demo 脚本

通过 MMPose 提供的 demo 脚本可以基于 Pytorch 快速进行模型推理和效果验证。

提示:

  • 基于 Pytorch 推理并不能达到 RTMPose 模型的真实推理速度,只用于模型效果验证。
# 前往 mmpose 目录
cd ${PATH_TO_MMPOSE}

# RTMDet 与 RTMPose 联合推理
python demo/topdown_demo_with_mmdet.py \
    projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    {PATH_TO_CHECKPOINT}/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    {PATH_TO_CHECKPOINT}/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    --input {YOUR_TEST_IMG_or_VIDEO} \
    --show

# 摄像头推理
python demo/topdown_demo_with_mmdet.py \
    projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    {PATH_TO_CHECKPOINT}/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    {PATH_TO_CHECKPOINT}/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    --input webcam \
    --show

效果展示:

topdown_inference_with_rtmdet

👨‍🏫 模型训练 🔝

请参考 训练与测试 进行 RTMPose 的训练。

提示

  • 当用户的数据集较小时请根据情况缩小 batch_sizebase_lr
  • 模型选择
    • m推荐首选使用
    • t/s适用于极端低算力的移动设备或对推理速度要求严格的场景
    • l适用于算力较强、对速度不敏感的场景

🏗️ 部署教程 🔝

本教程将展示如何通过 MMDeploy 部署 RTMPose 项目。

🧩 安装

在开始部署之前,首先你需要确保正确安装了 MMPose, MMDetection, MMDeploy相关安装教程如下

根据部署后端的不同,有的后端需要对自定义算子进行编译,请根据需求前往对应的文档确保环境搭建正确:

🛠️ 模型转换

在完成安装之后,你就可以开始模型部署了。通过 MMDeploy 提供的 tools/deploy.py 可以方便地将 Pytorch 模型转换到不同的部署后端。

我们本节演示将 RTMDet 和 RTMPose 模型导出为 ONNX 和 TensorRT 格式,如果你希望了解更多内容请前往 MMDeploy 文档

如果你需要对部署配置进行修改,请参考 MMDeploy config tutorial.

本教程中使用的文件结构如下:

|----mmdeploy
|----mmdetection
|----mmpose

ONNX

运行如下命令:

# 前往 mmdeploy 目录
cd ${PATH_TO_MMDEPLOY}

# 转换 RTMDet
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmdet/detection/detection_onnxruntime_static.py \
    ../mmpose/projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-ort/rtmdet-nano \
    --device cpu \
    --show \
    --dump-info   # 导出 sdk info

# 转换 RTMPose
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmpose/pose-detection_simcc_onnxruntime_dynamic.py \
    ../mmpose/projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-ort/rtmpose-m \
    --device cpu \
    --show \
    --dump-info   # 导出 sdk info

默认导出模型文件为 {work-dir}/end2end.onnx

TensorRT

运行如下命令:

# 前往 mmdeploy 目录
cd ${PATH_TO_MMDEPLOY}

# 转换 RTMDet
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmdet/detection/detection_tensorrt_static-320x320.py \
    ../mmpose/projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-trt/rtmdet-nano \
    --device cuda:0 \
    --show \
    --dump-info   # 导出 sdk info

# 转换 RTMPose
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmpose/pose-detection_simcc_tensorrt_dynamic-256x192.py \
    ../mmpose/projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-trt/rtmpose-m \
    --device cuda:0 \
    --show \
    --dump-info   # 导出 sdk info

默认导出模型文件为 {work-dir}/end2end.engine

🎊 如果模型顺利导出,你将会看到样例图片上的检测结果:

convert_models

高级设置

如果需要使用 TensorRT-FP16你可以通过修改以下配置开启

# in MMDeploy config
backend_config = dict(
    type='tensorrt',
    common_config=dict(
        fp16_mode=True  # 打开 fp16
    ))

🕹️ SDK 推理

要进行 Pipeline 推理,需要先用 MMDeploy 导出 SDK 版本的 det 和 pose 模型,只需要在参数中加上--dump-info

此处以 onnxruntime 的 cpu 模型为例,运行如下命令:

# RTMDet
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmdet/detection/detection_onnxruntime_dynamic.py \
    ../mmpose/projects/rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-ort/rtmdet-nano \
    --device cpu \
    --show \
    --dump-info   # 导出 sdk info

# RTMPose
# 输入模型路径可以是本地路径,也可以是下载链接。
python tools/deploy.py \
    configs/mmpose/pose-detection_simcc_onnxruntime_dynamic.py \
    ../mmpose/projects/rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \
    demo/resources/human-pose.jpg \
    --work-dir rtmpose-ort/rtmpose-m \
    --device cpu \
    --show \
    --dump-info  # 导出 sdk info

默认会导出三个 json 文件:

|----sdk
     |----end2end.onnx    # ONNX model
     |----end2end.engine  # TensorRT engine file

     |----pipeline.json   #
     |----deploy.json     # json files for the SDK
     |----detail.json     #

Python API

# Copyright (c) OpenMMLab. All rights reserved.
import argparse

import cv2
import numpy as np
from mmdeploy_runtime import PoseDetector

def parse_args():
    parser = argparse.ArgumentParser(
        description='show how to use sdk python api')
    parser.add_argument('device_name', help='name of device, cuda or cpu')
    parser.add_argument(
        'model_path',
        help='path of mmdeploy SDK model dumped by model converter')
    parser.add_argument('image_path', help='path of an image')
    parser.add_argument(
        '--bbox',
        default=None,
        nargs='+',
        type=int,
        help='bounding box of an object in format (x, y, w, h)')
    args = parser.parse_args()
    return args

def main():
    args = parse_args()

    img = cv2.imread(args.image_path)

    detector = PoseDetector(
        model_path=args.model_path, device_name=args.device_name, device_id=0)

    if args.bbox is None:
        result = detector(img)
    else:
        # converter (x, y, w, h) -> (left, top, right, bottom)
        print(args.bbox)
        bbox = np.array(args.bbox, dtype=int)
        bbox[2:] += bbox[:2]
        result = detector(img, bbox)
    print(result)

    _, point_num, _ = result.shape
    points = result[:, :, :2].reshape(point_num, 2)
    for [x, y] in points.astype(int):
        cv2.circle(img, (x, y), 1, (0, 255, 0), 2)

    cv2.imwrite('output_pose.png', img)

if __name__ == '__main__':
    main()

C++ API

#include "mmdeploy/pose_detector.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "utils/argparse.h" // See: https://github.com/open-mmlab/mmdeploy/blob/main/demo/csrc/cpp/utils/argparse.h

DEFINE_ARG_string(model_path, "Model path");
DEFINE_ARG_string(image_path, "Input image path");
DEFINE_string(device_name, "cpu", R"(Device name, e.g. "cpu", "cuda")");
DEFINE_int32(bbox_x, -1, R"(x position of the bounding box)");
DEFINE_int32(bbox_y, -1, R"(y position of the bounding box)");
DEFINE_int32(bbox_w, -1, R"(width of the bounding box)");
DEFINE_int32(bbox_h, -1, R"(height of the bounding box)");

int main(int argc, char* argv[]) {
  if (!utils::ParseArguments(argc, argv)) {
    return -1;
  }

  cv::Mat img = cv::imread(ARGS_image_path);

  mmdeploy::PoseDetector detector(mmdeploy::Model{ARGS_model_path}, mmdeploy::Device{FLAGS_device_name, 0});

  mmdeploy::PoseDetector::Result result{0, 0, nullptr};

  if (FLAGS_bbox_x == -1 || FLAGS_bbox_y == -1 || FLAGS_bbox_w == -1 || FLAGS_bbox_h == -1) {
    result = detector.Apply(img);
  } else {
    // convert (x, y, w, h) -> (left, top, right, bottom)
    mmdeploy::cxx::Rect rect;
    rect.left = FLAGS_bbox_x;
    rect.top = FLAGS_bbox_y;
    rect.right = FLAGS_bbox_x + FLAGS_bbox_w;
    rect.bottom = FLAGS_bbox_y + FLAGS_bbox_h;
    result = detector.Apply(img, {rect});
  }

  // Draw circles at detected keypoints
  for (size_t i = 0; i < result[0].length; ++i) {
    cv::Point keypoint(result[0].point[i].x, result[0].point[i].y);
    cv::circle(img, keypoint, 1, cv::Scalar(0, 255, 0), 2);  // Draw filled circle
  }

  // Save the output image
  cv::imwrite("output_pose.png", img);

  return 0;
}

对于 C++ API 示例,请将 MMDeploy 加入到 CMake 项目中:

find_package(MMDeploy REQUIRED)
target_link_libraries(${name} PRIVATE mmdeploy ${OpenCV_LIBS})

其他语言

🚀 Pipeline 推理

图片推理

如果用户有跟随 MMDeploy 安装教程进行正确编译,在 mmdeploy/build/bin/ 路径下会看到 det_pose 的可执行文件。

# 前往 mmdeploy 目录
cd ${PATH_TO_MMDEPLOY}/build/bin/

# 单张图片推理
./det_pose rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_img.jpg --device cpu

required arguments:
  det_model           Detection 模型路径 [string]
  pose_model          Pose 模型路径 [string]
  image               输入图片路径 [string]

optional arguments:
  --device            推理设备 "cpu", "cuda" [string = "cpu"]
  --output            导出图片路径 [string = "det_pose_output.jpg"]
  --skeleton          骨架定义文件路径,或使用预定义骨架:
                      "coco" [string = "coco", "coco-wholoebody"]
  --det_label         用于姿势估计的检测标签 [int32 = 0]
                      (0 在 coco 中对应 person)
  --det_thr           检测分数阈值 [double = 0.5]
  --det_min_bbox_size 最小检测框大小 [double = -1]
  --pose_thr          关键点置信度阈值 [double = 0]

API 示例

- det_pose.py

- det_pose.cxx

视频推理

如果用户有跟随 MMDeploy 安装教程进行正确编译,在 mmdeploy/build/bin/ 路径下会看到 pose_tracker 的可执行文件。

  • input 输入 0 可以使用摄像头推理
# 前往 mmdeploy 目录
cd ${PATH_TO_MMDEPLOY}/build/bin/

# 视频推理
./pose_tracker rtmpose-ort/rtmdet-nano/ rtmpose-ort/rtmpose-m/ your_video.mp4 --device cpu

required arguments:
  det_model             Detection 模型路径 [string]
  pose_model            Pose 模型路径 [string]
  input                 输入图片路径或摄像头序号 [string]

optional arguments:
  --device              推理设备 "cpu", "cuda" [string = "cpu"]
  --output              导出视频路径 [string = ""]
  --output_size         输出视频帧的长边 [int32 = 0]
  --flip                设置为1用于水平翻转输入 [int32 = 0]
  --show                使用`cv::imshow`时,传递给`cv::waitKey`的延迟;
                        -1: 关闭 [int32 = 1]
  --skeleton            骨架数据的路径或预定义骨架的名称:
                        "coco", "coco-wholebody" [string = "coco"]
  --background          导出视频背景颜色, "default": 原图, "black":
                        纯黑背景 [string = "default"]
  --det_interval        检测间隔 [int32 = 1]
  --det_label           用于姿势估计的检测标签 [int32 = 0]
                        (0 在 coco 中对应 person)
  --det_thr             检测分数阈值 [double = 0.5]
  --det_min_bbox_size   最小检测框大小 [double = -1]
  --det_nms_thr         NMS IOU阈值用于合并检测到的bboxes和
                        追踪到的目标的 bboxes [double = 0.7]
  --pose_max_num_bboxes 每一帧用于姿势估计的 bboxes 的最大数量
                        [int32 = -1]
  --pose_kpt_thr        可见关键点的阈值 [double = 0.5]
  --pose_min_keypoints  有效姿势的最小关键点数量,-1表示上限(n_kpts/2) [int32 = -1]
  --pose_bbox_scale     将关键点扩展到 bbox 的比例 [double = 1.25]
  --pose_min_bbox_size  最小追踪尺寸,尺寸小于阈值的 bbox 将被剔除 [double = -1]
  --pose_nms_thr        用于抑制重叠姿势的 NMS OKS/IOU阈值。
                        当多个姿态估计重叠到同一目标时非常有用 [double = 0.5]
  --track_iou_thr       追踪 IOU 阈值 [double = 0.4]
  --track_max_missing   最大追踪容错 [int32 = 10]

API 示例

- pose_tracker.py

- pose_tracker.cxx

📚 常用功能 🔝

🚀 模型测速 🔝

如果需要测试模型在部署框架下的推理速度MMDeploy 提供了方便的 tools/profiler.py 脚本。

用户需要准备一个存放测试图片的文件夹./test_imagesprofiler 将随机从该目录下抽取图片用于模型测速。

python tools/profiler.py \
    configs/mmpose/pose-detection_simcc_onnxruntime_dynamic.py \
    {RTMPOSE_PROJECT}/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    ../test_images \
    --model {WORK_DIR}/end2end.onnx \
    --shape 256x192 \
    --device cpu \
    --warmup 50 \
    --num-iter 200

测试结果如下:

01/30 15:06:35 - mmengine - INFO - [onnxruntime]-70 times per count: 8.73 ms, 114.50 FPS
01/30 15:06:36 - mmengine - INFO - [onnxruntime]-90 times per count: 9.05 ms, 110.48 FPS
01/30 15:06:37 - mmengine - INFO - [onnxruntime]-110 times per count: 9.87 ms, 101.32 FPS
01/30 15:06:37 - mmengine - INFO - [onnxruntime]-130 times per count: 9.99 ms, 100.10 FPS
01/30 15:06:38 - mmengine - INFO - [onnxruntime]-150 times per count: 10.39 ms, 96.29 FPS
01/30 15:06:39 - mmengine - INFO - [onnxruntime]-170 times per count: 10.77 ms, 92.86 FPS
01/30 15:06:40 - mmengine - INFO - [onnxruntime]-190 times per count: 10.98 ms, 91.05 FPS
01/30 15:06:40 - mmengine - INFO - [onnxruntime]-210 times per count: 11.19 ms, 89.33 FPS
01/30 15:06:41 - mmengine - INFO - [onnxruntime]-230 times per count: 11.16 ms, 89.58 FPS
01/30 15:06:42 - mmengine - INFO - [onnxruntime]-250 times per count: 11.06 ms, 90.41 FPS
----- Settings:
+------------+---------+
| batch size |    1    |
|   shape    | 256x192 |
| iterations |   200   |
|   warmup   |    50   |
+------------+---------+
----- Results:
+--------+------------+---------+
| Stats  | Latency/ms |   FPS   |
+--------+------------+---------+
|  Mean  |   11.060   |  90.412 |
| Median |   11.852   |  84.375 |
|  Min   |   7.812    | 128.007 |
|  Max   |   13.690   |  73.044 |
+--------+------------+---------+

如果你希望详细了解 profiler 的更多参数设置与功能,可以前往 Profiler Docs

📊 精度验证 🔝

如果需要测试模型在部署框架下的推理精度MMDeploy 提供了方便的 tools/test.py 脚本。

python tools/test.py \
    configs/mmpose/pose-detection_simcc_onnxruntime_dynamic.py \
    {RTMPOSE_PROJECT}/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \
    --model {PATH_TO_MODEL}/rtmpose_m.pth \
    --device cpu

详细内容请参考 MMDeploys Docs

📜 引用 🔝

如果您觉得 RTMPose 对您的研究工作有所帮助,请考虑引用它:

@misc{https://doi.org/10.48550/arxiv.2303.07399,
  doi = {10.48550/ARXIV.2303.07399},
  url = {https://arxiv.org/abs/2303.07399},
  author = {Jiang, Tao and Lu, Peng and Zhang, Li and Ma, Ningsheng and Han, Rui and Lyu, Chengqi and Li, Yining and Chen, Kai},
  keywords = {Computer Vision and Pattern Recognition (cs.CV), FOS: Computer and information sciences, FOS: Computer and information sciences},
  title = {RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose},
  publisher = {arXiv},
  year = {2023},
  copyright = {Creative Commons Attribution 4.0 International}
}

@misc{mmpose2020,
    title={OpenMMLab Pose Estimation Toolbox and Benchmark},
    author={MMPose Contributors},
    howpublished = {\url{https://github.com/open-mmlab/mmpose}},
    year={2020}
}