当前位置: 首页 > news >正文

【mmdeploy】【TODO】使用mmdeploy将mmdetection模型转tensorrt

mmdetection转换

文章目录

  • mmdetection转换
    • mmdetection 自带转换ONNX——无法测试
    • 使用mmdeploy(0.6.0)
      • 使用mmdeploy转onnx
      • 使用mmdeploy直接转tensorRT
        • 调试记录


先上结论:作者最后是转tensorrt的小图才成功的,大图一直不行。文章仅作者自我记录使用,请谨慎参考。
部分版本可参考作者的上篇文章《【mmdeploy】mmdeploy安装(linux + windows)》

  • mmdetection-2.22.0 自带转 onnx 无法测试(MMCVDeformConv2d ),issue中也说明要转mmdeploy
  • mmdeploy的onnx同样无法测试
  • mmdeploy整图转tensorRT结果有问题

mmdetection 自带转换ONNX——无法测试

一开始参考官方文档TUTORIAL 8: PYTORCH TO ONNX的教程来进行:

CUDA_VISIBLE_DEVICES=0 python -u tools/deployment/pytorch2onnx.py \work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/zjw_final_skin_config.py \work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \--output-file work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/dcn_mask_rcnn_nwd.onnx \--input-img /home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--test-img /home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--shape 3448 4600 \
#     --show \
#     --verify \--dynamic-export \
#     --cfg-options \
#       model.test_cfg.deploy_nms_pre=-1 \
#     > work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/pytorch2onnx.log

原项目是版本是2.14.0,在转换添加了DCN的Mask R-CNN模型时出现问题:

RuntimeError: DeformConv is not implemented on CPU

到mmdetection的issus中搜索,mmdetection/issues/6047可知是mmcv的版本不够。刚好有个之前安装的2.22.0版本。但采用官方文档中的命令会在经过pytorch2onnx函数的torch.onnx.export(...)调用时直接被Kill,没有错误信息。

把以上的命令修改一下,精简为:

CUDA_VISIBLE_DEVICES=0 python -u tools/deployment/pytorch2onnx.py \work_dirs/train_skin_220416_maskrcnn/20220417_124418/skin_config_whole.py \work_dirs/train_skin_220416_maskrcnn/20220417_124418/epoch_14.pth \--output-file work_dirs/train_skin_220416_maskrcnn/20220417_124418/dcn_mask_rcnn.onnx \--shape 3448 4600 \

能够输出一个onnx文件,但是使用官方文档后续的onnx eval命令还是会报错:

Fatal error: MMCVDeformConv2d is not a registered function/op

这个时候搜到的一篇博客《Exporting MMDetection models to ONNX format》说可以用openvinotoolkit/mmdetection,但我简单看了一下,并没有用。而在mmdetection的issues中搜索该报错信息,都建议使用mmdeploy。

使用mmdeploy(0.6.0)

在安装mmdeploy的基础上,参考文档,还需要安装mmdet库(可能是商汤自己封装的,所以用不了自己定义的方法)。


# 克隆 mmdetection 仓库。转换时,需要使用 mmdetection 仓库中的模型配置文件,构建 PyTorch nn module
python -m pip install mmdet==2.24.0
# git clone https://github.com/open-mmlab/mmdetection.git
export MMDET_DIR=$(pwd)/mmdetection# 下载 Faster R-CNN 模型权重
export CHECKPOINT_DIR=$(pwd)/checkpoints
wget -P ${CHECKPOINT_DIR} https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth# 设置工作路径
export WORK_DIR=$(pwd)/mmdeploy_models/faster-rcnn# 执行转换命令,实现端到端的转换
python ${MMDEPLOY_DIR}/tools/deploy.py \${MMDEPLOY_DIR}/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \${MMDET_DIR}/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \${CHECKPOINT_DIR}/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \${MMDET_DIR}/demo/demo.jpg \--work-dir ${WORK_DIR} \--device cuda:0 \--dump-info

使用mmdeploy转onnx

其中要把配置文件的test处理流程中的Resize行注释掉(经过测试发现mmdetection中似乎把它注释了也没什么问题)(220723:不对,还是会出问题,有待考量),否则其会专门处理一下。实际最终命令:

python -u tools/deploy.py \configs/mmdet/detection/detection_onnxruntime_dynamic.py \work_dirs/deploy_220721_dcn_mask_rcnn_nwd/zjw_final_skin_config.py \../mmdetection-2.22.0/work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \/home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--work-dir work_dirs/deploy_220721_dcn_mask_rcnn_nwd \--device cuda:0 \--dump-info

报错:

KeyError: "MaskRCNN: 'RPNHeadNwd is not in the models registry'"

又看了下文档,参考文档MMDetection-install,可以用pip install -v -e .从本地编译mmdetection:

cd ../mmdetection-2.22.0   # 我的mmdet2.22.0本地文件
pip install -r requirements/build.txt
pip install -v -e .  # or "python setup.py develop"

其中由于报错改了一些代码:

File "/home/wangjy/research/mmdeploy/mmdeploy/codebase/mmdet/models/detectors/two_stage.py", line 58, in two_stage_detector__simple_testproposals, _ = self.rpn_head.simple_test_rpn(x, img_metas)
ValueError: not enough values to unpack (expected 2, got 1)

改为:

proposals = self.rpn_head.simple_test_rpn(x, img_metas)
File "/home/wangjy/research/mmdeploy/mmdeploy/codebase/mmdet/models/roi_heads/test_mixins.py", line 44, in bbox_test_mixin__simple_test_bboxesrois.shape[0], device=rois.device).float().view(-1, 1, 1).expand(
AttributeError: 'list' object has no attribute 'shape'

将上一行的rois = proposals改为rois = torch.stack(proposals)

最后报错,它要51个G,这谁顶得住???!!!

RuntimeError: CUDA out of memory. Tried to allocate 51.02 GiB (GPU 0; 23.70 GiB total capacity; 2.24 GiB already allocated; 14.99 GiB free; 3.57 GiB reserved in total by PyTorch)

发现了一些问题,基于mask rcnn的模型应该算实例分割,因而把上面的configs/mmdet/detection/detection_onnxruntime_dynamic.py换成了configs/mmdet/instance-seg/instance-seg_onnxruntime_dynamic.py可以成功生成。但进行eval的时候还是会报错:

onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 1 : FAIL : Load model from work_dirs/deploy_220721_dcn_mask_rcnn_nwd/onnx_dynamic/end2end.onnx failed:Fatal error: MMCVDeformConv2d is not a registered function/op

使用mmdeploy直接转tensorRT

由于mmdetection配置中的coco_instance.py还是不能去掉,而--dump-info参数所引发的逻辑要判断Resize中一定要有img_scale参数,只好注释掉mmdeploy/backend/sdk/export_info.py中的部分语句(该部分应该是仅用来配合--dump-info保存json文件),变为:

    if 'transforms' in pipeline[-1]:transforms = pipeline[-1]['transforms']transforms.insert(0, pipeline[0])# for transform in transforms:#    # 220723: tools/deploy.py 最终调用到这里,似乎只是为了保存一个pipline.json文件,那你费这个劲#    if transform['type'] == 'Resize':#        transform['size'] = pipeline[-1].img_scale[::-1]#        if 'img_scale' in transform:#           transform.pop('img_scale')

命令如下(可能需要注意tensorRT,或者说所有后端的静态static与动态dynamic的区别,这里先跑起来再说):

python -u tools/deploy.py \configs/mmdet/instance-seg/instance-seg_tensorrt_dynamic-320x320-1344x1344.py \work_dirs/deploy_220721_dcn_mask_rcnn_nwd/zjw_final_skin_config.py \../mmdetection-2.22.0/work_dirs/train_skin_220401_maskrcnn/zjw_skin_config_cfnwd3/epoch_12.pth \/home/wangjy/data/facedata_croped_1209/images/val_whole/CXM__何易霖_痤疮_20200904131918000_斑点.jpg \--work-dir work_dirs/deploy_220721_dcn_mask_rcnn_nwd/tensorrt_dynamic \--device cuda:1 \--dump-info

并且instance-seg_tensorrt_dynamic-320x320-1344x1344.py配置文件似乎一定需要三个shape,不能注释掉,因而采用以下三个shape进行替代,并且整图生成需要修改max_workspace_size。

_base_ = ['../_base_/base_instance-seg_dynamic.py','../../_base_/backends/tensorrt.py'
]backend_config = dict(# common_config=dict(max_workspace_size=1 << 30),common_config=dict(max_workspace_size=1 << 31),model_inputs=[dict(input_shapes=dict(input=dict(
#                     min_shape=[1, 3, 320, 320],
#                     opt_shape=[1, 3, 800, 1344],
#                     max_shape=[1, 3, 1344, 1344]min_shape=[1, 3, 4171, 3128],opt_shape=[1, 3, 4600, 3448],max_shape=[1, 3, 5184, 3456])))])

先别急,参考模型重载,需要重新复现RPNHeadNwd的get_boxes方法(这个其实仿照mmdeploy原有的rpn_head的get_boxes方法写即可),然后要注意上文onnx调试时修改的proposals, _ = self.rpn_head.simple_test_rpn(x, img_metas)rois = proposals的代码要改回来,似乎原来这个是适配的tensorRT流程。

注意tensorRT有topK的限制,topK操作不能超过3840(参考tensorrt-topKsetup),这个可能要想办法规避。并且deploy后的整图模型进行test的时候效果极差(几乎无了),而crop1024的数据就正常,不知道为啥。

在这里记录一下,对于dcn_mask_rcnn模型来说(mmdetection-2.22.0/work_dirs/train_skin_220416_maskrcnn/20220417_124418,val_crop1024的test AP50为0.496的最好模型),其在val_whole整图测试中的结果也记录在了issues/814中(有人问)。

调试记录

配置了pycharm远程连接进行调试,目前可知mmdeploy/tools/test.py的调用如下:

flowchart TDmmdeploy/tools/test.py --> mmdetection/mmdet/apis/test.py:single_gpu_test --> mmdeploy/mmdeploy/codebase/mmdet/deploy/object_detection_model.py:forward --> mmdeploy/mmdeploy/backend/tensorrt/wrapper.py:forward

outputs是在最后的wrapper.py:forward中得到的,但似乎无法查看模型的中间变量。

220801,看一下post_processing,结果要么就RuntimeError: CUDA error: an illegal memory access was encountered,要么就爆显存,以为是后处理参数改一点都不行?那改回来吧,还是爆,绝望。

相关文章:

【mmdeploy】【TODO】使用mmdeploy将mmdetection模型转tensorrt

mmdetection转换 文章目录 mmdetection转换mmdetection 自带转换ONNX——无法测试使用mmdeploy(0.6.0)使用mmdeploy转onnx使用mmdeploy直接转tensorRT调试记录 先上结论&#xff1a;作者最后是转tensorrt的小图才成功的&#xff0c;大图一直不行。文章仅作者自我记录使用&#…...

德赛西威上海车展重磅发布Smart Solution 2.0,有哪些革新点?

4月18日&#xff0c;全球瞩目的第二十届上海车展盛大启幕&#xff0c;作为国际领先的移动出行科技公司&#xff0c;德赛西威携智慧出行黑科技产品矩阵亮相&#xff0c;并以“智出行 共创享”为主题&#xff0c;重磅发布最新迭代的智慧出行解决方案——Smart Solution 2.0。 从…...

戴尔服务器是否需要开启cpupower.service

戴尔并不会默认开启cpupower.service&#xff0c;这取决于具体的操作系统和配置。cpupower.service是一个Linux系统服务&#xff0c;用于管理CPU的功耗和性能调节&#xff0c;可以通过调整CPU的频率和电源管理策略来降低能耗和温度。在某些情况下&#xff0c;开启cpupower.serv…...

day02_第一个Java程序

在开发第一个Java程序之前&#xff0c;我们必须对计算机的一些基础知识进行了解。 常用DOS命令 Java语言的初学者&#xff0c;学习一些DOS命令&#xff0c;会非常有帮助。DOS是一个早期的操作系统&#xff0c;现在已经被Windows系统取代&#xff0c;对于我们开发人员&#xf…...

【华为OD机试真题 】1011 - 第K个排列 (JAVA C++ Python JS) | 机试题+算法思路+考点+代码解析

文章目录 一、题目🔸题目描述🔸输入输出🔸样例1🔸样例2二、代码参考🔸C++代码🔸Java代码🔸Python代码🔸JS代码作者:KJ.JK🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🍂个人博客首页: KJ.JK 💖系列专栏:...

基于php的校园校园兼职网站的设计与实现

摘要 近年来&#xff0c;信息技术在大学校园中得到了广泛的应用&#xff0c;主要体现在两个方面&#xff1a;一是学校管理系统&#xff0c;包括教务管理、行政管理和分校管理&#xff0c;是我国大学管理和信息传递的主要渠道。二是学生生活服务平台。而随着大学生毕业人数的年…...

django部署

1. 配置服务器 安装django&#xff0c;python等服务–尽量和你的自己的配置相同&#xff0c;一摸一样避免出现问题 2.django项目迁移 sudo scp /home/tarena/django/mysitel root88.77.66.55:/home/root/xxx #然后输入密码3&#xff0c;用uWSGI 替代python manage.py runse…...

OpenCV 图像处理学习手册:1~5

原文&#xff1a;Learning Image Processing with OpenCV 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;…...

深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras

目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…...

Ceph入门到精通-Cephadm安装Ceph(v17.2.5 Quincy)全网最全版本

Deploy Ceph&#xff08;v17.2.5 Quincy&#xff09; cluster to use Cephadm - DevOps - dbaselife Install cephadm Cephadm creates a new Ceph cluster by “bootstrapping” on a single host, expanding the cluster to encompass any additional hosts, and then depl…...

BIOS与POST自检

一、什么是BIOS BIOS是英文"BasicInput-Output System"&#xff0c;中文名称就是"基本输入输出系统"&#xff0c;是集成在主板上的一个ROM芯片&#xff0c;意思是只读存储器基本输入输出系统。顾名思义&#xff0c;它保存着计算机最重要的基本输入输出的程…...

交友项目【查询好友动态,查询推荐动态】实现

目录 1&#xff1a;圈子 1.1&#xff1a;查询好友动态 1.1.1&#xff1a;接口分析 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;查询推荐动态 1.2.1&#xff1a;接口分析 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&#xff1a…...

24个强大的HTML属性,建议每位前端工程师都应该掌握!

HTML属性非常多&#xff0c;除了一些基础属性外&#xff0c;还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性&#xff0c;可以使您的网站更具有动态性和交互性&#xff0c;让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧&#xff01; 1、Acc…...

前端--移动端布局--2移动开发之flex布局

目标&#xff1a; 能够说出flex盒子的布局原理 能够使用flex布局的常用属性 能够独立完成携程移动端首页案例 目录&#xff1a; flex布局体验 flex布局原理 flex布局父项常见属性 flex布局子项常见属性 写出网首页案例制作 1.flex布局体验 1.1传统布局与flex布局 传…...

【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )

文章目录 一、移动端浏览器二、移动端屏幕分辨率三、移动端网页调试方法 一、移动端浏览器 移动端浏览器 比 PC 端浏览器发展要晚 , 使用的技术比较新 , 对 HTML5 CSS3 支持较好 , 常见的浏览器如下 : UC / QQ / Opera / Chrom / 360 / 百度 / 搜狗 / 猎豹 国内的浏览器 基本…...

无线洗地机哪款性价比高?高性价比的洗地机分享

虽说现在市面上清洁工具很多&#xff0c;但是要说清洁效果最好的&#xff0c;肯定非洗地机莫属。它集合了吸&#xff0c;洗&#xff0c;拖三大功能&#xff0c;干湿垃圾一次清理&#xff0c;还能根据地面的脏污程度进行清洁&#xff0c;达到极致的清洁效果&#xff0c;省时省力…...

精通 Python OpenCV4:第三、四部分

原文&#xff1a;Mastering OpenCV 4 with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最好真…...

在现成的3D打印机上进行实验理论:一种数据孪生的攻击探测框架

在现成的3D打印机上提供了一种DT中攻击探测框架的DT解决方案的实验演示&#xff0c;作为说明性CPMS资源。通过网络安全DT对打印机正常运行、异常运行和攻击三种情况下的实验数据进行收集和分析&#xff0c;得出攻击检测结果。实验装置概述如下图所示。该实验研究是在现实世界设…...

网络通信之传输层协议

文章目录 传输层在网络通信中扮演的角色认识TCP协议TCP协议的多种机制确认应答(ACK)机制超时重传机制连接管理机制&#x1f53a;滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常处理 总结 传输层在网络通信中扮演的角色 上图是网络通信中五个模块&#xff…...

短视频app开发:如何提高视频播放稳定性

简介 如今&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分&#xff0c;而短视频app的开发也日益成为了人们热议的话题。在短视频app开发的过程中&#xff0c;如何提高视频播放稳定性是一个非常重要的问题。本文将从短视频源码角度出发&#xff0c;分享提高短视频ap…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...