记录--MMDeploy安装、python API测试及C++推理

2023-10-27

目录

1--前言

2--MMDeploy安装

2-1--下载代码仓库

2-2--安装构建和编译工具链

2-3--创建Conda虚拟环境

2-4--安装MMDeploy SDK依赖

2-5--安装推理引擎

2-6--设置PATH 

2-7--编译安装依赖库

3--编译MMDeploy SDK及Python API测试

4--C++推理测试

5--修改object_detection.cpp显示推理时长

6--参考 


1--前言

服务器配置如下:

Cuda版本:11.1

Cudnn版本:8.2.0

显卡版本:RTX3090

系统版本:Ubuntu 18.04

2--MMDeploy安装

2-1--下载代码仓库

cd xxxx # xxxx表示仓库代码存放的地址
git clone -b master https://github.com/open-mmlab/mmdeploy.git MMDeploy
cd MMDeploy
git submodule update --init --recursive

2-2--安装构建和编译工具链

安装cmake:(版本≥3.14.0)

安装gcc:(版本7+)

本人服务器的版本配置:

2-3--创建Conda虚拟环境

①创建mmdeploy环境:

conda create -n mmdeploy python=3.7 -y
conda activate mmdeploy

②安装pytorch:(版本≥1.8.0)

conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=11.1 -c pytorch -c conda-forge

安装过慢,可设置国内源,方法见以往博客。

conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=11.1 -c conda-forge
# conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=11.1

③安装mmcv-full(其它cuda和pytorch版本的安装方式参考mmcv官网

export cu_version=cu111 # cuda 11.1
export torch_version=torch1.8
pip install mmcv-full==1.4.0 -f https://download.openmmlab.com/mmcv/dist/${cu_version}/${torch_version}/index.html

2-4--安装MMDeploy SDK依赖

①安装spdlog:

sudo apt-get install libspdlog-dev

②安装opencv:(版本≥3.0

sudo apt-get install libopencv-dev

③安装pplcv(强调!这里与官网不同)

cd XXXX # xxxx表示存放pplcv安装包的地址

git clone https://github.com/openppl-public/ppl.cv.git
cd ppl.cv
export PPLCV_DIR=$(pwd)
git checkout tags/v0.6.2 -b v0.6.2

首先进入安装包ppl.cv的地址,修改cuda.cmake的代码,增加以下部分:

if (CUDA_VERSION_MAJOR VERSION_GREATER_EQUAL "11")
    set(_NVCC_FLAGS "${_NVCC_FLAGS} -gencode arch=compute_80,code=sm_80")
    if (CUDA_VERSION_MINOR VERSION_GREATER_EQUAL "1")
    # cuda doesn't support `sm_86` until version 11.1
    set(_NVCC_FLAGS "${_NVCC_FLAGS} -gencode arch=compute_86,code=sm_86")
    endif ()
endif ()

因为这个版本的ppl.cv不支持cuda11.1和RTX3090 8.6的算力,需要修改cuda.cmake程序后再编译安装ppl.cv。

./build.sh cuda

2-5--安装推理引擎

①安装ONNXRuntime

安装ONNXRuntime的python包

pip install onnxruntime==1.8.1

安装ONNXRuntime的预编译包

cd xxxx # xxxx表示存放ONNXRuntime编译包的地址

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
cd onnxruntime-linux-x64-1.8.1
export ONNXRUNTIME_DIR=$(pwd)
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH

②安装TensorRT

从官网下载TensorRT安装包:官网地址

cd /the/path/of/tensorrt/tar/gz/file
tar -zxvf TensorRT-8.2.3.0.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
pip install TensorRT-8.2.3.0/python/tensorrt-8.2.3.0-cp37-none-linux_x86_64.whl
export TENSORRT_DIR=$(pwd)/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATH

安装uff包和graphsurgeon包:

cd XXXX # XXXX表示解压后TensorRT的地址

cd uff
pip install uff-0.6.9-py2.py3-none-any.whl  # 视具体文件而定

cd graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl # 视具体文件而定

2-6--设置PATH 

sudo ~/.bashrc

 这是本人根据安装地址设置的PATH,根据个人情况修改

export PATH="/root/anaconda3/bin:$PATH"

export PATH=/usr/local/cuda-11.1/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export MMDEPLOY_DIR=/root/MMDeploy
export LD_LIBRARY_PATH=$MMDEPLOY_DIR/build/lib:$LD_LIBRARY_PATH

export PPLCV_DIR=/root/ppl.cv

export TENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATH

export CUDNN_DIR=/root/Downloads/cuda
export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATH

export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH

添加PATH后,刷新:

source ~/.bashrc

2-7--编译安装依赖库

cd ${MMDEPLOY_DIR}
pip install -e .

3--编译MMDeploy SDK及Python API测试

①激活mmdeploy环境

conda activate mmdeploy

②设置Path和库目录(在~/.bashrc设置后就无需每次都重新设置)

# 根据实际安装地址设置
# 设置PATH和库目录 (在~/.bashrc中设置就不需要每次导入)
export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export DTENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$DTENSORRT_DIR/lib:$LD_LIBRARY_PATH

③编译自定义算子

# 进入MMDeploy根目录下
cd ${MMDEPLOY_DIR}

# 删除build文件夹 (这是本人之前已经编译过了,所以要删除)
rm -r build

# 新建并进入build文件夹 
mkdir -p build && cd build

# 编译自定义算子
cmake -DMMDEPLOY_TARGET_BACKENDS="ort;trt" -DTENSORRT_DIR=${TENSORRT_DIR} -DCUDNN_DIR=${CUDNN_DIR} -DONNXRUNTIME_DIR=${ONNXRUNTIME_DIR} ..
make -j$(nproc)

④编译MMDeploy SDK

# 编译MMDeploy SDK (cmake这步有时容易出bug,可能需要再执行一遍cmake操作,再执行make操作)
cmake .. -DMMDEPLOY_BUILD_SDK=ON \
-DCMAKE_CXX_COMPILER=g++-7 \
-DTENSORRT_DIR=${TENSORRT_DIR} \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DMMDEPLOY_CODEBASES=mmdet \
-DCUDNN_DIR=${CUDNN_DIR} \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-Dpplcv_DIR=/root/ppl.cv/cuda-build/install/lib/cmake/ppl

make -j$(nproc) 
make install

⑤python API测试(这里需要安装MMDetection的源码;根据实际情况新建Checkpoints文件夹,使用预训练权重.pth文件;模型保存的地址--work-dir;测试图片demo.jpg等;)

以下提供两个实例,需根据个人路径来更改:

faster rcnn实例:预训练模型下载

# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR} 

## faseter_RCNN 实例
# 调用pythonAPI 转换模型: pytorch→onnx→engine
python tools/deploy.py configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py /root/mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py /root/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth /root/mmdetection/demo/demo.jpg --work-dir work_dirs/faster_rcnn/ --device cuda --show --dump-info

mask rcnn实例:预训练模型下载

## mask_RCNN 实例
# 调用pythonAPI 转换模型: pytorch→onnx→engine
python tools/deploy.py \
configs/mmdet/instance-seg/instance-seg_tensorrt_dynamic-320x320-1344x1344.py \
/root/mmdetection/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py \
/root/MMDeploy/cheackpoints/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth \
/root/mmdetection/demo/demo.jpg --work-dir work_dirs/mask_rcnn/ \
--device cuda --show --dump-info

mask rcnn实例结果展示:

4--C++推理测试

# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR} 

## 以后可以从这部分开始运行
# 进入example文件夹
cd build/install/example

编译object_detection.cpp

# 编译object_detection.cpp
mkdir -p build && cd build
cmake -DMMDeploy_DIR=${MMDEPLOY_DIR}/build/install/lib/cmake/MMDeploy ..
make object_detection
# 设置log等级
export SPDLOG_LEVEL=warn

运行实例分割程序

# 运行实例分割程序(参数1:gpu加速; 参数2:推理模型的地址; 参数3:推理测试图片的地址)
./object_detection cuda /root/MMDeploy/work_dirs/mask_rcnn/ /root/mmdetection/demo/demo.jpg   # 原测试图片
./object_detection cuda /root/MMDeploy/work_dirs/mask_rcnn/ /root/MMDeploy/tests/data/tiger.jpeg # 老虎测试图片
# 查看输出图片
ls
xdg-open output_detection.png

5--修改object_detection.cpp显示推理时长

在推理过程“status = mmdeploy_detector_apply(detector, &mat, 1, &bboxes, &res_count);”中前后添加记录时间的代码:

#include <iostream> // new adding
#include <ctime> // new adding
clock_t startTime,endTime; // new adding
startTime = clock(); // 推理计时开始 // new adding
status = mmdeploy_detector_apply(detector, &mat, 1, &bboxes, &res_count); // 推理过程
endTime = clock(); // 推理计时结束 // new adding
std::cout << "The inference time time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << "!!!"<< std::endl; // 打印时间 // new adding

重新执行第三节和第四节的内容。

结果展示:

6--参考 

官方安装文档1

官方安装文档2

官方安装文档3

知乎安装文档1

知乎使用文档1

踩坑解决方法1

7--补充问题

①调用Python API转换模型时,报错:Could not load the Qt platform plugin "xcb"

猜测原因:本人后续在原来的Conda环境中配置了不同版本的Opencv和Pyqt5,导致版本不兼容。

解决方法:降低opencv-python和PyQt5的版本。

pip install opencv-python==4.3.0.36 PyQt5==5.15.2

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

记录--MMDeploy安装、python API测试及C++推理 的相关文章

随机推荐

  • NRF24L01模块----6通道通讯测试

    一 MCU与NRF24L01通讯 采用SPI通讯协议 速率最大为10M 与普通SPI元器件稍有不同的是 多了一个CE引脚 用来开启接收 发送 以及使器件进入待机模式 具体看IC DATASHEET说明 写寄存器指令格式为 1 SPI写寄存器
  • elementui 自定义loading动画加载层

    elementui 自定义loading动画加载层 main js中添加 import Loading from element ui 自定义加载层 Vue prototype openLoading function wer const
  • YOLOV8-网络结构

    代码下载链接 https download csdn net download weixin 40723264 88011324 一 整体网络 本文结合YOLOv5网络进行讲解 通过与YOLOv5网络进行比较 进一步理解YOLOv8 尽快上
  • Go语言学习笔记——jwt跨域鉴权

    文章目录 Golang jwt跨域鉴权 jwt介绍 JWT 到底是什么 JWT 和 OAuth 选择签名方法 签名方法和密钥类型 安装jwt 简单使用 生成JWT 解析jwt 测试 生成token并解析token jwt在项目中的使用 第一
  • Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解

    Java学习 时间类 Period类与Duration类 LocalDate类与Instant类 用法详解 前言 java 8 中引入的两个与日期相关的新类 Period 和 Duration 两个类看表示时间量或两个日期之间的差 两者之间
  • 交易日均千万订单的存储架构设计与实践

    一 订单系统概述 1 1 业务范围 服务业务线 快递 快运 中小件 大件 冷链 国际 B2B合同物流 CLPS 京喜 三入三出 采购入 退货入 调拨入 销售出 退供出 调拨出 等 1 2 订单中心价值 1 解耦 提升系统稳定性 原系统 交易
  • ERP现状及未来发展趋势分析?

    经过多年发展 ERP作为最重要的管理软件为国内外各类型企业所普遍接受 在我国 ERP行业已经进入成熟期 随着云计算 物联网等技术的推进 国内外竞争环境日益加剧 后ERP时代 表现出以下发展趋势 第一 商业智能化建设加强 经过多年运用 ERP
  • Linux下psql的使用(一):安装、建库、建表、数据载入、删除

    Linux下psql的使用 一 安装 建库 建表 数据载入 删除 一 Install PostgreSQL Database 安装Postgresql sudo apt get install postgresql 登录PostgreSQL
  • Java-类中代码块的使用

    Java 类中代码块的使用 1 概念 代码块 初始化块 代码块用来初始化类和对象 代码块如果有修饰的话 只能使用static 静态代码块和非静态代码块的区别 静态 内部可以有输出语句 随着类的加载而运行 初始化类的属性 一个类中定义了多个静
  • Java编程思想之《一切都是对象》理解

    前言 Java编程思想 中提到 Java是基于C 的 但相比之下 Java是一种 纯粹 的面向对象的程序设计语言 Java中不再使用指针来操作内存中的元素 而是采用对象的 引用 这个引用是作者提出的一种为了简化概念上的理解和C 语言的引用有
  • android 检查fragment是否已绑定到activity

    if isAdded 确定fragment是否绑定到Activity mPhotoRecyclerView adapter PhotoAdpter mItems
  • Linux初步入门学习 1

    一基础入门 command options partment1 partment2 命令 选项 参数1 参数2 cd 返回上一级目录 cd Desktop 进入桌面目录 cd usr bin 进入一般目录 ls 列出所有文件 lp line
  • 蓝桥杯大写变小写C语言,小写数字转化为大写数字(小米OJ题与蓝桥杯题)

    import java util public class Main public static void main String args Scanner scan new Scanner System in String str Str
  • Git本地仓库文件的创建、修改和删除

    目录 基本信息设置 1 设置用户名 2 设置用户名邮箱 Git仓库操作介绍 1 创建一个新的文件夹 2 在文件内初始化git仓库 创建git仓库 3 向仓库中添加文件 1 创建一个文件 2 将文件添加到暂存区 3 将暂存区添加到仓库 4 修
  • JavaScript贪心算法

    贪心算法 贪心算法有 霍夫曼编码 prim和kruskal最小生成树算法 Dijkstra最短路径算法 什么是贪心算法 1 针对一组数据 问题有限制值和期望值 希望从中选出几个数据 在满足限制值的情况下 期望值最大 2 每次选择当前情况下
  • UVA1601 The Morning after Halloween

    UVA1601 The Morning after Halloween 题目链接 做这道题的时候看到一个写的很好的代码 在这里保存下来 以便以后学习 题目分析 这道题和普通的bfs有所不同 解题方法也有些差别 主要是这里有三个移动的 小鬼
  • ant打包提示找不到文件解决办法

    运行ant打包时如果出现提示找不到tools目录下某些jar或者bat文件的错误 是因为新版android sdk目录结构产生了变化 原本在sdk tools目录下的文件被转移到sdk build tools 各个版本号文件夹中 需要复制里
  • matlab将数据输出到excel中,matlab数据输出为excel表格-如何把matlab中的数据导到excel表格中...

    如何将matlab工作空间的数据导出到excel 1 很简单的用xlswrite函数就可以了 首先打开matlab 输入你的代码 2 找到你要存放文件的位置复制绝对路径 致谢文件名的话就会存放在当前目录中 如图以f盘根目录为例 3 然后写x
  • 微信小程序集成和使用mqtt(同时支持uniapp和原生)

    前言 在集成mqtt到小程序的开发过程中 确实走了不少弯路 下了许许多多的示例 一步步踩坑到现在终于完美解决了小程序引入mqtt的方法 该方法原生和uniapp均适用 1 小程序网页配置 先登录微信公众平台 找到开发 开发管理 开发设置页面
  • 记录--MMDeploy安装、python API测试及C++推理

    目录 1 前言 2 MMDeploy安装 2 1 下载代码仓库 2 2 安装构建和编译工具链 2 3 创建Conda虚拟环境 2 4 安装MMDeploy SDK依赖 2 5 安装推理引擎 2 6 设置PATH 2 7 编译安装依赖库 3