【mmdeploy】mmseg转ONNX/TensorRT

news2024/9/20 18:00:13

1.关于mmdeploy

    MMDeploy 是 OpenMMLab 模型部署工具箱,为各算法库提供统一的部署体验。基于 MMDeploy,开发者可以轻松从训练 repo 生成指定硬件所需 SDK,省去大量适配时间。MMDeploy 提供了一系列工具,帮助您更轻松的将 OpenMMLab 下的算法部署到各种设备与平台上。


 

2.环境安装

提示:不要使用mmseg工程里的deploy工具,建议使用openmmlab下的mmdeploy工程(血泪教训)。

既然是要推理部署,大概率是已经训练好模型了,基础的openmmlab环境包(mmsegmentation,mmcv-full......)应该已经安装过了,因此官网中的步骤(安装mmseg、mmcv)可以不用操作了,只需要激活本地的训练时的环境(比如:openmmlab),再安装缺少的包就可以了。

需要安装的包有:mmdeploy\onnx\tensorrt\pycuda。。。

预编译好的平台和设备如下,不在的请自行下载源码编译安装。

2.1预编译安装(Linux-x86_64, CUDA 11.x, TensorRT 8.2.3.0):

wget https://github.com/open-mmlab/mmdeploy/releases/download/v0.12.0/mmdeploy-0.12.0-linux-x86_64-cuda11.1-tensorrt8.2.3.0.tar.gz
tar -zxvf mmdeploy-0.12.0-linux-x86_64-cuda11.1-tensorrt8.2.3.0.tar.gz
cd mmdeploy-0.12.0-linux-x86_64-cuda11.1-tensorrt8.2.3.0
pip install dist/mmdeploy-0.12.0-py3-none-linux_x86_64.whl
pip install sdk/python/mmdeploy_python-0.12.0-cp38-none-linux_x86_64.whl
cd ..
# 安装推理引擎 TensorRT
# !!! 从 NVIDIA 官网下载 TensorRT-8.2.3.0 CUDA 11.x 安装包并解压到当前目录
pip install TensorRT-8.2.3.0/python/tensorrt-8.2.3.0-cp38-none-linux_x86_64.whl
pip install pycuda
export TENSORRT_DIR=$(pwd)/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=${TENSORRT_DIR}/lib:$LD_LIBRARY_PATH
# !!! 从 NVIDIA 官网下载 cuDNN 8.2.1 CUDA 11.x 安装包并解压到当前目录
export CUDNN_DIR=$(pwd)/cuda
export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH

 2.2预编译安装(Linux-x86_64, CUDA 11.x, ONNX):

wget https://github.com/open-mmlab/mmdeploy/releases/download/v0.12.0/mmdeploy-0.12.0-linux-x86_64-onnxruntime1.8.1.tar.gz
tar -zxvf mmdeploy-0.12.0-linux-x86_64-onnxruntime1.8.1.tar.gz
cd mmdeploy-0.12.0-linux-x86_64-onnxruntime1.8.1
pip install dist/mmdeploy-0.12.0-py3-none-linux_x86_64.whl
pip install sdk/python/mmdeploy_python-0.12.0-cp3X-none-linux_x86_64.whl  #注意自己python版本对应
cd ..
# 安装推理引擎 ONNX
pip install onnxruntime-gpu==1.8.1  #安装GPU版本
pip install onnxruntime==1.8.1       #安装CPU版本
 
wget https://github.com/microsoft/onnxruntime/releases/download/v1.8.1/onnxruntime-linux-x64-1.8.1.tgz
tar -zxvf onnxruntime-linux-x64-1.8.1.tgz
export ONNXRUNTIME_DIR=$(pwd)/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH

 

3.mmseg工程torch转onnx

在准备工作就绪后,我们可以使用 MMDeploy 中的工具 tools/deploy.py,将 OpenMMLab 的 PyTorch 模型转换成推理后端支持的格式。

python tools/deploy.py \
       $DEPLOY_CFG \
       $MODEL_CFG \
       $PTH_MODEL_PATH \
       --work-dir $OUT_PATH \
       --show --device cuda --dump-info

 

其中:

DEPLOY_PATH为mmdeploy工程下./mmedeploy/configs/mmseg/XXX.py的config文件路径

MODEL_CFG为自己训练时的config文件,一般在pth模型同目录下就有

PTH_MODEL_PATH为需要转的pth模型文件地址

OUT_PATH为输出的onnx模型文件地址和对应的json存放地址

python tools/deploy.py \
       /root/workspace/mmdeploy/configs/mmseg/segmentation_onnxruntime_dynamic.py \
       /root/workspace/mmseg/MMSEG_DEPLOY/uper_swin_base.py \
       /root/workspace/mmseg/MMSEG_DEPLOY/best_mIoU_epoch_500.pth \
       --work-dir /root/workspace/mmseg/MMSEG_DEPLOY/OUTPUT \
       --show --device cuda --dump-info

 

4.使用onnx模型文件进行推理

推理过程比较简单,可以自行花式修改

from mmdeploy.apis import inference_model
 
result = inference_model(model_cfg = 'data/project/mmseg/weights/ersi_uper_swin_base.py',
    deploy_cfg = '/data/project/mmdeploy-master/configs/mmseg/segmentation_onnxruntime_dynamic.py',
    backend_files = ['/data/project/end2end.onnx'],
    img ='in_img_path/xxx.png',
    device='cuda:0')

 

其中:

model_cfg为训练时的config文件

deploy_cfg为mmdeploy工程下的/configs/mmseg/XXX.py文件

backend_file为刚才转出来的onnx模型地址

img就是要推理的原始影像

注意:此处输出的result为list格式,如果需要保存结果的话,需要先转成numpy再取对应的维度,最后保存成影像格式。或者参考mmseg/tools/test.py的处理方法,把所有影像预测结果append到一个大的list中,最后依次保存。

pred = (np.array(result)[0,:,:]).astype(np.uint8)  #将result保存成一张影像
cv2.imwrite(out_img_path,pred)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端Vue入门-day06-路由进阶

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 路由的封装抽离 声明式导航 导航链接 两个类名 自定义高亮类名 跳转传参 1. 查询参数传参 2. 动态…

Mysql-学习笔记

文章目录 1. 数据库1.1 Mysql安装及常用代码1.2 SQL介绍1.3 SQL分类1. DDL-操作数据库,表2. DML-对表中的数据进行增删改3. DQL-对表中的数据进行查询条件查询模糊查询排序查询分组查询分页查询 4. DCL-对数据库进行权限控制外键约束表关系-多对多多表查询事务 1. 数…

netty chinaread 不执行 的总结

netty chinaedred 不执行 目录概述需求: 设计思路实现思路分析1.netty chinaedred 拓展实现性能参数测试: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness…

登月再进一步:Apollo自动驾驶的里程碑

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

某某儿科医院APP登陆与抢票分享

1. 背景 近期到了暑假,儿保的票是越来越难抢了。卡着点也不能刷得到,有天偶然打开发现某个热门门诊突然有一个票,然后就帮人挂到了。琢磨一下,这种不是秒杀的抢票,如果能把所有取消的捡漏刷到,其实问题也不…

【Leecode】交替合并字符串- join

题目 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 错误1 class Solution:def mergeAlternately(self, w…

微信小程序防盗链referer问题处理

公司使用百度云存储一些资源,然后现在要做防盗链,在CDN加入Referer白名单后发现PC是正常的,微信小程序无法正常访问资源了。然后是各种查啊,然后发现是微信小程序不支持Referer的修改,且在小程序开发工具是Referer是固…

想要对象吗?教你如何用C++new一个完美的对象(内存管理)

目录 一、C/C内存分布 1. 栈(Stack) 2. 堆(Heap) 3. 全局区/静态区(Global Area/Static Area) 4. 常量区(Constant Area) 5. 代码区(Code Area) 二、C…

智安网络|应对政务行业数字化转型中的数据隐私和网络攻击风险

政务数据共享安全咨询规划 每个政府部门面临的风险场景、合规要求都有所不同,因此首先需要通过数据安全咨询规划,完善数据安全制度规范,结合政务数据的实际业务需求,建立健全政务数据共享开放的全流程安全管理制度,明…

深度学习——注意力机制、自注意力机制

什么是注意力机制? 1.注意力机制的概念: 我们在听到一句话的时候,会不自觉的捕获关键信息,这种能力叫做注意力。 比如:“我吃了100个包子” 有的人会注意“我”,有的人会注意“100个”。 那么对于机器来说…

MySQL处理客户端请求

文章目录 一、连接管理二、解析与优化1、查询缓存2、语法解析3、查询优化 简单来说 MySQL 主要分为 Server 层和存储引擎层: Server 层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现&#xff0c…

【Shell】Shell编程之文本处理器——awk

sed可以对文本内容进行增删改查 主要使用的是改和查;查使用grep,正则表达式使用grep -E更好 awk是文本三剑客中最强大的文本工具; awk也是按行进行操作;对行操作完之后可以根据指定命令来取列 awk的分隔符:默认为 &…

Linux第七章之gdb与makefile使用

一、Linux调试器-gdb使用 1.1背景 程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项[重要] 1.2开始使用 …

爬虫原理详解及requests抓包工具用法介绍

文章目录 一、什么是爬虫?二、爬虫的分类三、网址的构成四、爬虫的基本步骤五、动态页面和静态页面六、伪装请求头七、requests库介绍1. 概念:2. 安装方式(使用镜像源):3. 基本使用:4. response对象对应的方…

一起学算法(数组篇)

1.概念: 1.顺序存储 顺序存储结构,是指用一段地址连续的存储单元来依次存储结构,如图所示,每个蓝色方块都对应了数组中的一个数据,数据有类型,例如:32位整型int、单精度浮点型float、双精度浮点…

你知道HTTP与HTTPS有什么区别吗?

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、什么是HTTP? 二、什么是HTTPS? 三、HTTPS 的工作原理 1、客户端发起 HTTPS 请求 2、服务端的配置 3、…

如何设计一个Android端高性能日志监控系统

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们…

5.类型推论,类型断言,类型兼容性

目录 1 类型推论 2 类型断言 2.1 类型推论所带来的问题 2.2 基本使用 2.3 不断言会出现的问题 2.4 断言的另一种写法 2.5 查看DOM元素的类型 3 类型兼容性 3.1 类兼容性 3.2 接口兼容性 3.2.1 接口之间的兼容性 3.2.2 接口与类之间的兼容性 3.3 函数…

C++ 类的静态成员

在结构化程序设计中程序模块的基本单位是函数,因此模块间对内存中数据的共享是通过函数与和函数之间的数据共享来实现的,其中包括两个途径——参数传递和全局变量。 面向对象的程序设计方法兼顾数据的共享和保护,将数据与操作数据的函数封装…