五、yolov8 tensorRT c++部署及接口封装(保姆级教程附源码)

news2024/12/20 18:22:38

采用 C++TensorRT来部署深度学习模型有以下几个优点:

高性能推理:TensorRT是一个高性能的深度学习推理(Inference)优化器,专门为NVIDIA GPU硬件平台设计,能够提供低延迟、高吞吐量的模型推理性能。这意味着在执行模型推理时,TensorRT能够显著提高运算速度,适用于对实时性要求较高的应用场景。
多种框架支持:TensorRT支持从多种流行的深度学习框架(如TensorFlow、Caffe、MxNet、PyTorch等)转换而来的模型,这使得开发者可以灵活选择训练框架,并将训练好的模型转换为TensorRT格式以便进行优化推理。
优化技术集成:TensorRT集成了多种模型优化技术,包括模型量化、动态内存优化、层融合等,这些技术可以极大提高模型的推断速度和效率。
多平台兼容性:TensorRT可以在不同的NVIDIA GPU硬件上运行,无论是超大规模的数据中心还是嵌入式平台,甚至是自动驾驶平台,都可以利用TensorRT进行推理加速。
易于部署:TensorRT提供了C++ API和Python API,使得开发者可以根据自己的需求和熟悉程度选择适合的语言进行开发。C++通常用于需要更高性能和更低级别控制的场景。
提升执行速度:基于TensorRT的应用在推理期间,相比仅使用CPU平台的执行速度快达40倍,这对于需要快速响应的应用场景来说是非常重要的。
主流工具的优势:由于许多企业使用的是NVIDIA生产的计算设备,在这些设备上,NVIDIA推出的TensorRT在性能上相比其他工具(如TVM、TensorComprehensions)会有一定的优势。

一、下载tensorRT

1、登录NVIDA网站,没有账号的需要注册一个。

2、勾选选项框,弹出版本内容。

在这里插入图片描述
在这里插入图片描述

3、选择TensorRT 8.5 GA(GA版本是通用版、稳定版;EA版本是抢先版),点击下载windows版本,下载完毕解压压缩包。

在这里插入图片描述

4、打开文件夹,位置1 include是c++需要调用的头文件,位置2 lib为c++调用的库文件;位置3为tensorRT自带的示例程序,有C++、python版本。

在这里插入图片描述

二、vs创建工程

1、打开vs,创建动态链接库工程。

在这里插入图片描述

2、将tensorRT的include文件和lib文件拷贝到tennsorRT该目录下,在工程中加入头文件和库目录。

在这里插入图片描述

3、下载cuda,我用的是cuda11.3,将头文件和lib库放在cuda文件夹中,工程中添加需要的库。

在这里插入图片描述
在这里插入图片描述

nvinfer.lib
nvonnxparser.lib
cudart.lib
nvinfer_plugin.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib

4、在工程中新建库文件,定义转换接口,需要设置的有输入路径,输出路径,batch。接口如下:

在这里插入图片描述

5、在cpp文件中包含头文件;

在这里插入图片描述

6、onnx转engine实现过程:

在cpp文件的函数接口内写入:

在这里插入图片描述

(1)创建onnx转trt解析器

static Logger gLogger;
//创建builder
IBuilder* builder = createInferBuilder(gLogger);
//创建network
const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
INetworkDefinition* network = builder->createNetworkV2(explicitBatch);
//创建onnx模型解析器
nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, gLogger);

(2)读取onnx模型文件

//读取onnx模型文件
const char* onnx_filename = inputPath.c_str();
//将onnx模型导入trt网络,解析模型
parser->parseFromFile(onnx_filename, static_cast<int>(Logger::Severity::kWARNING));
for (int i = 0; i < parser->getNbErrors(); ++i)
{
	std::cout << parser->getError(i)->desc() << std::endl;
}
std::cout << "successfully load the onnx model" << std::endl;

(3)创建引擎

//使用builder对象构建engine
IBuilderConfig* config = builder->createBuilderConfig();
//设置batch
builder->setMaxBatchSize(maxBatchSize);
//设置最大工作空间
config->setMaxWorkspaceSize(1 << 20);
//config->setMaxWorkspaceSize(128 * (1 << 20));  // 16MB
//设置精度计算
config->setFlag(BuilderFlag::kFP16);
//创建engine
ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);

(4)序列化引擎并写入文件

IHostMemory* gieModelStream = engine->serialize();
std::ofstream p(outputPath.c_str(), std::ios::binary);
if (!p)
{
	std::cerr << "could not open plan output file" << std::endl;
	return -1;
}
//写入
p.write(reinterpret_cast<const char*>(gieModelStream->data()), gieModelStream->size());
//摧毁
gieModelStream->destroy();
engine->destroy();
parser->destroy();
network->destroy();

7、添加新建文件,导出调用函数

在这里插入图片描述

在这里插入图片描述

三、接口测试

编写调用程序:

1、新建控制台程序,包含头文件和库目录。

2、在main函数中调用接口,运行,结果显示如下,即为调用成功。然后等待转换成功,在输出目录中即可找到对应的engine文件。

在这里插入图片描述

在这里插入图片描述

源码链接:
【超级会员】通过百度网盘分享的文件:onnx转trt
链接:https://pan.baidu.com/s/1_Jkq9GjFBzp7j-V34cDQkg?pwd=7785
提取码:7785
复制这段内容打开「百度网盘APP 即可获取」

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

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

相关文章

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

深度学习基础之《TensorFlow框架(13)—二进制数据》

一、CIFAR-10二进制数据集介绍 1、CIFAR-10数据集 CIFAR-10数据集由10个类别的60000个32x32彩色图像组成&#xff0c;每个类别有6000个图像。有50000个训练图像和10000个测试图像 2、数据集分为五个训练批次和一个测试批次&#xff0c;每个批次有10000个图像 3、data_batch_…

强化SSH服务安全的最佳实践

SSH&#xff08;Secure Shell&#xff09;作为一种广泛应用于Linux和其他类Unix系统中的强大工具&#xff0c;为管理员提供了安全的远程登录和命令执行功能。在现今高度互联的网络环境中&#xff0c;确保SSH服务的安全性显得尤为重要。本文将详细阐述一系列SSH服务的最佳实践&a…

探索文本向量化的新高峰:合合信息acge_text_embedding 模型

前言 文本向量化是将文本数据转换为数值向量的过程。由于计算机只能处理数值数据&#xff0c;文本数据需要被转换成数值形式才能被算法和模型处理。这种向量化的过程使得文本数据能够被机器学习、深度学习等算法有效地处理。文本向量化的方法有多种&#xff0c;其中常见的有以…

输入influx但是无法进入influxdb

问题描述&#xff1a; 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台&#xff0c;但是按照别的教程输入influx却无法进入inluxdb&#xff0c;输入输出如下&#xff1a; NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

多种方法论的融合,可以把FMEA做得更好——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff0c;即故障模式与影响分析&#xff0c;是一种预防性质量工具&#xff0c;用于识别产品或过程中潜在的故障模式&#xff0c;评估其对系统的影响&#xff0c;并优先处理那些可能导致严重后果的故障。在实际应用中&#xff0c;单一的…

HashMap常用的API

HashMap好用的API isEmpty()和clear() 例子 package com.example.springbootdemo;import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import java.util.HashMap;/*** Author yimeng* Date 2024/4/26 9:27* PackageName:com.…

2024年Q1季度平板电视行业线上市场销售数据分析

Q1季度平板电视线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;平板电视累计销量约360万件&#xff0c;环比下降12%&#xff0c;同比下降30%&#xff1b;累计销售额约99亿元&#xff0c;环比下降28%&a…

Mockaroo - 在线生成测试用例利器

简介&#xff1a;Mockaroo 是一个无需安装的在线工具&#xff0c;用于生成大量的自定义测试数据。它支持多种数据格式&#xff0c;如JSON、CSV、SQL和Excel&#xff0c;并能模拟复杂的数据结构。 历史攻略&#xff1a; 测试用例&#xff1a;多条件下编写&#xff0c;懒人妙用…

《苍穹外卖》Day08部分知识点记录

一、useGeneratedKeys和keyProperty useGeneratedKeys和keyProperty是<insert>标签中的两个属性&#xff0c;用于处理自动生成的主键值。 1. useGeneratedKeys userGeneratedKeys"true"表示启用自动生成主键功能&#xff1b;当useGeneratedKeys设置为true时…

Yolov5 export.py实现onnx模型的导出

查了很多资料&#xff0c;很多用python代码写的&#xff0c;只需要这个库那个库的&#xff0c;最后都没成功。 不如直接使用Yolov5里面的 export.py实现模型的转换。 一&#xff1a;安装依赖 因为yolov5里面的requirments.txt是将这些转换模型的都注释掉了 所以需要解除注释…

Redis网络相关的结构体 和 reactor模式

目录 1. epoll的封装 结构体aeApiStae 创建epoll fd的封装 epoll_ctl的封装 epoll_wait的封装 2. 结构体aeFileEvent、aeFiredEvent、aeTimeEvent 结构体aeFileEvent 结构体aeFiredEvent 结构体aeTimeEvent 3. struct aeEventLoop aeEventLoop相关的函数 1. 创建eve…

pycharm编辑器------快捷键

pycharm编辑器基础快捷键 上下文操作 01PyCharm 有数百个上下文相关操作&#xff0c;可以帮助您转换、改进和修正代码。按 AIt Enter 以调用“显示上下文操作"。 02我们来应用第一个快速修复:移除形参。 03您几乎可以在任何上下文中调用"显示上下文操作"。我们…

前端补充---15

一、新增表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

C++11 数据结构7 队列的链式存储,实现,测试

前期考虑 队列是两边都有开口&#xff0c;那么在链式情况下&#xff0c;线性表的链式那一边作为对头好呢&#xff1f; 从线性表的核心的插入和删除算法来看&#xff0c;如果在线性表链表的头部插入&#xff0c;每次循环都不会走&#xff0c;但是删除的时候&#xff0c;要删除线…

IDEA中配置使用maven和配置maven的中央仓库

1 以汉化后的IDEA为例配置maven 打开idea选择文件 选择 设置 点击>构建.执行.部署 点击>构建工具 点击>Maven 其中Maven主路径 就是我们maven下载解压后的路径 可以通过边上的三个点选择你解压后的绝对路径&#xff0c;也可以直接把解压后的绝对路劲复制过来 以下…

C++之通俗易懂学模版

目录 一、了解什么是泛性编程 二、模版 1.函数模版 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.5 模板参数的匹配原则 2.类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 非类型模板参数 4. 模板的特化 4.1 概念 4.2 …

半导体晶圆厂内外网数据单向导出,什么样的方案才安全又便捷?

半导体晶圆厂企业为了隔绝外部⽹络有害攻击、保护⽹络和数据安全&#xff0c;通常采⽤物理隔离的⽅式&#xff0c;将企业内⽹与互联⽹隔离。⽹络隔离后&#xff0c;基于业务开展需求&#xff0c;部分重要数据仍需由内⽹导⼊及导出⾄外部⽹络区域。为保障数据的安全合规性&#…

【Qt常用控件】—— 多元素控件

目录 1.1 List Widget 1.2 Table Widget 1.3 Tree Widget 1.4 小结 Qt 中提供的多元素控件有: QListWidget QListView QTableWidget QTableView QTreeWidget QTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例&#xff1a; QTableView 是基于…

Java:优先级队列(堆)

一、初识【堆】 1、什么是【优先级队列】&#xff1f; 前面的文章我们介绍过队列&#xff0c;队列是一种先进先出的数据结构&#xff0c;但是&#xff0c;在某些情况下&#xff0c;操作的数据可能需要有一个优先级来获取数据&#xff0c;例如优先获取队列中最大的元素&#xf…