mmdeploy快速上手

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 ospmodel_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 的快速上手就结束了,如果有更定制化的需求,可以去参考文档和源码。

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

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

相关文章

精简CUDA教程——CUDA Driver API

精简CUDA教程——CUDA Driver API tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 Driver API概述 CUDA 的多级 API CUDA 的 API 有多级(下图)&#xff…

CUDA编程入门极简教程

CUDA编程入门极简教程 转自:CUDA编程入门极简教程 作者:小小将 前言 2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的CPUs上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地…

精简CUDA教程——CUDA Runtime API

精简CUDA教程——CUDA Runtime API tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 Runtime API 概述 环境 图中可以看到,Runtime API 是基于 Driver API 之上开发的…

Python并发——concurrent.futures梳理

Python并发——concurrent.futures梳理 参考官方文档: concurrent.futures — 启动并行任务 Executor对象 class concurrent.funtures.Executor该抽象类是 ThreadPoolExecutor 和 ProcessPoolExecutor 的父类,提供异步执行调用方法。要通过它的子类调用…

TensorRT ONNX 基础

TensorRT ONNX 基础 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 概述 TensorRT 的核心在于对模型算子的优化(合并算子、利用当前 GPU 特性选择特定的核函数等多种…

回文子串、回文子序列相关题目

回文子串、回文子序列相关题目 回文子串是要连续的,回文子序列可不是连续的。 516. 最长回文子序列 dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最长回文子序列的长度。 dp数组初始化:子序列长度为 1 时&am…

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一个非常好用的开源目标检测框架,我们可以用它方便地训练自己的目标检测模型,mmdetection 项目仓库提供许多实用的工具来实现帮助我们进行各种测试。本篇将梳理以下 mmdetection 项目仓库 tools 目录下的各种实…

TensorRT ONNX 基础(续)

TensorRT ONNX 基础(续) PyTorch正确导出ONNX 几条推荐的原则,可以减少潜在的错误: 对于任何使用到 shape、size 返回值的参数时,例如 tensor.view(tensor.size(0), -1) 这类操作,避免直接使用 tensor.s…

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程,为求简洁,我们不介绍为什么内网穿透也不介绍其原理,这里假设各位读者都已经明确的知道自己的目的,本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说,内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo:https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换,我们通…

LeetCode-10 正则表达式匹配

LeetCode-10 正则表达式匹配 动态规划 10. 正则表达式匹配 dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i−1]s[0:i-1]s[0:i−1] 能否被 p[0:j−1]p[0:j-1]p[0:j−1] 成功匹配。 状态转移方程 : 如果 s[i−1]p[j−1]s[i-1]p[j-1]s[i−1]p[j−1] …

shell if判断和for循环常见写法

shell if判断和for循环常见写法 转自: Shell中for循环的几个常用写法 Shell中if 条件判断总结 if常见写法 一、if的基本语法: if [ command ];then符合该条件执行的语句 elif [ command ];then符合该条件执行的语句 else符合该条件执行的语句 fibash shell会按顺序…

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题 如果我们想要在 Pytorch 中同时迭代两个 dataloader 来处理数据,会有两种情况:一是我们按照较短的 dataloader 来迭代,长的 dataloader 超过的部分就丢弃掉…

neovim及coc.nvim自动补全初探

neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt install neovim习惯了打开 vi/vim 的方式,可以用个 alias 在 ~/.zshrc 中设置一下: alias vi"nvim"插件 vim-plug…

sed 简明教程

sed 简明教程 转自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了。所以 林妹妹跳了个Topless,他的哥哥sed坐不住了&#xf…

awk 简明教程

awk 简明教程 转自:https://coolshell.cn/articles/9070.html 有一些网友看了前两天的《Linux下应该知道的技巧》希望我能教教他们用awk和sed,所以,出现了这篇文章。我估计这些80后的年轻朋友可能对awk/sed这类上古神器有点陌生了&#xff0c…

应该知道的LINUX技巧

应该知道的LINUX技巧 转自:https://coolshell.cn/articles/8883.html 这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇:入门教程 转自:[原创][深度][PyTorch] DDP系列第一篇:入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析 转自:https://zhuanlan.zhihu.com/p/187610959 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:实战与技巧

[深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! – – …