使用Tensorrt对YOLOv5目标检测的代码进行加速

news2024/12/24 11:39:48

文章目录

  • 1. 前言
  • 2. 官网
  • 3. 安装依赖
    • 3.1. 安装OpenCV
      • 3.1.1. 安装
      • 3.1.2. 添加环境变量
      • 3.1.3. 查看版本
    • 3.2. 安装TensorRT
      • 3.2.1. 下载
      • 3.2.2. 安装
      • 3.2.3. 添加环境变量
  • 4. 下载项目
  • 5. 生成WTS模型
  • 6. cmake
    • 6.1. 生成Makefile
      • 6.1.1. 配置CMakeLists.txt
        • 6.1.1.1. 修改编译依赖的路径
        • 6.1.1.2. 修改算力
  • 7. 编译
    • 7.1. 修改源代码
    • 7.2. 生成exe
    • 7.3. 生成engine
  • 8. 推理
    • 8.1. exe推理
    • 8.2. Python 调用dll推理
    • 8.3. 性能测试
  • 9. 报错
  • 10. 参考资料

1. 前言

  • 最近在使用YOLOv5做apex的辅助,训练代码现在是写完了,在训练场中把禁止的假人还行,但是对于移动的目标,总是出现丢帧、追不上的问题。测了一下FPS,发现我的RTX2060上面的FPS只有3到5,这基本上相当于PPT的水平,自己的硬件一时半会没办法升级,但自己真的想把这个APEX的辅助给做完,所以只好通过代码加速的方法来曲线救国。从网上查到Tensorrt对于代码的加速效果非常好,所以下面开始动手尝试。
  • 先放一张目前辅助的识别效果
  • (先透漏一下,使用TensorRT对YOLOv5进行加速之后,FPS可以达到100以上,Amazing 吧~)

2. 官网

  • developer.nvidia.com/nvidia tensorrt download
  • NVIDIA TensorRT | NVIDIA Developer
  • NVIDIA TensorRT | NVIDIA Developer

3. 安装依赖

3.1. 安装OpenCV

  • 进入Releases - OpenCV 下载页面,选择对应的OpenCV平台和版本

3.1.1. 安装

提取安装包内容
这个安装和普通软件的安装没有区别,直接点开EXE安装包,一直下一步就可以完成了
选择安装位置


  • 正在安装

  • 安装完成后会在安装目录下生成build和source两个文件夹,我们将来需要使用的文件主要放在build文件夹中

3.1.2. 添加环境变量

添加如下的环境变量

D:\Program\OpenCV\build\x64\vc16\bin
D:\Program\OpenCV\build\x64\vc16\lib
D:\Program\OpenCV\build\include
D:\Program\OpenCV\build\include\opencv2

之后重启电脑

3.1.3. 查看版本

在命令行下输入下面代码opencv_version,就可以查看到OpenCV的版本了

3.2. 安装TensorRT

3.2.1. 下载

首先到英伟达的tensorRT的官网上下载适合Windows平台的版本

  • developer.nvidia.com/nvidia tensorrt download
  • 或者是上面的地址进行安装
  • blog.csdn.net/sinat 28442665/article/details/119965847
  • 链接:https://pan.baidu.com/s/1uNw9lC6EKnaJXRNuZFHs-Q
  • 提取码:moli
    需要注意的是,想要从上面下载文件,必须申请对应的开发者账号才行

3.2.2. 安装

这个TensorRT本质上是一组lib库和一组.h文件

复制文件

  • 将TensorRT/lib下面所有的lib复制到cuda v11.1/lib/x64目录下,
  • 将TensorRT/include下的所有.h文件复制到cuda/v11.1/include目录下

3.2.3. 添加环境变量

将TensorRT/lib的路径填入到path环境变量中

  • 这样TensorRT就算安装完成了

4. 下载项目

  • 首先下载YOLOv5-6.0原项目以及编译之后的项目
  • github.com/ultralytics/yolov5.git
  • GitHub - Monday-Leo/Yolov5_Tensorrt_Win10: A simple implementation of tensorrt yolov5 python/c++??
  • 同时下载yolov5s.pt权重文件

5. 生成WTS模型

  • 将仓库中的gen_wts.py和下载好的yolov5s.pt权重文件拷贝到yolov5 6.0的目录下
  • 运行下面的命令进行模型的转换
  • python gen_wts.py -w yolov5s.pt -o yolov5s.wts
  • 其中w参数为输入pt模型路径,-o参数为输出wts模型的路径。
  • 运行完成后,会在当前目录下生成一个yolov5s.wts的权重模型,这个模型就是用于之后转换为tensorrt的专用序列化模型

6. cmake

6.1. 生成Makefile

  • 在当前仓库下新建一个build文件夹

  • 打开Cmake,源文件选择本仓库目录,build选择刚新建的build目录

  • 修改configure

    选择自己需用的Visual Studio版本,以及编译平台,之后点击finish

  • 一段时间之后就可以完成了

6.1.1. 配置CMakeLists.txt

6.1.1.1. 修改编译依赖的路径

打开CMakeLists.txt,修改OpenCV、TensorRT、dirent.h的目录,其中dirent.h在本仓库的include中,需要注意的,这些路径都必须使用绝对路径,用\来分割路径。

6.1.1.2. 修改算力

具体数值参考
CUDA GPU | NVIDIA Developer
developer.nvidia.com/zh cn/cuda gpus#compute
进行设定
我这里RTX 2060的算力是75

所以修改arch=compute_75;code=sm_75

7. 编译

7.1. 修改源代码

  • 使用Visual Studio打开项目build文件夹中的sln文件

    搜索yololayer.h文件对其进行修改
  • 修改文件中的这些参数为自己的模型类别数、输入大小,
  • 如果使用的是官方预训练权重,那么不用修改。但如果是自己训练的模型不修改的话,之后是会报错的
static constexpr int CLASS_NUM = 80;
static constexpr int INPUT_H = 640;  // yolov5's input height and width must be divisible by 32.
static constexpr int INPUT_W = 640;

7.2. 生成exe

  • 将界面上方的debug改为Release,然后点击菜单栏处的生成-重新生成yolov5

编译成功


可以看到build/release文件夹下已经生成了对应的exe文件了

7.3. 生成engine

  • 将最开始生成的yolov5s.wts模型复制到exe所在的文件夹中,在这个目录中打开cmd输入
 yolov5 -s yolov5s.wts yolov5s.engine s

  • 我们这边使用的是s模型,最后则输入s,同理若为m模型,最后一个参数则需要改成m

  • 此时,程序会将wts转换为engine序列化模型,需要的时间比较久,千万不要因为等不及而关掉页面,那样就前功尽弃了,具体时间跟你的CPU性能有关系,总体说来大约需要等待30到40分钟,时间很久就不用一直在这等着了,可以先去干点其他事情,或者看一部电影

  • 我的电脑编译完成花了三十多分钟


  • 生成engine完成后,会在文件夹下出现yolov5s.engine的模型,

8. 推理

8.1. exe推理

  • 将仓库中的pictures文件夹复制到EXE文件夹项,尝试预测是否正确,输入
yolov5 -d yolov5s.engine ./pictures

  • 里面一共有两张图片,每一张的推理时间仅为4毫秒,也就是250FPS,这个速度可以说相当快了
  • 而且推理效果也是非常棒

8.2. Python 调用dll推理

  • 刚才将模型部署为C++之后,可以预测文件夹内的图片,但也仅仅局限于此,对于程序中的调用是没有办法做到的,而我们在做很多图像处理任务时候,其实是用的Python语言,因此,我们还应该进一步将模型部署到Python上面。

点击项目属性-

  • 将目标文件扩展名和配置类型由exe改为dll

    修改之后

  • 之后对项目进行重新生成

  • 生成完成后,会在文件夹下出现yolov5.dll的文件

  • 设置自己调用的dll路径以及需要预测的图像路径,这里需要注意的是, Detector类中model_path参数需要传入bytes类型的路径,b''表示将字符串转换为bytes类型 ,如果不加b’'的话,会导致TypeError: expected bytes, str found的错误。

 det = Detector(model_path=b"./yolov5s.engine",dll_path="./yolov5.dll")  # b'' is needed
img = cv2.imread("./pictures/zidane.jpg")

  • 将仓库根目录中的python_trt.py复制到dll文件所在的文件夹下
  • 运行代码,如果不报错的话,就会显示下面的检测结果,over,just enjoy it!

8.3. 性能测试

  • 最后我们来测试一下这个TensorRT的性能

  • 检测单张图片,加上读取图片的时间,一张图像也仅需要0.015s,也就是15毫秒,速度是真的快

  • 检测100张图片,仅需要1.65秒,

  • 这之前的速度还包括了读取数据的时间。如果把这部分时间去掉,速度又快了很多,真的是可以做到10毫秒之内就检测一张图片

  • 100张图片也仅需要0.58s,持续运行的话,FPS应该是170左右,也就是说在RTX2060Ti上面,这个速度真的是快到没朋友了~~~

  • 我觉得接下来我的Apex辅助应该可以做到实时检测了

9. 报错

  • Error in configuration process,project files may be invalid

  • CMake Error at CMakeLists.txt:3 (project):

  • Failed to run MSBuild command:

  • MSBuild.exe

  • 查看下面的报错信息,确定一下到底是哪个文件找不到

  • 添加 MSBuild.exe 的环境变量

D:\Program\VisualStudio2022\MSBuild\Current\Bin\amd64

之后重启电脑

  • 安装window SDK
    这个靠谱

  • No CUDA toolset found.

描述

Error in configuration process, project files may be invalid

CUDA_SDK_ROOT_DIR-NOTFOUND

  • Windows CMake编译错误:No CUDA toolset found解决方法_no cuda toolset found._Zirong.的博客-CSDN博客

  • 可能是自己安装cuda的时候没有勾上这个 CUDA toolset 吧,再重新安装一次就好了


    之后重启电脑

  • 如果依然报错的话,执行下面的步骤:

  • 将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\visual_studio_integration**MSBuildExtensions 里面的四个文件*手动复制到D:\Program\VisualStudio2022\MSBuild\Microsoft\VC\v170*BuildCustomizations

    大约20秒之后就可以成功了

  • 其他尝试过但是没用的策略
    使用旧版本的cmake

  • c - CUDA 在 Windows 上编译问题,Cmake 错误 : No CUDA toolset found - IT工具网

  • 3.17.1

  • 和版本没有关系,如果配置正确的话,高版本cmake也可以正常编译

  • 手动指定CUDA_SDK_ROOT_DIR
    将cuda卸载之后再重新安装
    使用Ubuntu来进行这个编译
    使用Visual Studio重新安装和cmake所有相关的文件

  • 由于找不到 cudnn64_8.dll,无法继续执行代码。重新安装程序可能会解决此问题。

  • 这个报错应该是下载的cudnn文件解压错的位置,重新安装 就好了

  • TensorRT was linked against cuBLAS/cuBLAS LT 11.3.0 but loaded cuBLAS/cuBLAS LT 11.2.1

  • 这个是警告,而非报错,最终可能会编译好,但是精度会受影响

  • 所以按照人家的要求,完完全全老老实实地选择对应的版本,cuda11.3,cuDNN 8.1.0

  • 修改正确cudnn之后少了一个报错

  • 再修改cuda为11.3 之后所有错误都没了


    一段时间之后也可以编译好了

  • CUDA lazy loading is not enabled. Enabling it can significantly reduce device memory usage. See CUDA_MODULE_LOADING in https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.htmlenv-vars

  • 换一个版本的TensorRT就好了

  • FileNotFoundError: Could not find module ‘E:\Documents\Desktop\Yolov5_Tensorrt_Win10-master\build\Release\yolov5.dll’ (or one of its dependencies). Try using the full path with constructor syntax.

使用绝对路径

并没有解决

  • Python版本太高,使用低版本的Python3.7就好了
    一般使用python3.7一下的版本不会报错,python3.8会报错,报错的原因是python3.8对其进行了安全性检查,
    具体原理可以查看看这篇博客 iyn.me/i/post 40.html

  • Python 3.8 变更了 Windows 下动态链接库 (DLL) 的加载规则。

  • 新的规则提高了安全性,默认情况下仅能从可信的位置(Trusted Locations)加载 DLL 依赖,一定程度上避免诸如 DLL 劫持之类的安全风险。

  • 可信的位置包括:

  • DLL 所在的路径(加载 DLL 时提供 DLL 的完整路径或部分路径,文件存在则该路径即可信)。

  • 使用 add_dll_directory() 添加的路径。

  • (系统可信位置)

  • OSError: [WinError -529697949] Windows Error 0xe06d7363

  • github.com/Monday Leo/Yolov5 Tensorrt Win10/issues/8

版本不兼容所致

需要保证编译过程中所用的Python版本和和最终推理使用的Python版本是同一个,否则可能会出现这个错误

  • 编译完成后,为什么build文件夹下没有sln文件
  • 因为只运行了configure,而没有运行generate

    generate之后就有了sln文件了
  • 仔细看一下运行过程,应该是有报错的
    Performing Test CMAKE_HAVE_LIBC_PTHREAD Failed

  • Visual Studio没有生成dll文件

  • 缺少必要的依赖库或者头文件

  • 有可能是上一步生成的sln文件本身就有问题

  • OSError: exception: access violation reading 0x0000000000000000

  • Win10 TensorRT-**8.4.3.1 **+ CUDA 11.7 + cudnn8.6.0.163

版本不匹配

  • 重新生成一次解决方案也许就好了
    很玄学,但的确就是这样
    2023.05.31-13:27:56
    啥也没动,突然之间就好了

10. 参考资料

本案例使用到的各种资源

  • 演示视频_哔哩哔哩_bilibili
  • GitHub - Monday-Leo/Yolov5_Tensorrt_Win10: A simple implementation of tensorrt yolov5 python/c++??
  • YOLOv5 Tensorrt Python/C++部署_yolov5 c++部署 tensorrt_一笑奈何LHY的博客-CSDN博客

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

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

相关文章

通过python采集1688商品评论数据封装接口、1688评论数据接口

1688商品评论数据是指在1688网站上对商品的评价和评论信息。这些信息包括买家对商品的使用、品质、包装、服务等方面的评价和意见,可以帮助其他用户更好地了解商品的优缺点和性能,从而做出更明智的购买决策。 1688网站是中国最大的B2B电子商务网站之一&…

RK3566调试EC20

参考博客:RK3568开发笔记-buildroot移远EC20模块调试记录 一、内核配置 cd 到kernel目录,执行make ARCHarm64 menuconfig, Device Drivers >USB support > USB Serial Converter support 选中 USB driver for GSM and CDMA modems选…

04.hadoop上课笔记之java编程和hbase

1.win查看服务 netstat -an #linux也有#R数学建模语言 SCALAR 2.java连接注意事项,代码要设置用户 System.setProperty("HADOOP_USER_NAME", "hadoop");3.伪分布式的好处(不用管分布式细节,直接连接一台机器…,适合用于学习) 4.官方文档 查看类(static |…

5个UI设计师必备的Figma汉化插件

即时设计插件广场提供了许多有用的 UI 插件,帮助优化产品设计过程。其中,产品组件库 Figma 汉化插件对常用的 PC 端和移动端组件进行了筛选,使其更加聚焦和精简。PC 端组件包括基础、按钮、菜单和其他元素,移动端组件包括基础、按…

电子阅读器calibre的使用技巧

十条calibre使用技巧: 1. 添加电子书:可以单独添加文件、添加文件夹、添加zipped书籍,或者通过网络链接直接添加。 2. 转换电子书格式:可以将电子书转换为不同的格式,如AZW3、EPUB、MOBI、PDF等。 3. 修改元数据&am…

文件夹加密超级大师的金钻加密和闪电加密有什么区别?

作为一款专业的文件夹加密软件,文件夹加密超级大师提供了5种文件加密类型,其中金钻加密和闪电加密在加密后效果看似差不多,那么它们有什么区别呢?下面我们就来了解一下吧。 闪电加密更快速 当我们想要加密那些超级庞大的文件夹时…

Docker安装kafka可视化管理工具 - Kafka Manager

说明:此处是在前面使用Docker安装kafka的基础之上,再来使用Docker安装kafka-manager 第一步:使用下述命令从Docker Hub查找镜像,此处我们要选择的是sheepkiller所构建的kafka-manager镜像 docker search kafka-manager 第二步&a…

人工智能生成内容(AIGC):概念、发展历史及其机遇、挑战与未来方向

人工智能生成内容(AIGC) 人工智能生成内容(Artificial Intelligence Generated Content, AIGC), AIGC 是指使用生成式 AI (Generative Artificial Intelligence, GAI) 技术生成的内容&#xff…

基于SSM+Vue前后端分离的勤工助学管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 Web服…

网络通信的序列化和反序列化

序列化与反序列化的定义 由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层,系统不认识对象,只认识字节序列,而为了达到进程通讯的目的,需要先将数据序列化,而序列化就是将对象…

【SpringBoot_Project_Actual combat】 Summary of Project experience_需要考虑的问题

无论是初学者还是有经验的专业人士,在学习一门新的IT技术时,都需要采取一种系统性的学习方法。那么作为一名技术er,你是如何系统的学习it技术的呢。 一、DB Problems 数据库数据类型与java中数据类型对应问题? MySql数据库和java…

在Centos Stream 9上Docker的实操教程(一) - 实操准备篇

在Centos Stream 9上Docker的实操教程 - 实操准备篇 认识Docker准备Centos Stream 9安装Docker更新仓库绕不开的HelloWorld结语 认识Docker 什么都要实操了,你还不知道Docker是什么?网上关于Docker的介绍一搜一大把,博主就不必浪费时间去侃侃…

sqlserver行列转换( unpivot 和 pivot)

1,unpivot 是将列转为行显示,很多时候,我们用多个列了显示同一个对象不同维度得数据,如果需要数据关联,肯定需要转为横向显示! 思路就是:有一列显示多列的名称,有一列显示列名对应的…

Redis发布订阅以及应用场景介绍

目录 一、什么是发布和订阅?二、Redis的发布和订阅三、发布和订阅的命令行实现四、发布和订阅命令1、subscribe:订阅一个或者多个频道2、publish:发布消息到指定的频道3、psubscribe:订阅一个或多个符合给定模式的频道4、pubsub&a…

通过facebook主页进行自己产品的推广可行吗?

首先,让我们明确结论:通过Facebook主页进行产品推广是可行的,但并不是必要的。为什么这么说呢? Facebook作为一个社交平台,其核心功能是连接人与人之间的关系,鼓励用户分享和互动。用户在Facebook上的活动主…

(学习日记)2023.04.23

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

实用可靠的安科瑞电动机保护控制器的应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:介绍了一种新型电动机保护器,兼有电流、电压、过载、短路保护功能。它集电流型和电压型电动机保护器优点于一身,对电源欠电压、过电压、断相起闭锁作用,它结构简单…

【测试报告】个人博客系统自动化测试报告

文章目录 项目背景项目功能测试计划功能测试测试用例执行测试的操作步骤 自动化测试设计的模块、自动化运行的结果、问题定位的结果自动化测试优点 项目背景 对于一个程序员来说,定期整理总结并写博客是不可或缺的步骤,不管是对近期新掌握的技术或者是遇…

C# 读取json格式文件

读取json格式文件 安装 Newtonsoft.Json 程序集 1. 选择界面下方的【程序包管理器控制台】页面,输入安装指令 Install-Package Newtonsoft.Json 2. 安装完成后,请确保在代码文件的顶部包含以下 using 指令: using Newtonsoft.Json; 创建读…

GCC如何生成并调用静态库

一,简介 本文主要介绍如何使用gcc编译代码生成静态库,并调用静态库运行的操作步骤。 二,准备工作 使用add.c和main.c生成test可行性文件的流程图: add.c文件的内容: #include "add.h"int add(int a, i…