我的开源项目 – 使用OnnxRuntime在CPU端部署RTMPose玩转实时2D姿态估计
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姿态估计的性能。
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:我的开源项目 – 使用OnnxRuntime在CPU端部署RTMPose玩转实时2D姿态估计
原文链接:https://www.stubbornhuang.com/2599/
发布于:2023年04月28日 15:50:20
修改于:2023年04月28日 16:04:21
当前分类随机文章推荐
- 计算几何与计算机图形学必读书单整理 阅读23134次,点赞20次
- 我的开源项目 - 3DPoseEstimation从2D视频中估计人物三维姿势,并生成BVH文件 阅读13246次,点赞32次
- Mediapipe - 将Mediapipe handtracking封装成动态链接库dll/so,实现在桌面应用中嵌入手势识别功能 阅读11549次,点赞23次
- 我的项目 - Windows/Linux动态库加载类 阅读3589次,点赞0次
- 我的开源项目 - 支持C++11特性的定时器TinyTimer 阅读4646次,点赞0次
- 我的开源项目 - 使用OnnxRuntime在CPU端部署RTMPose玩转实时2D姿态估计 阅读851次,点赞1次
- 我的开源项目 - 各种搜索引擎收录查询接口(Google/百度/必应/360/搜狗......) 阅读4664次,点赞3次
全站随机文章推荐
- 最近Chrome浏览器内置的Google翻译不可用的解决方法 阅读624次,点赞0次
- WordPress - 获取某个用户发表的评论数量 阅读2171次,点赞0次
- WordPress - 在编辑文章发布时弹出是否发布提醒框 阅读3481次,点赞0次
- Pytorch - torch.stack参数详解与使用 阅读1176次,点赞0次
- FFmpeg - 音频处理基本概念以及音频重采样(采样率转换) 阅读6089次,点赞0次
- C++ - 获取当前进程内存使用情况 阅读10614次,点赞10次
- C++ - 使用cuda api获取本机显卡数量和显卡信息 阅读458次,点赞0次
- Python – 解决opencv-python使用cv2.imwrite()保存中文路径图片失败的问题 阅读2298次,点赞0次
- 资源分享 - 游戏物理引擎开发, Game Physics Engine Development 中文版PDF下载 阅读2533次,点赞0次
- 工具网站推荐 - 最好的8个免费下载Pbr贴图和材质的网站 阅读4524次,点赞2次
评论
169