MMSegmentation笔记07:使用MMDeploy部署

2023-11-18

1. 安装MMDeploy

  • 首先要安装MMDeploy库,直接在对应环境下执行命令:pip install mmdeploy==1.2.0

  • 然后在对应项目下安装MMDeploy源码:在cmd中执行:git clone https://github.com/open-mmlab/mmdeploy.git

  • 然后在Python中验证是否安装成功:

import mmdeploy
print('MMDeploy 版本', mmdeploy.__version__)

2. 转换中间格式

有两种方式:

一种是直接用OpenMMLab提供的在线转换工具

而是用源码中的tools/deploy.py文件在命令行中执行转换

python tools/deploy.py \
        configs/mmseg/segmentation_onnxruntime_dynamic.py \
        ../mmsegmentation/Zihao-Configs/ZihaoDataset_FastSCNN_20230818.py \
        ../mmsegmentation/checkpoint/Zihao_FastSCNN.pth \
        ../mmsegmentation/data/watermelon_test1.jpg \
        --work-dir mmseg2onnx_fastscnn \
        --dump-info

转换完成后,会在mmseg2onnx_fastscnn文件夹下生成一系列文件

  • deploy.json:模型描述,用于MMDeploy Runtime推理

  • detail.json:模型转ONNX的信息,用于追溯bug

  • end2end.onnx:ONNX模型

  • output_onnxruntime_0.png:使用推理框架预测的结果

  • output_pytorch_0.png:使用pytorch预测的结果

  • pipeline.json:模型输入、预处理、推理、后处理,每一步骤的输入输出信息,用于给使用者说明处理流程

3. 部署推理测试

  1. 安装onnxruntime包

  2. 图像预处理

  3. 执行推理

本节的代码如下:

"""
==========================================
@author: Seaton
@Time: 2023/8/21:16:33
@IDE: PyCharm
@Summary:使用onnx格式推理
==========================================
"""
import numpy as np

import mmdeploy
import onnxruntime as ort
import cv2, torch
import matplotlib.pyplot as plt

# print('ONNXRuntime 版本', ort.__version__)
# print("MMDeploy 版本", mmdeploy.__version__)
onnx_path = 'mmdeploy/mmseg2onnx_fastscnn/end2end.onnx'
ort_session = ort.InferenceSession(onnx_path, provider=['CUDAExecutionProvider', 'CPUExecutionProvider'])

# 随机值预测
# x = torch.randn(1, 3, 1024, 2048).numpy()
# print(x.shape)
# ort_inputs = {'input': x}
# ort_output = ort_session.run(['output'], ort_inputs)[0]
# print(ort_output.shape)

# 真实图像预测
img_path = 'mmsegmentation/Watermelon87_Semantic_Seg_Mask/img_dir/val/dua-hau-1.jpg'
img_bgr = cv2.imread(img_path)
print(img_bgr.shape)
# 从原图中裁剪出宽高2:1的图像
h, w = img_bgr.shape[0], img_bgr.shape[1]
center_x, center_y = w // 2, h // 2
ratio = 3
new_h = 100 * ratio
new_w = 200 * ratio
img_bgr_crop = img_bgr[int(center_y-new_h/2):int(center_y+new_h/2), int(center_x - new_w/2):int(center_x + new_w/2)]
print(img_bgr_crop.shape)
img_bgr_resize = cv2.resize(img_bgr_crop, (2048, 1024))

# 预处理
img_tensor = img_bgr_resize
mean = (123.675, 116.28, 103.53)
std = (58.395, 57.12, 57.375)
img_tensor = (img_tensor - mean) / std
img_tensor = img_tensor.astype('float32')
img_tensor = cv2.cvtColor(img_tensor, cv2.COLOR_BGR2RGB)
img_tensor = np.transpose(img_tensor, (2, 0, 1))
input_tensor = np.expand_dims(img_tensor, axis=0)
print(input_tensor.shape)

# ONNX 预测
ort_inputs = {'input': input_tensor}
ort_output = ort_session.run(['output'], ort_inputs)[0]
pred_mask = ort_output[0][0]
# plt.imshow(pred_mask)
# plt.show()
palette = [
    ['background', [127, 127, 127]],
    ['red', [0, 0, 200]],
    ['green', [0, 200, 0]],
    ['white', [144, 238, 144]],
    ['seed-black', [30, 30, 30]],
    ['seed-white', [8, 189, 251]]
]

palette_dict = {}
for idx, each in enumerate(palette):
    palette_dict[idx] = each[1]

opacity = 0.3  # 透明度,越大越接近原图
# 将预测的整数ID,映射为对应类别的颜色
pred_mask_bgr = np.zeros((pred_mask.shape[0], pred_mask.shape[1], 3))
for idx in palette_dict.keys():
    pred_mask_bgr[np.where(pred_mask == idx)] = palette_dict[idx]
pred_mask_bgr = pred_mask_bgr.astype('uint8')
# 将语义分割预测图和原图叠加显示
img_bgr = cv2.addWeighted(img_bgr_resize, opacity, pred_mask_bgr, 1 - opacity, 0)
plt.imshow(img_bgr)
plt.show()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MMSegmentation笔记07:使用MMDeploy部署 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行
  • SDIO 驱动

    原文地址 http blog csdn net fengyuyaoye1980 article details 6859343 SDIO卡 SDIO卡是在SD内存卡接口的基础上发展起来的接口 SDIO接口兼容以前的SD内存卡 并且可以连接S
  • 期货开户的时间和流程

    对于一些想要做期货投资的朋友来说 最基本的就是首先要进行期货开户 那就需要了解开户具体的流程和相关注意事项 一般来说了解清楚一下三点就没什么问题了 一 对开户者本人的要求 1 年满18周岁 2 中国公民 有中国公民身份证 境内储蓄卡 3 没
  • pywinauto和PyUserInput实现windows程序自动化

    一 pywinauto 官方文档 https pywinauto readthedocs io en latest code code html 首先需要下个spy lite 便于查看程序窗口属性 主要模块 pywinauto applic
  • 通过jdbc实现GBase 8s Row类型数据插入与查询

    Row数据类型 由一个或多个任意的数据类型组成 例如 创建一个r1 t的Row数据类型 具有integer类型的i和boolean类型的b字段 参考语句如下 CREATE ROW TYPE r1 t i int b boolean 本文章详
  • Flutter:bottomNavigationBar图标白色的解决办法

    Flutter中 如果底部的Item超过三个 我们就需要为BottomNavigationBar设置一个type属性为 BottomNavigationBarType fixed 否则图标就会变成白色 导致什么都看不见
  • 设计模式之【观察者模式】

    观察者模式动机与定义 模式动机 一个对象的状态改变会引起其他对象的状态改变 模式定义 观察者模式 Observer Pattern 定义 定义对象间一种一对多的依赖关系 使得每当一个对象状态发生改变时 其相关依赖对象皆得到通知并被自动更新
  • few-shot learning, zero-shot learning, one-shot learning,any-shot learning, C-way K-shot,Meta-learn

    更新 2021 7 6 元学习 meta learning 与机器学习 machine learning machie learning 通常是单任务学习 每个任务有训练集和测试集 在训练集上训练模型 在测试集上测试模型 meta lear
  • 年底裸辞准备面试,我用7张图画了ZK分布式锁!

    一 写在前面 之前写过一篇文章 都2022年了 出去面试连分布式锁的源码你都不会画 给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的 这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理 同理 我是直接基于
  • Python opencv学习-12 2D直方图绘制

    绘制2D直方图 要转换到hsv色彩空间 import cv2 import numpy as np from matplotlib import pyplot as plt img cv2 imread image pic2 png hsv
  • C++多线程:创建线程

    C 中线程的创建一般是通过std thread类实现的 具体的实现方式有以下几种 1 使用函数名创建 void pcreat int a cout lt lt start lt lt a lt lt endl int main thread
  • advisor2002仿真参数界面grade options不弹出设定窗口

    针对这种问题 解决办法如下 第一步 找到advisor2002安装路径 然后找到 advisor2002 gui gradefig m文件和gradefig mat文件 把gradefig m文件名改为GradeFig m再把gradefi
  • AD账号导入--dsadd user

    Microsoft Windows AD账号全命令方式操作 导入一 AD 叫active directory 中文活动目录 其实是一个数据库 下面将介绍以数据库方式操作AD 对象二 AD对象操作有如下 1 新建一个对象 用 dsadd
  • windows如何查看最近打开的文件及文件夹?

    按住win R快捷键 输入recent 即可看到最近打开的文件
  • C语言的每日一题(一)

    前言 今天开始 我将开启我的每日一题之路 作者 一颗带有痣的毛 期待你的关注 一 三位数反转 题目 输入一个三位数 分离出它的百位 十位和个位 反转后输入 样例输入 127 样例输出 721 首先我们来分析一下这一题的思路 这一题的主要思路
  • 九鼎Study210嵌入式开发板刷机笔记

    本刷机笔记是基于S5PV210的九鼎Study210嵌入式开发板 准备 电脑通过串口线连接到开发板的UART2 靠近电源 与裸机不同 usb线连接到开发板OTG端口 开发板接入电源 串口助手打开 开机 只要连接成功 无论开发板是否启动了ub
  • Android系统控件使用的踩坑日志

    1 ListView在乐视 三星手机上出现崩溃 修复listview在部分手机上崩溃 java lang IndexOutOfBoundsException Invalid index 0 size is 0 at java util Ar
  • 【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】

    文章目录 ARM64 无符号位域提取指令 上篇文章 ARM 常见汇编指令学习 2 存储指令 STP 与 LDP 下篇文章 ARM 常见汇编指令学习 4 ARM64 比较指令 cbnz 与 b ne 区别 ARM64 无符号位域提取指令 在代
  • 图片上传提交前,图片显示在页面上

    lt div class upload box gt lt b gt 上传图片 lt input type file name file id file accept image onchange imgChange this gt lt
  • MMSegmentation笔记07:使用MMDeploy部署

    1 安装MMDeploy 首先要安装MMDeploy库 直接在对应环境下执行命令 pip install mmdeploy 1 2 0 然后在对应项目下安装MMDeploy源码 在cmd中执行 git clone https github