我的开源项目 - 使用OnnxRuntime在CPU端部署RTMPose玩转实时2D姿态估计

news/2024/12/29 8:17:32/

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姿态估计的性能。

感兴趣可以访问我的个人站:https://www.stubbornhuang.com/


http://www.ppmy.cn/news/55904.html

相关文章

mysql 8 转达梦8 处理总结

环境: mysql 8.0 达梦免费版本 8.1.128_ent_x86_64_ctm_pack4 1.大小写敏感的配置 初始化实例时 设置的兼容模式 要兼容mysql 字符编码 2.函数的区别 if 需要转换 find_in_set 需要重新自定义 ipv4, ipv6的处理函数 需要重新自定义 order by大字段问题 group by 大字段问题…

快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会

4月26日至4月28日,第三届武汉国际安全应急博览会(后简称“应博会”)在湖北武汉顺利举办。本次展会,大势智慧以实时三维重建能力为核心,提供各类应急场景的技术支撑,助力应急处置和救援等方面的应用。 展会…

Spring Bean作用域与生命周期

目录 Bean的作用域: Bean有六大行为模式 1、singleton:单例模式(默认) 2、prototype: 原型模式(多例模式) 3、request: 请求作用域(Spring MVC) 4、session: 会话作用域(Spring MVC) 5、application: 全局作用域(Spring MVC) 6、websocket: HTTP WebSocket …

oracle 19创建用户时出现“ORA-65096: invalid common user or role name”的错误

ORACLE 19命令 版本:Version 19.3.0.0.0 一、ORACLE 19创建用户命令 1、切换到oracle用户 [rootoracledb ~]# su - oracle Last login: Tue Jun 1 01:48:10 PDT 2021 on pts/5 2、以dba身份进入sql语句 [oracleoracledb ~]$ sqlplus "/as sysdba" …

FPGA入门系列12--RAM的使用

文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…

【WAF】雷池waf升级体验

文章目录 前言一、更新二、功能体验1.仪表板2.自定义规则:3. 通用配置: 更新总结新增优化: 前言 最近雷池有比较大的更新,安装可以参考以前文章雷池waf安装,更新了数据统计也就是仪表板和自定义规则和通用配置还有IP高…

vue 面试题(中级题库)

简单难度(20%): 一、.什么是CSS盒模型?简要描述它的组成部分。 1.盒模型:就是把HTML页面中的元素看作是以一个矩形的盒子,也就是一个装东西的容器。 2.盒模型包含四部分:内容(conte…