当前位置:网站首页>mmdeploy快速上手
mmdeploy快速上手
2022-04-22 18:34:00 【Adenialzz】
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.engine, end2end.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 的快速上手就结束了,如果有更定制化的需求,可以去参考文档和源码。
版权声明
本文为[Adenialzz]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44966641/article/details/124348560
边栏推荐
- 电脑硬件中最重要的部分是什么?
- C# 从list 或者string中随机获取一个
- 使用docker创建mysql主从备份时遇到的一些问题
- 电脑上怎么快速切换显示不同的软件界面
- [fundamentals of interface testing] Chapter 9 | detailed explanation of postman global variables and environment variables
- Esprima ECMAScript 解析架构
- Why don't I use flomo anymore
- PCB Layout Stackup setting
- Esprima ECMAScript parsing architecture
- DL之YoloV3:YoloV3论文《YOLOv3: An Incremental Improvement》的翻译与解读
猜你喜欢

PCB Layout Stackup setting

【手部姿态估计】【论文详读】3D Hand Pose Estimation with a Single Infrared Camera via Domain Transfer Learning

208. 实现 Trie (前缀树)

图像的卷积——【torch学习笔记】

Domestic chip dp9637-k bus transceiver replaces l9637d chip and si9241

18730 coloring problem (two ways of writing fast power)

MySQL MHA

【服务器数据恢复】服务器进水导致多块硬盘同时掉线,服务器崩溃的数据恢复案例

Applets -- components

还弄不懂相对路径和绝对路径,这篇文章带你简单剖析
随机推荐
208. Implement trie (prefix tree)
SegAttnGAN Text to Image Generation with Segmentation Attention
After calling Bapi many times, what is the problem with the last one-time commit work?
使用docker创建mysql主从备份时遇到的一些问题
第119章 SQL函数 RIGHT
JVM composition
An idea plug-in that doesn't work, but can install X
MySQL - index
mysql 之 MHA
电脑硬件中最重要的部分是什么?
High availability - consumer documents
PostgreSQL 15 will soon support merge statements in the SQL standard
[drive] TX2 transplants EC20 startup module
Applet - API
Topic5——198. 打家劫舍
[thinking and progress]: regret about yourself
Convolution of images -- [torch learning notes]
带你了解极具弹性的Spark架构的原理
zenodo等国外网站下载太慢了可能存在的原因。
leetcode-470. 用 Rand7() 实现 Rand10()