Yolov5的tensorRT加速(python)

地址:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5
下载yolov5代码

方法一:使用torch2trt

安装torch2trt与tensorRT

参考博客:https://blog.csdn.net/dou3516/article/details/124538557

  • 先从github拉取torch2trt源码
    https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py install

运行的时候会报错

ModuleNotFoundError: No module named ‘tensorrt‘

则需要python安装tensorRT,这一步我卡了很久,踩了坑,因为根据网上的解决办法,都类似于下面这种pip install tensorrt或者pip install nvidia-tensorrt,然后执行这种命令会没有明确报错信息就终止了
在这里插入图片描述
然后我考虑是不是因为不是在管理员权限下运行的原因,因为有的python库是需要现场编译的,如果没有足够权限会编译失败,例如lanms库便是如此,我之前有写过博客详细解析如何编译lanms库(http://t.csdn.cn/PXD8v)
但是在更改管理员权限后仍然会报相同的错,说明不i是这个问题。
然后我突然转变了思路,不是去搜索这个报错的解决办法,而是直接去搜索如何安装python版本的tensorRT,找到了解决问题的方法http://t.csdn.cn/ePPqa,前提是你得事先安装好cuda,cudnn,tensorRT,相关教程我也在博客中提到过(http://t.csdn.cn/nMr7o)
简单的说就是找到安装tensorRT时下载的文件夹
在这里插入图片描述
在这里插入图片描述
我的python是3.7版本所以选择tensorrt-8.4.1.5-cp37-none-win_amd64.whl

pip install tensorrt-8.4.1.5-cp37-none-win_amd64.whl

即可将python版本的tensorrt安装完成

  • 测试是否安装完成
    在这里插入图片描述
    如果import tensorrt没有报错,就成功了。
    继续
python setup.py install

在这里插入图片描述
torch2trt也安装完成

  • 使用测试代码测试demo能否成功跑通
import torch
from torch2trt import torch2trt
from torchvision.models.alexnet import alexnet
import time# create some regular pytorch model...
model = alexnet(pretrained=True).eval().cuda()# create example data
x = torch.ones((1, 3, 224, 224)).cuda()# convert to TensorRT feeding sample data as input
model_trt = torch2trt(model, [x])t0 = time.time()
y = model(x)
t1 = time.time()
y_trt = model_trt(x)
t2 = time.time()print(t2-t1,t1-t0)
# check the output against PyTorch
print(torch.max(torch.abs(y - y_trt)))

跑这个demotorch2trt倒是没有问题,但是报错显示cuda用不了
在这里插入图片描述
然后在网上搜到用这几句进行测试

import torch
print(torch.__version__)
print(torch.cuda.is_available())

打印出以下结果,首先要考虑的是是否安装了cuda与cudnn,前面我已经明确安装好了,所以接下来考虑的是我安装成pytorch的cpu版本了,我应该再安装gpu版本
在这里插入图片描述
登录pytorch官网 https://pytorch.org/get-started/locally/#supported-windows-distributions
在这里插入图片描述
根据cuda版本复制命令进行下载,如果不是当前页面的版本,点我画的绿色框位置找以前的cuda版本进行下载
在这里插入图片描述
我的cuda是11.6,平台是windows用pip下载,所以我复制这个命令

pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

下载成功后再测试
在这里插入图片描述
说明pytorch的gpu版本安装完成
参考博客:https://blog.csdn.net/moyong1572/article/details/119438286

  • 然后再跑demo,出现结果
    在这里插入图片描述
    则说明环境都没有问题了。

跑通yolov5原本代码

源代码地址:https://github.com/ultralytics/yolov5
首先

python detect.py

在这里插入图片描述
找不到模型会直接在github下载,然而大家也知道在github下的一般很难下载的动,
在这里插入图片描述
又看到代码知可输入参数,于是直接在命令行指定模型和测试图片

python detect.py --weights D:\wjp_code\tensorrtx-master\yolov5-master\model\yolov5s.pt --source D:\wjp_code\tensorrtx-master\yolov5-master\data\images\zidane.jpg

又开始报
在这里插入图片描述
参考了一个博客很好的解决了这个问题https://blog.csdn.net/Joseph__Lagrange/article/details/108255992
就是使用的模型有点问题,不要用27.1MB的,而是要用14.4MB的,下载地址在这里https://github.com/ultralytics/yolov5/releases/tag/v3.0
在这里插入图片描述
然后再运行上面的指令
在这里插入图片描述
没有报错,运行成功。

改yolov5代码,增加调用tensorrt的功能

参考了https://blog.csdn.net/qq_34919792/article/details/120650792
修改模型的部分

1.第一处修改(detect.py)

先引入需要的库和之前引出来的代码写成函数备用,有很多懒得从网络读了比如stride,就直接定义了。
在这里插入图片描述

#-----------------------------1----------------------------------------------
from torch2trt import torch2trt
import yamldef _make_grid(nx=20, ny=20):yv, xv = torch.meshgrid([torch.arange(ny), torch.arange(nx)])return torch.stack((xv, yv), 2).view((1, 1, ny, nx, 2)).float()def translate_to_pred(x,anchor):z = []stride = [8,16,32]for i in range(len(x)):bs, na, ny, nx, no = x[i].shapegrid = _make_grid(nx, ny).to(x[i].device)y = x[i].sigmoid()y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + grid) * stride[i]  # xyy[..., 2:4] = (y[..., 2:4] * 2) ** 2 * anchor[i]  # whz.append(y.view(bs, -1, no))return torch.cat(z, 1)
#---------------------------------------------------------------------------

2.第二处修改(detect.py)

在进入处理之前读取下anchor和设置下状态变量
在这里插入图片描述

#------------------------2---------------------------------------------------------------------# for tensorRTset_model = 1 #为了在第一张图片完成模型转换,后面就不处理了。with open("models/hub/anchors.yaml") as f:yaml_inf = yaml.load(f, Loader=yaml.SafeLoader)anchors = torch.tensor(yaml_inf["anchors_p5_640"]).float().view(3, 1, -1, 1, 1, 2).cuda()# for path, img, im0s, vid_cap in dataset: 加在这一句之前
#---------------------------------------------------------------------------------------------

3.第三处修改(detect.py)

修改模型推理
在这里插入图片描述

            #--------------------3---------------------------------------------------------------if set_model == 1:model_trt = torch2trt(model, [im])set_model = 0pred = model_trt(im)pred = translate_to_pred(pred,anchors)#-----------------------------------------------------------------------------------

4.第四处修改(models/yolo.py)

修改里面的Detect的forward,把不能加速的拿出来
在这里插入图片描述

    def forward(self, x):z = []self.training != self.exportfor i in range(self.nl):x[i] = self.m[i](x[i])bs, _, ny, nx = x[i].shapex[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0,1,3,4,2).contiguous()return x

再用命令运行

python detect.py --weights D:\wjp_code\tensorrtx-master\yolov5-master\model\yolov5s.pt --source D:\wjp_code\tensorrtx-master\yolov5-master\data\images\zidane.jpg

能成功跑通了,但是识别结果有问题,稍后再处理
在这里插入图片描述
其他算子的解决办法https://blog.csdn.net/weixin_44886683/article/details/116590851
Hardswish算子的解决办法(没看懂)https://github.com/NVIDIA-AI-IOT/torch2trt/issues/426
官方conventers地址 https://nvidia-ai-iot.github.io/torch2trt/master/converters.html

方法一:pt转onnx再转成trt推理引擎(pytorch model–>onnx file–>TensorRT engine)

参考博客https://blog.csdn.net/qq_39056987/article/details/111362848
源码地址
https://github.com/TrojanXu/yolov5-tensorrt
c++版本
https://zhuanlan.zhihu.com/p/430470397
在这里插入图片描述
改一下模型和图片位置就可以直接跑了
我这边跑的结果输出为空,还需要找一下原因
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十四天|理论基础 77. 组合

理论基础 其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法(理论篇…

函数栈帧(详解)

一、前言: 环境:X86Vs2013 我们C语言学习过程中是否遇到过如下问题或者疑惑: 1、局部变量是如何创建的? 2、为什么局部变量的值是随机值? 3、函数是怎么传参的?传参的顺序是怎样的? 4、形…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(三)

五、旋转手势(RotationGesture) RotationGesture(value?:{fingers?:number; angle?:number}) 旋转手势用于触发旋转手势事件,触发旋转手势的最少手指数量为2指,最大为5指,最小改变度数为1度,拥有两个可…

3D异常检测论文笔记 | Shape-Guided Dual-Memory Learning for 3D Anomaly Detection

文章目录 摘要一、介绍三、方法3.1. 形状引导专家学习3.2. Shape-Guided推理 摘要 我们提出了一个形状引导的专家学习框架来解决无监督的三维异常检测问题。我们的方法是建立在两个专门的专家模型的有效性和他们的协同从颜色和形状模态定位异常区域。第一个专家利用几何信息通…

机器学习笔记:node2vec(论文笔记:node2vec: Scalable Feature Learning for Networks)

2016 KDD 1 intro 利用graph上的节点相似性,对这些节点进行embedding 同质性:节点和其周围节点的embedding比较相似 蓝色节点和其周围的节点结构等价性 结构相近的点embedding相近 比如蓝色节点,都处于多个簇的连接处 2 随机游走 2.1 介绍…

『C语言进阶』指针进阶(一)

🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…

《机器人学一(Robotics(1))》_台大林沛群 第 5 周【机械手臂 轨迹规划】 Quiz 5

我又行了!🤣 求解的 位置 可能会有 变动,根据求得的A填写相应值即可。注意看题目。 coursera链接 文章目录 第1题 Cartesian space求解 题1-3 的 Python 代码 第2题第3题第4题 Joint space求解 题4-6 的 Python 代码 第5题第6题其它可参考代…

编写软件检测报告有哪些注意事项?软件检测报告获取

软件检测报告是指把测试的过程和结果写成文档,对发现的问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。 一、编写软件检测报告的注意事项 1、报告的结构要合理和清晰。应该按照一定的逻辑顺序&…

解决 Spring Boot 与 springfox 的 NullPointerException 问题

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

MySQL误删数据 回滚

前言 生产环境数据库不允许删除表,可以将表修改成 XXX_to_delete 如果误删简单数据,可以考虑使用binlog恢复 一、查看命令 1.查看binlog是否开启 show variables like log_bin;切换到MySQL安装目录,查看mysqlbinlog日志文件 2.查看所有 binlog 日志…

Ansible学习笔记12

playbook: playbook(剧本):是ansible用于配置、部署和管理被控节点的剧本,用于Ansible操作的编排。 使用的是yaml格式,(saltstack、elk、docker、docker-compose、k8s都会使用到yaml格式。&am…

【c++ debug】cmake编译报错 No such file or directory

1. 报错:error while loading shared libraries: libprotoc.so.24: cannot open shared object file: No such file or directory 问题原因:找不到动态库 解决方法:添加动态库路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/your/protobuf/l…

【C语言】入门——结构体

目录 结构体 为什么有结构体? 1.结构体的声明 1.2结构体变量的访问和初始化 2.结构体成员的访问 结构体 struct 结构体类型 {//相关属性; }结构体变量; 结构体和数组不同,同一类型的数据的集合是数组; 结构体是多种类型的数据的集合&…

【Java Web】统一处理异常

一个异常处理的ControllerAdvice类。它用于处理Controller注解的控制器中发生的异常。 具体代码功能如下: 导入相关类和方法。声明一个Logger对象,用于日志记录。使用ExceptionHandler注解标记handleException方法,用于处理所有异常。 -嘛在…

C++——shared_ptr:make_shared的用处,与shared_ptr直接构造的区别

shared_ptr shared_ptr继承自__shared_ptr,其中有两个对象,一个是指向资源的指针,一个是控制块,指向一个引用计数对象。控制块中存储了强引用和弱引用的计数,强引用Uses代表shared_ptr对象的引用计数,弱引…

每日一题 1921. 消灭怪物的最大数量

难度:中等 思路: 已知速度和距离,可求时间必定先消灭时间最短的怪物求得时间数组排序,只要在第 i 秒时,time[i] > i ,那么就可以消灭第 i 个怪物 代码: class Solution:def eliminateMax…

Leetcode刷题笔记--Hot41-50

1--二叉树的层序遍历(102) 主要思路: 经典广度优先搜索,基于队列; 对于本题需要将同一层的节点放在一个数组中,因此遍历的时候需要用一个变量 nums 来记录当前层的节点数,即 nums 等于队列元素的…

存储过程报Illegal mix of collations错误的解决方法

CREATE PROCEDURE maxAgeStudent(IN _gender CHAR) BEGINDECLARE maxage INT DEFAULT 0;SELECT max(age) INTO maxage FROM student where gender _gender;SELECT * from student WHERE age maxage and gender _gender; END; 在调用的时候 call maxAgeStudent(1) 产生了报…

Linux之DNS域名解析服务

目录 Linux之DNS域名解析服务 概述 产生原因 作用 连接方式 因特网的域名结构 拓扑 分类 域名服务器类型 ​编辑 DNS域名解析过程 分类 解析图 搭建DNS域名解析服务器 概述 安装软件 bind服务中三个关键文件 主配置文件分析 一般需要修改三部分:…

核辐射检测仪电子测量方案

核辐射检测仪又名辐射检测仪,主要是安检、海关、实验室、金属探测公司等行业使用。但由于2023年8月24日排放核废水,导致海洋遭受核辐射污染,由于大海的净化能力有限,则会导致核废水有可能随着洋流的运动,会流至我国海域…