mmdeploy快速上手

2023-10-27

mmdeploy快速上手

若要将使用 openmmlab 的框架(如mmdet、mmcls)等训练的模型进行快速部署,同样来自 openmmlab 的 mmdeploy 无疑是最合适的选择,本文将简单地完成一个 Faster RCNN 模型的部署。

配置

本文基于如下软硬件配置:

CPU:x86-64 (any)

GPU:Nvidia (any)

OS: Ubuntu

环境与安装

为了方便,这里就不展开讲如何安装了,我们就直接使用 docker 环境来进行实验,需要在本机安装的同学可参考:安装mmdploy,或者直接参考 Dockerfile 中的步骤安装也是一样的。只要配置好相同的环境之后,后面的步骤都是一样的。

我们先拉 git 仓库,然后根据官方的 Dockerfile 来构建镜像:

git clone https://github.com/open-mmlab/mmdeploy.git
cd mmdeploy/docker/GPU
docker build . -t mmdeploy:test --build-arg  USE_SRC_INSIDE=true	# 使用阿里云的镜像安装镜像内的包

构建完成后,镜像内就已经安装好支持 ONNXRuntime 和 TensorRT 后端推理引擎和 mmdeploy 本身了。

准备检测模型

我们之前提到,本文将基于 mmdet 的 Faster RCNN 检测模型来进行部署,我们先准备好监测模型的配置文件和权重文件。

git clone https://github.com/open-mmlab/mmdetection.git
# 准备权重文件
mkdir mmdetection/checkpoints
wget https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth -P mmdetection/checkpoints

模型转换

因为之后会反复用到 mdeploy 和 mmdetection 中的内容,我们先设置 mmdeploy 和 mmdetection 的根目录地址为环境变量:

export MMDEPLOY_DIR=/your/path/to/mmdeploy
export MMDET_DIR=/your/path/to/mmdetection

接下来就可以开始进行模型转换了,我们根 Faster RCNN 的配置文件和刚刚下载好的权重文件来将模型转换为 onnx 和 tensorrt :

转换为 tensorrt

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 \
    ${MMDET_DIR}/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    ${MMDET_DIR}/demo/demo.jpg \
    --work-dir /tmp/fsr_trt \	# 这里笔者放在临时目录下了,大家按需选在放置的目录
    --device cuda:0 \			# 转换为trt格式,必须是在Nvidia GPU上
    --dump-info

转换为 onnx

python ${MMDEPLOY_DIR}/tools/deploy.py \
    ${MMDEPLOY_DIR}/configs/mmdet/detection/detection_onnxruntime_dynamic.py \
    ${MMDET_DIR}/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
    ${MMDET_DIR}/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
    ${MMDET_DIR}/demo/demo.jpg \
    --work-dir /tmp/fsr_ort \
    --device cpu \		# onnx我们用cpu来试一下
    --dump-info

之后我们会得到两个目录文件:/tmp/fsr_trt/tmp/fsr_ort ,我们看一下这个目录中有什么:

ls /tmp/fsr_trt/
# ...
# end2end.onnx
# end2end.engine
# ...

可以看到,end2end.engineend2end.onnx 就是模型文件,我们之后会用这个模型文件分别在 TensorRT 和 ONNXRuntime 两种后端上进行推理。为什么 TensorRT 的结果目录中也会有 end2end.onnx 文件呢,是因为通常由 torch 模型转换到 onnx 格式作为中转,再赚到 tensorrt。

模型推理

我们有多重进行模型推理的方式,分别是是通过 Python 的接口C++编译成的可执行文件

Python 接口

我们直接调用 mmdeploy 的 api 即可,这里我们用之前的到的 TensoRT 模型来实验:

from mmdeploy.apis import inference_model
import os
import os.path as osp

model_cfg = osp.join(os.getenv('MMDET_DIR'), 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py')
deploy_cfg = osp.join(os.getenv('MMDEPLOY_DIR'), '/configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py')
backend_files = ['/tmp/fsr_trt/end2end.engine']		# 注意这里传递的一定要是一个可迭代对象,比如列表
result = inference_model(model_cfg, deploy_cfg, backend_files, img=img, device=device)

需要注意的是 backend_files 需要接收的是一个可迭代对象,比如这里我们传的就是一个列表。当然了字符串在 Python 中也是可迭代对象,但是意义就完全错了,传进来的字符串会被遍历,就会得到类似如下这样的报错:

IsADirectoryError: [Errno 21] Is a directory: '/'

这就是将字符串去遍历,结果认为第一个符号 / 为目录了。

C++编译成的可执行文件

编译SDK

这里如果之前的环境配置使用的是 Dockerfile 构建的镜像,或者在手动配置环境方案中,在编译 MMDeploy 时开启 MMDEPLOY_BUILD_SDK 则, MMDeploy SDK是已经编译好的,即在 ${MMDEPLOY_DIR}/build/install/example 目录下有 object_detection 等一系列编译好的可执行文件,则可跳过这一小步:

cd ${MMDEPLOY_DIR}/build/install/example

# 配置ONNX Runtime库目录
export LD_LIBRARY_PATH=/path/to/onnxruntime/lib
mkdir -p build && cd build
cmake -DOpenCV_DIR=path/to/OpenCV/lib/cmake/OpenCV \
      -DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy ..
make object_detection

这之后我们可以直接运行可执行文件,指定模型文件和图像来进行推理,这里我们用 CPU 的 ONNXRuntime 模型来测试

cd ${MMDEPLOY_DIR}/build/install/example
./object_detection cpu /tmp/fsr_ort ${MMDET_DIR}/demo/demo.jpg

到这里,简单的 mmdeploy 的快速上手就结束了,如果有更定制化的需求,可以去参考文档和源码。

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

mmdeploy快速上手 的相关文章

  • Android沉浸式和状态栏颜色的修改

    一 前言 关于沉浸式实现的方法网上已经有很多了 但是也有点良莠不齐 在遇到实际项目中的问题之后还是需要查阅大量的博客来对问题进行查证 本博客主要是在解决沉浸式的几个问题之后 对沉浸式的一点总结方便后面再次遇到同样问题时 能够很快的查阅而不至
  • 深度优先找出图中顶点U到顶点V的所有简单路径【C/C++】

    目录 前言 步骤如下 1 对于邻接矩阵 1 1 创建邻接矩阵 1 2 初始化path数组和找到顶点U和顶点V的下标 1 3 FindPath 函数 1 4 测试结果 1 5 改进代码 感谢 果冻的光滑 的指导和帮助 2 对于邻接表 2 1
  • java消息的确认模式

    1 AUTO ACKNOWLEDGE 从消息生产者角度 发送消息后就开始阻塞 直到从消息服务器收到回复 期间如发生异常则认为消息未被传送 从消息服务器角度 非持久消息在接受到消息后通知生产者 并将消息存入内存 持久性消息在接受道消息后先存入
  • mac系统安装搭载Windows系统虚拟机方法教程

    我们都知道macOS系统虽然相对windows系统而言更稳定 但macOS系统中可使用的软件数量较windows系统而言要少很多 对于macOS系统应用少的问题 我们可以使用虚拟机来解决 那么 苹果虚拟机好用吗 整体而言是可以的 苹果虚拟机

随机推荐

  • excel 导出:

    导出 1 模板导出 1 所需jar
  • 【Pytorch with fastai】第 4 章 :底层训练数字分类器

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • !important的使用

    前端css样式 使用的是vue 框架 本身的 css样式中与自定义的名称重复 导致样式被覆盖 原自定义样式 修改后自定义样式 其中 import 具有优先权 提升指定样式规则的应用优先权 参考文章 https www xuebuyuan c
  • 利用ESP8266_01做一个远程控制的智能插座

    手头有一块ESP8266 01WIFI模块 是前段时间在网上买arduino套件时送的 套件中还有一个单路继电器 反正这些东西折腾完了以后也没什么用 就将网上的资料汇总了一下 做了一个远程控制的智能排插 功能非常简单 就是通过手机远程控制排
  • 在Windows上搭建Go开发环境

    Go语言是由谷歌开发的一个高性能 跨平台的编程语言 安装Go 首先先来安装一下Go语言的SDK 目前Go语言的最新版本为Go 1 8 3 Go下载页面列出了各种操作系统的安装包 如果选择Windows MSI安装包的话 会将Go安装到C G
  • 开源库源码分析:Okhttp源码分析(一)

    开源库源码分析 OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了 作为最常用的网络请求库 OkHttp以其强大的功能深受Android开发者的喜爱 比如说我 还有对该库进行二次封装而成的热门库 比如说Retrofit 本
  • Unity 如何实现音频播放后的回调

    using System using System Collections using System Collections Generic using UnityEngine public class soundManager MonoB
  • IDEA创建Maven项目报错- Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model】

    1 报错 今天下了最新版本的maven 在idea中配置好maven好 拉取依赖报错了 2 查看报错日志 报错如下 1 Error injecting constructor java lang NoSuchMethodError org
  • python代码编译反编译

    一 编译 自带模块py compile 可以把 py代码编译成pyc文件 py文件中导入使用 import py compile py compile compile r code01 py 在终端中运行 python m py compi
  • 常见问题记录

    执行数据迁移时报如下错误 sqlalchemy exc IntegrityError pymysql err IntegrityError 1215 Cannot add foreign key constraint 解决方案 创建外键的字
  • JavaMail 发送的邮件附件名乱码

    情景还原 同事收到系统发出的一封邮件 邮件里的附件名称本该是 模板 周汇报 2 docx却显示成了 UTF 8Q E3 80 90 UTF 8Q 2 docx 问题探究 第一反应是附件编码的问题 于是把 MimeMessageHelper
  • 静态链表

    代码来源 晴神 算法笔记 静态链表问题通用解题模板 定义静态链表 struct Node typename data int next XXX node size 使用静态链表时 结构体类型名和结构体变量名不要相同 初始化 XXX初始化为正
  • [Python人工智能] 三十二.Bert模型 (1)Keras-bert基本用法及预训练模型

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章结合文本挖掘介绍微博情感分类知识 包括数据预处理 机器学习和深度学习的情感分类 这篇文章将开启新的内容 Bert 首先介绍Keras bert库安装及基础
  • 新的RBAC:基于资源的权限管理(Resource-Based Access Control)

    新的RBAC 基于资源的权限管理 Resource Based Access Control 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的 同时将讨论一种更好的权限管理方式 What is a Role
  • python 模块和包

    一 模块 1 什么是模块 常见的场景 一个模块就是一个包含了python定义和声明的文件 文件名就是模块名字加上 py的后缀 但其实import加载的模块分为四个通用类别 1 使用python编写的代码 py文件 2 已被编译为共享库或DL
  • RocketMQ安装

    目录 1 安装配置jdk8 1 1将文件jdk 8u212 linux x64 tar gz上传到 root目录 1 2 解压缩jdk压缩文件 1 3 配置jdk环境变量 1 4验证jdk是否安装成功 2 安装RocketMQ 2 1下载r
  • nginx   client_body_buffer_size

    这里分享一个关于 nginx client body buffer size 参数的解决案例 描述 前端同事反馈 在发POST 请求带参数的时候 过Nginx 会报错 但是单台测试tomcat POST 很正常 看了下请求参数 好大一堆 的
  • [高级数据结构C++] 树状数组(求前缀和,区间和)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • vue项目实现鼠标移入显示表格,移出隐藏表格

    1 生成ul li列表 ul class ul list style margin bottom 10px li item planNm li ul 2 需要显示的表格 div style display none font size 14
  • mmdeploy快速上手

    mmdeploy快速上手 若要将使用 openmmlab 的框架 如mmdet mmcls 等训练的模型进行快速部署 同样来自 openmmlab 的 mmdeploy 无疑是最合适的选择 本文将简单地完成一个 Faster RCNN 模型