1 RTMPose

RTMPose论文地址:https://arxiv.org/abs/2303.07399

RTMPose是一种Top-Down范式的2D姿态估计框架,魔魔魔魔改Simcc,更加轻量化且更加有效,更加具有工业应用特质。

RTMPose的亮点主打的就是工业级别的推理速度和精度,这在他的论文摘要也是着重突出,可以仔细看他的论文摘要,

Recent studies on 2D pose estimation have achieved excellent performance on public benchmarks, yet its application in the industrial community still suffers from heavy model parameters and high latency. In order to bridge this gap, we empirically explore key factors in pose estimation including paradigm, model architecture, training strategy, and deployment, and present a high-performance real-time multi-person pose estimation framework, RTMPose, based on MMPose. Our RTMPose-m achieves 75.8% AP on COCO with 90+ FPS on an Intel i7-11700 CPU and 430+ FPS on an NVIDIA GTX 1660 Ti GPU, and RTMPose-l achieves 67.0% AP on COCO-WholeBody with 130+ FPS. To further evaluate RTMPose's capability in critical real-time applications, we also report the performance after deploying on the mobile device. Our RTMPose-s achieves 72.2% AP on COCO with 70+ FPS on a Snapdragon 865 chip, outperforming existing open-source libraries. Code and models are released at this https URL.

从论文摘要的介绍,RTMPose-m 模型在 COCO 上达到 75.8%AP 的同时,能在 Intel i7-11700 CPU 上用 ONNXRuntime 达到 90+FPS,在 NVIDIA GTX 1660 Ti GPU 上用 TensorRT 达到 430+FPS。RTMPose-s 以 72.2%AP 的性能,在手机端 Snapdragon865 芯片上用 ncnn 部署达到 70+FPS

这么强,我肯定要拥有啊!!!!

RTMPose已经集成到MMPose中,Github地址:https://github.com/open-mmlab/mmpose/tree/dev-1.x/projects/rtmpose

当时仔细看了一下RTMPose的README.md文档,其关于模型部署的教程深度依赖MMDeploy,而我个人认为深度集成MMDeploy会让人望而却步(当然这只是个人看法,勿喷),而我本身有比较多的本地部署和服务器部署模型的经验,所以在本文中我们不依赖MMDeploy,而是使用OnnxRuntime CPU C++ SDK对RTMDetnano+RTMPose-m导出的onnx模型进行本地CPU的部署。无需GPU,照样进行实时2D姿态估计,就我测试的老掉牙的i5-7400 4H也能实时,还不快冲啊!

这里也感谢RTMPose的作者镜佬(镜佬知乎主页)对我的这个例子的Pr的光速Merge。

2 使用OnnxRuntime在CPU端部署RTMDetnano+RTMPose

好了,在本小节中会详细介绍如何使用OnnxRuntime在CPU端进行RTMDetnano+RTMPose模型的部署,在本教程中会实现基于RTMDetnano+RTMPose的一个Top-Down的2D姿态估计示例,由RTMDetnano检测人,然后根据检测框裁剪相应的图片区域喂给RTMPose进行姿态估计,进行了一个简单的跳帧检测的实时2D姿态估计的C++类,好了,就让我们愉快的开始吧。

本文代码示例已开源:https://github.com/HW140701/RTMPose-Deploy,并且提供了预编译包,懒得编译的直接可以下载预编译包运行,当然你的Windows电脑上需要有VC runtime。感兴趣的佬可以小点一波star,感谢。

本文代码主要展示基于RTMDetnano+RTMPose的数据前后处理方式,大家感兴趣的可以借鉴。

本文示例代码已提交pr到MMPose dev1.x:https://github.com/open-mmlab/mmpose/pull/2316

2.1 下载Onnx模型、转换Onnx模型

从RTMPose的README.md 文档中找到提供的默认导出的onnx模型示例,下载地址为:

https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip

解压缩完成之后会看到RTMDetnano+RTMPose的onnx模型,名称为end2end.onnx。

不过这里的RTMPose是coco17数据集的17个人体关键点,如果你是需要其他的RTMPose onnx模型,请参照RTMPose的README.md 进行onnx模型导出。

然后目标检测器是用的RTMDetnano,当然你也可以使用其他的目标检测器,比如各种的YOOOOOOLOOOOO,个人认为目标检测器对后面姿态估计的影响很小,当然这个目标检测器不是智障检测器。

2.2 基于RTMDetnano+RTMPose实现一个Top-Down的2D姿态估计例子

2.2.1 基于RTMDetnano的目标检测

由于上述链接提供的RTMDetnano是在batch_size、image_height、image_width都具有动态维度,所以在实现的时候并没有固定输入图片的宽和高。

而用于输入图片归一化的image_mean和image_std的值来自于https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmpose-cpu.zip 压缩包里面各个模型对应的pipeline.json文件。

更加详细的可参考仓库代码。

在输入图片之后,经过推理,在本仓库会选择类别为0且置信度最大的检测框作为后面姿态估计需要检测的区域,也就是说目前本示例只是对图片中目标检测概率最大的人进行姿态估计,不过多人姿态估计扩展起来也比较简单,没有什么很大的任务量。

2.2.2 基于RTMPose的姿态估计

在目标检测完成之后,根据检测框和仿射变换将该检测框的区域进行裁剪,因为RTMPose需要的输入维度为1x3x256x192,然后将裁剪的图片经过预处理之后喂给RTMPose进行识别,得到17个关键点在256x192上的坐标,然后通过反仿射变换将坐标反算到原输入图片上,得到正确的坐标。

更加详细的可参考仓库代码。

2.2.3 实时视频流姿态估计:RTMPoseTracker

在RTMDetnano和RTMPoseTracker的推理类都构建完成之后,我们构建了一个简单的应对实时视频流检测的RTMPoseTracker,在RTMPoseTracker默认每10帧才进行一次目标检测,这样可以极大的降低单帧推理延时,以达到实时2D姿态估计的性能。