当前位置: 首页 > news >正文

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

服务器配置如下:

Cuda版本:11.1

Cudnn版本:8.2.0

显卡版本:RTX3090

使用转换脚本将.pth模型转换为ONNX格式
python mmdeploy/tools/deploy.py \mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py \mmdetection/configs/yolox/yolox_x_8xb8-300e_coco.py \mmdetection/checkpoint/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth \mmdetection/demo/demo.jpg \--work-dir mmdeploy_models/mmdet/yolox \--device cpu \--show \--dump-info

生成文件夹其中,end2end.onnx: 推理引擎文件。可用ONNX Runtime推理。*.json: mmdeploy SDK推理所需的meta信息

 

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.8 -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

③安装mmcv-full

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.1set(_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安装包:

https://developer.nvidia.com/nvidia-tensorrt-download
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根据个人情况修改
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_PATHexport PPLCV_DIR=/root/ppl.cvexport TENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATHexport CUDNN_DIR=/root/Downloads/cuda
export LD_LIBRARY_PATH=$CUDNN_DIR/lib64:$LD_LIBRARY_PATHexport ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
source ~/.bashrc

 

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

cd ${MMDEPLOY_DIR}
pip install -e .

 

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

①激活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/pplmake -j$(nproc) 
make install

 

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

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

fasterrcnn:

https://github.com/open-mmlab/mmdetection/tree/master/configs/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

 maskrcnn:

https://github.com/open-mmlab/mmdetection/tree/master/configs/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

 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显示推理时长

#include <iostream> // new adding
#include <ctime> // new adding

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

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

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

相关文章:

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

服务器配置如下&#xff1a; Cuda版本&#xff1a;11.1 Cudnn版本&#xff1a;8.2.0 显卡版本&#xff1a;RTX3090 使用转换脚本将.pth模型转换为ONNX格式 python mmdeploy/tools/deploy.py \mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py \mmdetect…...

[openCV]基于拟合中线的智能车巡线方案V3

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表"""newDir d…...

vite+typescript项目 :找不到模块“./***.vue”或其相应的类型声明——解决方案

vue3ts报错&#xff1a; 找不到模块“./App.vue”或其相应的类型声明。ts(2307) 解决方法&#xff1a; 1、在src文件夹找到 vite-env.d.ts 加入以下代码&#xff1a; declare module *.vue {import type { DefineComponent } from vueconst vueComponent: DefineComponent<…...

Gradio-YOLOv5-YOLOv7 搭建Web GUI

目录 0 相关资料&#xff1a;1 Gradio介绍2 环境搭建3 GradioYOLOv54 GradioYOLOv75 源码解释 0 相关资料&#xff1a; Gradio-YOLOv5-Det&#xff1a;https://gitee.com/CV_Lab/gradio_yolov5_det 【手把手带你实战YOLOv5-入门篇】YOLOv5 Gradio搭建Web GUI: https://www.bi…...

HTML模板生成word,pdf文档

1.获取html模板 public static void main(String[] args) {String htmlContent getHtmlFileContent(templateName,dataMap);String exportType "pdf";if (exportType.equals("pdf")){convertToPdf(htmlContent,filePath);}else {exportWord(htmlContent…...

ssl单向证书和双向证书校验测试及搭建流程

零、前提准备 首先了解下HTTP和HTTPS的区别&#xff1a; HTTPS与HTTP有什么不同&#xff1f; HTTP是过去很长一段时间我们经常用到的一种传输协议。HTTP协议传输的数据都是未加密的&#xff0c;这就意味着用户填写的密码、账号、交易记录等机密信息都是明文&#xff0c;随时…...

【2种方法,jmeter用一个正则提取器提取多个值!】

jmeter中&#xff0c;用json提取器&#xff0c;一次提取多个值&#xff0c;这个很多人都会。但是&#xff0c;用正则提取器一次提取多个&#xff0c;是否可以呢&#xff1f; 肯定&#xff0c;很多人都自信满满的说&#xff0c;可以&#xff01;形如&#xff1a;token":&q…...

012-堆,结构体

012-堆,结构体 堆空间的申请和释放 堆空间特点? ​ 栈空间的特点是,自动申请自动释放 ​ 堆空间由用户自己主动申请,主动释放 ​ 利用函数malloc进行堆空间的申请 ​ 利用函数free进行堆空间使用完毕后的释放 问题: ​ 局部变量的存储空间在栈区; ​ 全局变量的存储空…...

GDAL C++ API 学习之路 OGRGeometry 多边形类 OGRPolygon

OGRPolygon class OGRPolygon 是 OGR 几何图形库中的一个类&#xff0c;用于表示多边形的几何图形。它是一种封闭的多边形&#xff0c;由一个或多个外环&#xff08;OGRLinearRing&#xff09;和零个或多个内环&#xff08;OGRLinearRing&#xff09;组成。多边形是平…...

文件传输协议FTP与托管文件传输MFT有什么区别?

传输敏感数据是日常业务中不可或缺的一环。但是&#xff0c;在把敏感数据从A点搬到B点的过程中&#xff0c;保证该敏感数据的安全是组织的重要任务&#xff0c;因此最好选择一种能够确保文件安全的方案。 FTP与MFT有什么不同&#xff1f; FTP&#xff08;文件传输协议&#xf…...

js实现按照句号将一段文本进行分段

/*** 将给定的文本按照300字并且按照句号分为多个p标签** param text 给定的文本* returns 返回分割后的多个p标签的数组*/ function splitTextByParagraph(text) {// 将文本按照句号分割成多个句子const sentences text.split(。);// 初始化一个空数组来存储生成的p标签const…...

环形链表的进一步探究

茕茕白兔&#xff0c;东走西顾&#xff0c;衣不如新&#xff0c;人不如故 往期回顾&#xff1a; 数据结构——双向链表 数据结构——单链表 数据结构——顺序表 文章目录 如何判断一个链表是否为环形链表 环形链表的判断的深入探究 例1&#xff1a;沸羊羊追美羊羊 例…...

flink任务性能优化

1、使用异步算子&#xff0c;异步执行操作 2、将下游数据需要的数据以参数的形式向下传递 3、当服务器资源有限的情况下&#xff0c;慎用RocksDBStateBackend RocksDBStateBackend performance will be poor because of the current Flink memory configuration! RocksDB wi…...

vue2 el-carousel轮播图和文字一起改变

vue项目的话 安装一下element依赖 npm i element-ui -S在main入口文件引入element包 我在app文件里边去写的 <template><div class"w"><el-carousel height"460px"><el-carousel-item v-for"item in items" :key"i…...

LangChain:打造自己的LLM应用 | 京东云技术团队

1、LangChain是什么 LangChain是一个框架&#xff0c;用于开发由LLM驱动的应用程序。可以简单认为是LLM领域的Spring&#xff0c;以及开源版的ChatGPT插件系统。核心的2个功能为&#xff1a; 1&#xff09;可以将 LLM 模型与外部数据源进行连接。 2&#xff09;允许与 LLM 模…...

字节跳动测试岗,3面都过了,HR告诉我这个原因被刷了...

说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&#xff0c;最后没offer&#xff0c;自己只想到下面几个原因&#xff1a; 虚报工资&#xff0c;比实际高30%&#xff1b; 有更好的人选&#xff0c;这个可能性不大&#xff0c;我看还在…...

Android 14重要更新预览

Android 14重要更新预览 国际化 Android 14 在 Android 13 的基础上进一步扩展了按应用设定语言功能&#xff0c;提供了一些额外的功能&#xff1a; 自动生成应用的 localeConfig&#xff1a;从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始&#xff0c;您可以…...

快速上手字符串函数

文章目录 前言一、求字符串的长度strlen函数strlen函数学习使用strlen函数模拟实现strlen函数模拟实现方法1&#xff1a;计数器法strlen函数模拟实现方法2&#xff1a;指针减指针法strlen函数模拟实现方法3&#xff1a;递归方法 二、字符串的拷贝&#xff0c;拼接和比较strcpy函…...

linux(centos) docker 安装 nginx

​1、拉取nginx最新版本镜像 docker pull nginx:latest 查看镜像 docker images 或者 docker images -a 2.启动nginx容器 docker run -d -p 80:80 --name nginx nginx 使用docker run命令&#xff0c;启动nginx容器。 --name&#xff0c;设置容器名。为方便记忆&#xff…...

SpringBoot 整合 Minio

官网&#xff1a; MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议&#xff0c;项目地址是 https://github.com/minio/minio 。 它适合存储海量的非结构化的数据&#xff0c;例如说图片、音频、视频等常见文件&#xff0c;备份数据、…...

从怀疑到真香!2026我日常办公离不开的这款在线文字转换器太好用了

刚入职那半年我踩过太多坑&#xff1a;一周三次新人培训&#xff0c;怕漏记知识点全程录音&#xff0c;下课手动整理1小时录音要熬3小时&#xff0c;知识点散得根本没法复习&#xff1b;部门周会做完记录&#xff0c;散会就要我出整理好的纪要&#xff0c;赶工赶得饭都吃不上&a…...

基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战

1. 项目概述与核心价值最近几年&#xff0c;我身边越来越多的朋友开始关注家里的空气质量、温湿度这些看不见摸不着&#xff0c;但又实实在在影响生活舒适度和健康的环境指标。从新装修的房子担心甲醛&#xff0c;到有老人小孩的家庭在意PM2.5和二氧化碳浓度&#xff0c;再到南…...

股票买卖最佳时机:LeetCode121题解

题目LeetCode121给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取…...

翻译 GDB 官方文档

翻译 GDB 官方文档项目地址官方文档地址下载源码包编译html运行翻译程序项目地址 https://github.com/shootercheng/gdb-translate.git 项目结构 $ tree -L 1 . ├── cmd ├── go.mod ├── input ├── internal ├── LICENSE ├── output ├── README.md ├─…...

百度文心一言开发者如何通过Taotoken低成本接入多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 百度文心一言开发者如何通过Taotoken低成本接入多模型API 对于已经熟悉并正在使用百度文心一言等国产大模型API的开发者而言&#…...

WebSocket实时通信架构进阶:Room、命名空间与集群部署

WebSocket实时通信架构进阶:Room、命名空间与集群部署 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 WebSocket已经成为实时应用的标准技术,但大多数教程只停留在"建立连接、发送消息"的基础阶段。在生产环境中,你需要处理Room管理、命名空…...

保姆级教程:在Ubuntu上配置Frida环境,搞定Android App的IO重定向与签名绕过

在Ubuntu上构建Android逆向工程环境&#xff1a;Frida实战与IO重定向技术解析 对于习惯Linux环境的安全研究人员而言&#xff0c;Windows-centric的逆向工具链往往带来诸多不便。本文将系统性地介绍如何在Ubuntu上搭建完整的Android逆向环境&#xff0c;并深入探讨如何利用Frid…...

ComfyUI-WD14-Tagger:3分钟实现AI智能图像标签提取,效率提升10倍

ComfyUI-WD14-Tagger&#xff1a;3分钟实现AI智能图像标签提取&#xff0c;效率提升10倍 【免费下载链接】ComfyUI-WD14-Tagger A ComfyUI extension allowing for the interrogation of booru tags from images. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-WD14-…...

别再瞎拖拽了!Unity Prefab从创建到批量修改的保姆级工作流(含变体与嵌套实战)

Unity Prefab高效工作流&#xff1a;从创建到批量修改的实战指南在Unity项目开发中&#xff0c;Prefab&#xff08;预制体&#xff09;是最基础也最强大的工具之一。但很多开发者&#xff0c;尤其是初学者&#xff0c;往往停留在简单的"拖拽-修改"阶段&#xff0c;没…...

DIY智能USB充电器:基于电流检测与双稳态继电器的零功耗节能方案

1. 项目概述&#xff1a;打造一款智能、节能的USB手机充电器作为一名电子爱好者&#xff0c;我经常折腾各种电源项目。市面上很多手机充电器&#xff0c;包括一些原装货&#xff0c;都存在一个通病&#xff1a;手机充满电后&#xff0c;充电器依然插在插座上&#xff0c;内部电…...