实战YOLO V5推演(TensorRT版本 C++)

news2024/11/18 21:50:22

提示:兜兜转转还是来到了C++,欠的债该还的得还,因此本篇文章试图从C++来撬动tensorrt 完成转换模型和推理,而不是借助python库

文章目录

  • 前言
  • 一、Tensorrt前置
      • 1.1 Tensorrt基本概念
      • 1.2 异步推演说明
  • 二、实战YOLO V5推演
    • 1.TensorRT模型转换
    • 2.读入数据
  • 总结


前言

提示:希望本篇文章结束后,我能回答两个问题:

  1. python不好用么,为什么还要转C++; yolov5的export.py 已经实现在python端的模型转化了啊?
    不需要c++的可以看这个《【深度学习】目标检测 yolov5模型量化安装教程以及转ONXX,torchscript,engine和速度比较一栏表》
  2. C++的学习曲线那么陡峭,性能在服务器端不如go,所以为什么不是go?
    go 在服务器端性能牛,但是在终端设备不咋样,所以从这个角度,还是C++

提示:以下是本篇文章正文内容,下面案例可供参考

一、Tensorrt前置

首先需要有个环境,搭建环境的指引《【深度学习】基于深度学习的linux服务器,需要搭建哪些服务,一步步搭建深度学习的环境,cuda,pytorch,opencv,ftp服务, nfs服务 docker等等》
文章很长,是深度学习的最大化安装,基于进入Tensorrt的操作,至少要安装显卡驱动,cuda,cudann,tensorrt,gpu的torch环境,并且他们之间的版本要匹配。老实说,新手直接绕道《【深度学习】目标检测 yolov5模型量化安装教程以及转ONXX,torchscript,engine和速度比较一栏表》

1.1 Tensorrt基本概念

本章节你将了解TensorRT中的以下几个关键概念:Runtime、CudaEngine、ExecutionContext、与Binding。

在使用ONNX Runtime的Python API执行模型推演大致分四步:

  1. 初始化:使用onnx格式存储的模型文件初始化 InferenceSession 。

  2. 预处理:将输入数据做预处理。

  3. 执行推演:调用 run 方法执行模型推演,获得模型输出。

  4. 后处理:执行后处理逻辑。

    TensorRT的推演与其类似,只是要更加复杂一些:

  5. 模型准备:TensorRT使用私有模型格式,其它格式的模型文件如ONNX需要先完成转换才可以被使用。该转换过程可以通过调 用TensorRT的C++或者Python API来在线实现,也可以通过 trtexec 这个工具离线完成。

  6. 初始化:包括初始化运行时 Runtime ,使用 Runtime 加载模型文件形成 CudaEngine ,再基于 CudaEngine 创建 ExecutionContext ;这三者组合起来可以大致等同为 ONNX Runtime中的 InferenceSession 。此外还需要按照模型的输入与输出规格分别申请CPU一侧的内存与GPU一侧的显存,指向这些存储区域的指针集合称为 Binding 。

  7. 将输入数据做预处理,然后将其从CPU侧存储(内存)拷贝到GPU侧存储(显存)。

  8. 调用 ExecutionContext 的enqueueV2 方法异步执行模型推演,然后调用 cudaStreamSynchronize 方法同步结果,获得模型输出。

  9. 将输出结果从GPU侧存储(显存)拷贝到CPU侧存储(内存),然后执行后处理逻辑。

1.2 异步推演说明

TensorRT支持同步与异步推演,这里以异步推演作为说明实例。

与ONNX Runtime Python API的推演流程相比,TensorRT C++ API推演明显有着更加底层、更加细粒度的数据与流程控制。这些正是使用C++作为开发语言与Python相比所带来的主要区别。

接下来,你将通过YOLO v5这个实例来掌握TensorRT的实际使用过程。本章节所涉及到的概念都会出现在代码中,希望到时候你看到它们时不会感觉太陌生。

二、实战YOLO V5推演

本章节你将借助YOLO v5模型推演的完整代码掌握TensorRT C++ 推演API,以及将ONNX格式神经网络模型转换为TensorRT专用格式的具体方法。

YOLO v5是一款在物体检测领域颇为流行的神经网络模型。在这里我们不会深入探究其原理与设计,而将直接使用GitHub上的一款开源实现所生成的预训练模型。在此基础上,本章节展示了以下内容。

  1. 使用TensorRT的 trtexec 工具将ONNX模型文件转换为TensorRT的Engine格式。
  2. 使用CMake构建TensorRT工程。
  3. 使用OpenCV实现输入图像读取与存储。
  4. YOLO v5模型预处理与后处理。
  5. 使用TensorRT实现YOLO v5模型推演。
    让我们开始吧!

1.TensorRT模型转换

首先下载YOLO v5预训练好的模型权重文件,其地址为:

https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt

然后遵循官方教程,导出ONNX格式模型:
代码如下(示例):
在写一次吧,安装

pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime-gpu openvino-dev tensorflow  # GPU

其实只需要onnx相关的,其它的有tf使用的,apple使用的opencv使用的,用不到 ,我这里偷个懒,安装少的

pip install -r requirements.txt onnx onnxruntime-gpu # GPU

上边这一步完成后,你应当获得一个ONNX格式模型文件 yolov5s.onnx 。
转换一版试一下:

 python export.py --weights weights/yolov5s.pt -- --include onnx engine

转化报错,原因是:https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html,默认安装的1.13,匹配11.6的吗我的是11.4,换回来重新运行
在这里插入图片描述

接下来,使用如下命令将其转换为TensoRT格式模型文件。
还是报错

[8] Assertion failed: scales.is_weights() && "Resize scales must be an initializer!"
TensorRT: export failure ❌ 4.3s: failed to load ONNX file: weights/yolov5s.onnx

解决问题指引:
https://blog.csdn.net/zaf0516/article/details/122932651

snap install netron
pip install onnx-simplifier
pip install onnx_graphsurgeon --index-url https://pypi.ngc.nvidia.com

还是报错:
指引是改模型,我偷个懒,退一下版本 yolov5 tag6.2搞下来试一试,现在用的是最新的用于分割的tag7.0

在这里插入图片描述
都是相同的错误,先不改了,直接转onnx是可以的

python export.py --weights weights/yolov5s.pt --device 0 --include onnx

切換到6.1 上面報錯,解決指引
https://blog.csdn.net/Thebest_jack/article/details/124723687
然后转换engine

trtexec --onnx=weights/yolov5s.onnx --saveEngine=yolov5s.engine

问题出来了,不管用7.0 还是 6.1, 6.2 都报错


[12/07/2022-20:49:09] [E] [TRT] ModelImporter.cpp:776: --- End node ---
[12/07/2022-20:49:09] [E] [TRT] ModelImporter.cpp:779: ERROR: builtin_op_importers.cpp:3609 In function importResize:
[8] Assertion failed: scales.is_weights() && "Resize scales must be an initializer!"
[12/07/2022-20:49:09] [E] Failed to parse onnx file
[12/07/2022-20:49:09] [I] Finish parsing network model
[12/07/2022-20:49:09] [E] Parsing model failed
[12/07/2022-20:49:09] [E] Failed to create engine from model.
[12/07/2022-20:49:09] [E] Engine set up failed
&&&& FAILED TensorRT.trtexec [TensorRT v8205] # trtexec --onnx=weights/yolov5s.onnx --saveEngine=yolov5s.engine

python 命令和trtexec命令都报错

 trtexec --onnx=weights/yolov5s.onnx --saveEngine=yolov5s.engine
[12/07/2022-20:53:43] [E] [TRT] ModelImporter.cpp:776: --- End node ---
[12/07/2022-20:53:43] [E] [TRT] ModelImporter.cpp:779: ERROR: builtin_op_importers.cpp:3609 In function importResize:
[8] Assertion failed: scales.is_weights() && "Resize scales must be an initializer!"
[12/07/2022-20:53:43] [E] Failed to parse onnx file
[12/07/2022-20:53:43] [I] Finish parsing network model
[12/07/2022-20:53:43] [E] Parsing model failed
[12/07/2022-20:53:43] [E] Failed to create engine from model.
[12/07/2022-20:53:43] [E] Engine set up failed
&&&& FAILED TensorRT.trtexec [TensorRT v8205] # trtexec --onnx=weights/yolov5s.onnx --saveEngine=yolov5s.engine

python export.py --weights weights/yolov5s.pt --device 0 --include onnx engine

所以要替换模型了,明天见!

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

大学电子系C++模拟考试

随手附上一些代码,未必是最优解,仅供参考。 加密四位数 【问题描述】 输入一个四位数,将其加密后输出。方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十位上的数字互换&#…

Prometheus 监控mysql

目录 下载安装mysqld_exporter 在mysql中创建监控用户并赋权 启动mysqld_exporter 添加到系统服务 浏览器访问服务器9104端口 在prometheus定义job来监控mysqld 运行prometheus并在端口9090上进行访问查看节点信息 根据具体需求再在可视化平台上定义数据源来进行可视化…

Java数据结构之树与二叉树

2.3 二叉树的性质(重点,选择题常考) 2.4 二叉树的链式存储 2.5 二叉树的基本操作 2.5.1 前提说明 2.5.2 二叉树的遍历 2.5.3 二叉树基本操作的实现(重点) 1. 树形结构 1.1 树的概念 树是一种非线性的数据结构&…

[附源码]JAVA毕业设计体检系统(系统+LW)

[附源码]JAVA毕业设计体检系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xf…

JavaScript实现一段时间之后关闭广告

JavaScript实现一段时间之后关闭广告 案例池子: JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获…

水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 水下机器人-机械手系统(Underwater vehicle-manipulator systems, UVMS)可以完成除观测之外的水下采样…

[论文解析] HeadNeRF: A Realtime NeRF-based Parametric Head Model

code link: https://github.com/CrisHY1995/headnerf 相关连接: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/124874717 来自中科大张举勇教授课题组提出了 HeadNeRF,一种基于 NeRF 的高效全息人脸头部参数化模型,该工作发表…

阿里面试Redis最常问的三个问题:缓存穿透、缓存击穿、缓存雪崩(带答案)

一、缓存穿透 如上图,正常情况下,如果用户在redis缓存中没有查询到自己想要的数据,就会去mysql数据库中查询。如果mysql数据库中也没有,在没有任何措施下,用户一定会不断的去mysql数据库中查询,随着时间的推…

风控串行组合模型及其信用评估场景实践

在信贷风控中,数据建模好像是“家常便饭”那么普通且重要,而我们最终享用“饭菜”的美味程度,在数据“食材”较完备的情况下,完全取决于我们建模的方法。根据实际业务场景,采用合理且有效的建模思路,可以较…

诊断和响应故障_RMAN数据修复概念

1.RMAN数据修复概述 1.1.关于需要数据修复的问题 虽然有几种问题会中止Oracle数据库的正常操作或影响数据库I/O操作,只有以下几种情况要求DBA介入和数据修复:用户错误,应用程序错误和介质故障。 1.1.1.关…

[附源码]计算机毕业设计JAVA中达小区物业管理系统

[附源码]计算机毕业设计JAVA中达小区物业管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

【LeetCode】1775. 通过最少操作次数使数组的和相等

题目描述 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6&…

LaTeX行距以及字体大小

LaTeX行距以及字体大小1、行距2、字体大小1、全局模式2、局部模式1、行距 一:改变全文行距 导言部分前加入\linespread{2.0}即可,代表全文两倍行距。 二:部分段落需要改变行距 \usepackage{setspace} \begin{spacing}{2.0}(内…

js_实现网页自动跳转

网页自动跳转实现网页定时自动跳转实现网页定时自动跳转 效果&#xff1a; 10秒后自动跳转到网易云音乐的页面 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box{wi…

什么是 NFT 洗盘交易:洗盘交易背后的原理

2022年12月 CoinGecko 与 Footprint Analytics 联合报告 Data Source&#xff1a;Footprint Analytics 市场上有一种说法是&#xff0c;整个NFT 市场的交易本质是欺诈性的&#xff0c;并且是由洗盘交易者操纵出来的假象。我们经常看到许多 媒体头条 在推动这种说法。毕竟&…

HTML学生个人网站作业设计:宠物网站设计——萌宠有家(5页) HTML+CSS 简单DIV布局宠物介绍网页模板代码 DW学生个人网站制作成品下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

动态规划:01背包问题例题(leetcode+cpp实现)

文章目录分割等和子集最后一块石头的重量前情回顾&#xff1a; 动态规划(4)&#xff1a;01背包问题详解 分割等和子集 力扣传送门&#xff1a; https://leetcode.cn/problems/partition-equal-subset-sum/ 题目描述&#xff1a; 给你一个整数数组&#xff0c;将这个数组里的…

论文速读Backbone系列一:点云Transformer结合、PointNet++改进、点云卷积核设计

如有错误&#xff0c;恳请指出。 对一些经典论文进行快速思路整理&#xff0c;以下内容主要关注的是3d点云的backbone设计&#xff0c;包括transformer的应用&#xff0c;卷积核的设计&#xff0c;PointNet网络的改进。 文章目录一、Transformer改进1. 《PCT: Point Cloud Tran…

Wireshark高级特征

1&#xff0c;端点和网络会话 想要让网络通信正常进行&#xff0c;你必须至少拥有两台设备进行数据流的交互。端点&#xff08;endpoint&#xff09;就是指网络上能够发送或接收数据的一台设备。两个端点之间的通信被称之为会话&#xff08;conversation&#xff09;。Wiresha…

Python中如何选择Web开发框架?

Python开发中Web框架可谓是百花齐放,各式各样的web框架层出不穷,那么对于需要进行Python开发的我们来说,如何选择web框架也就变成了一门学问了。本篇文章主要是介绍目前一些比较有特点受欢迎的Web框架,我们可以根据各个Web框架的特性进行选择应用。 Django Django是市面上…