YOLOv4 tensorrt推理 python版【附代码】

2023-11-18

学了几天的tensorRT,又经过了几天的努力终于实现了YOLOv4 tensorRT推理,这篇文章将把这些成果开源出来,供大家免费使用。

YOLOv4代码我采用的是b站up主Bubbliiiing,相信大家应该都比较熟悉这位大佬。

关于trt的推理部分我是参考了官方YOLOV5 6.2版本。

有关YOLOv4的libtorch部署可以参考我另一篇文章:YOLOV4 libtorch

有关YOLOv4剪枝参考我另一篇文章: YOLOV4剪枝

剪枝以后的模型也可以用tensorrt进行推理【理论是可行的,虽然我还没试】 


环境说明

windows10

cuda10.2

cudnn8.2.1

pytorch1.7

tensorrt8.2.5.1

python 3.7

显卡:NVIDIA 1650 4G(比较拉跨)

注:linux下我还没有试,可能有些代码需要改,而且trt的版本也会受影响


  tensorrt安装可以看我另一篇文章:tensorrt安装与yolov5部署C++

 注意python版本的在下载完tensorrt后的文件夹中有个python文件夹,然后用pip安装【注意:TRT应该是8.2X以上可以安装python般的,其他的是C++】

其他tensorrt的学习资料可以看我tensorrt专栏。


目录

torch2onnx

torch推理

onnx推理

engine推理

检测结果:

代码:

权重:

所遇问题:


torch2onnx

改功能的实现在torch2onnx.py中。

你需要修改的地方有:

simplity:是否开启simplity模式

output_path: # 输出onnx路径

num_classes: # 类的数量

ckpt_path: # torch权重路径

input_shape: # 输入网络图像尺寸大小

python torch2onnx.py


转换过程如下:
graph(%images : Float(1:1108992, 3:369664, 608:608, 608:1, requires_grad=0, device=cpu),
      %yolo_head3.1.weight : Float(255:256, 256:1, 1:1, 1:1, requires_grad=1, device=cpu),
      %yolo_head3.1.bias : Float(255:1, requires_grad=1, device=cpu),
      %yolo_head2.1.weight : Float(255:512, 512:1, ...
```

可以通过Netron工具对onnx可视化


 onnx2engine

改功能的实现在onnx2trt.py中。

你需要修改的地方有:

onnx_path: # onnx文件路径

engine_path: # 输出engine路径

python onnx2trt.py

生成engine的时间比较长,在我电脑上大概用了10分钟左右,如果用trtexec也可以生成engine,这个构建时间会快很多。 


推理功能在predict.py中。

参数说明:
--weights: # 权重路径
--img: # 开启图像预测
--video: # 开启视频预测
--video_path: # 视频路径
--fps: # FPS测试
--onnx: # 开启onnx推理
--engine: # 开启trt预测
--input_shape: # 输入大小,默认608 * 608
--conf: # 置信度阈值
--nms: # NMS阈值

torch推理

图像推理:

python predict.py --weights model_data/yolo4_weights.pth --img --conf 0.5 --nms 0.4

视频推理:

python predict.py --weights model_data/yolo4_weights.pth --video --video_path 0

FPS测试:

python predict.py --weights model_data/yolo4_weights.pth --fps

onnx推理

图像推理:

python predict.py --weights model_data/yolov4.onnx --img --conf 0.5 --nms 0.4

视频推理:

python predict.py --weights model_data/yolov4.onnx --video --video_path 0

FPS测试:

python predict.py --weights model_data/yolov4.onnx --fps

engine推理

图像推理:

python predict.py --weights model_data/yolov4.engine --img --conf 0.5 --nms 0.4

视频推理:

python predict.py --weights model_data/yolov4.engine --video --video_path 0

FPS测试:

python predict.py --weights model_data/yolov4.engine --fps

检测结果:


代码:

git clone https://github.com/YINYIPENG-EN/YOLOv4_tensorRT_pytorch.git

权重:

链接:https://pan.baidu.com/s/1mlBMuiKqH3glZPqFGunXmw 
提取码:yypn

项目新增加了语音报警功能【看v2.0版本即可】

v2.0下载:

git clone --branch v2.0 https://github.com/YINYIPENG-EN/YOLOv4_tensorRT_pytorch.git

项目新增:目标跟踪(利用iou进行跟踪),可选用diou。看v3.0版本

git clone --branch v3.0 https://github.com/YINYIPENG-EN/YOLOv4_tensorRT_pytorch.git

 运行(可结合其他功能使用):

python predict.py --weights [weight path] --video --video_path 0 --engine --track --track_class

 

说明:本项目暂时未添加动态输入

所遇问题:

如果报下面的错误:

一般有这么几种情况:

1.cuda10.2需要打两个补丁(官网就有)

2.如果打了补丁还报错,一种是可能遇到了不支持的算子,一种是内存不够。

我trt8.2x版本中发现如果有包含全连接层的onnx不能转成engine,即便用trrexec强行转也会报这种错误,但如果我把全连接层用卷积层代替就没问题,我不知道更高版本的会不会解决这个问题。


[10/21/2022-18:32:29] [TRT] [E] 2:[ltWrapper.cpp::nvinfer1::rt::CublasLtWrapper::setupHeuristic::334] Error C
ode 2: Internal Error (Assertion cublasStatus == CUBLAS_STATUS_SUCCESS failed. )

 刚开始在用trt推理的时候发现准确率极差,但onnx和torch都很正常,于是我将预测代码中的图像处理由PIL度图像方式改为了opencv后有非常大的改善,但出现慢屏的框,于是通过分析onnx和engine推理的ouputs发现engine将yolo 的三个head顺序颠倒了,这个问题不知道为什么,重新调整顺序后就可以正常检测了【不过在测试FPS和map部分我没修改图像处理代码,因为FPS就只是算个model推理时间而已不用管他推理结果好坏,而测试map部分还是建议大家用训练torch模型测试或者你自己修改也可以】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv4 tensorrt推理 python版【附代码】 的相关文章

随机推荐

  • C# 监听http请求

    直接上代码 public partial class FrmHome Form HttpListener verifyHttplisten private object listenLocker new object Thread Thre
  • vscode go mod报错(萌新)

    出现如下报错信息 gopls was not able to find modules in your workspace When outside of GOPATH gopls needs to know which modules y
  • Arduino 运行 Rust

    项目设置 首先 我们将通过运行来创建一个新的 cargo 项目 我们需要为 avr 目标 目标三元组 avr unknown unknown 交叉编译我们的项目 为此 我们需要切换到 nightly 工具链 因为一些依赖包使用不稳定的功能来
  • 浅谈Java平台无关性

    为什么Java要支持平台无关性 众所周知 Java是平台无关的语言 那么Java为什么要支持平台无关性 总结一下 有如下几点 支持多变的网络环境 如今是一个互联网的时代 网络将各种各样的计算机和设备连接起来 比如网络连接了windows的P
  • 仪表放大器 电流的检测

    完美的减法运算放大电路 引入缓冲器 固定增益的双运放仪表放大器 12倍放大 电流的检测 错误接法 正确接法
  • LVS的原理

    一 LVS的介绍 linux virtual server简称LVS Internet的快速增长使多媒体网络服务器面对的访问数量快速增加 服务器需要具备提供大量并发访问服务的能力 因此对于大负载的服务器来讲 CPU I O处理能力很快会成为
  • 最火爆的开源流式系统Storm vs 新星Samza

    分布计算系统框架 按照数据集的特点来说 主要分为data flow和streaming两种 data flow主要是以数据块为数据源来处理数据 代表有 MR Spark等 我称作它们为大数据 而streaming主要是处理单位内得到的数据
  • Python每日一题 - 9 - 暂停5秒输出问题

    前言 本人因喜欢python和c语言等程序设计语言 希望能够在这里和大家共同学习共同进步 因个人喜好喜欢做题 所以想出一个系列专栏关于python的习题专集 希望大家喜欢 希望能在这里分享学习的一些知识碎片 接触时间不长 如果文章有任何错误
  • java中的八种数据类型、变量与常量

    内存空间所占字节数 8位等于1字节 数值型 1 整数类型 byte 1 short 2 int 4 long 8 2 浮点类型 float 4 double 8 字符型 char 2 布尔型 boolean 1或4 取值范围 byte 12
  • vue3.0全局引入sass

    在项目开发过程中 有一些共同的sass样式我想抽出封装到一个文件 利用sass的mixin语法来封装变量 但是在这个过程中一直会报错 先是识别不出来 mixin 和 include 后来是报错sass等一些插件的问题 后来是这样解决的 首先
  • C++ 简介

    C c plus plus 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 支持过程化编程 面向对象编程和泛型编程 C 被认为是一种中级语言 它综合了高级语言和低级语言的特点 C 是由 Bjarne Stroustrup
  • 模仿苹果手机虚拟键的代码分享,有兴趣的可以玩玩。 下面的是链接,复制粘贴到浏览器就能下载...

    http files cnblogs com files godlovexq 模仿苹果虚拟home键的效果有解释的 zip 转载于 https www cnblogs com godlovexq p 5252782 html
  • C语言函数大全-- i 开头的函数

    i 开头的函数 1 imagesize 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 initgraph 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 inport 3 1 函数说明 3 2 演示示例 4 insli
  • 再探ROP(上)

    0x00 前言 毕设和论文要搞吐了 再加上实习工作上的事情 近期又要开始准备HW的事情 只能先更新一部分 0x01 从x86到x64 之前的rop都是32bit的程序 由于这篇文章涉及的方法用于64bit的程序 这里先说一下两者的区别 做一
  • 数值分析(10)-数值微分

    整理一下数值分析的笔记 目录 1 误差 2 多项式插值与样条插值 3 函数逼近 4 数值积分与数值微分 THIS 5 线性方程组的直接解法 6 线性方程组的迭代解法 7 非线性方程求根 8 特征值和特征向量的计算 9 常微分方程初值问题的数
  • Docker - 超轻量中文ocr开源项目 chineseocr_lite 搭建

    Docker 超轻量中文ocr开源项目 chineseocr lite 搭建 一 OCR Docker 部署 二 Flask RESTful API demo chineseocr lite 源码地址 https github com ou
  • Qt/C++使用QUiLoader动态加载ui资源文件

    目录 动态对话框 使用场景 注意事项 动态对话框加载 获取动态对话框的控件对象 与动态对话框建立关联 动态修改ui资源文件效果测试 动态对话框 动态对话框 dynamic dialog 就是在程序运行时使用的从Qt设计师的 ui文件创建而来
  • Linux命令 - zip命令

    Linux命令 zip命令 Linux中 zip 命令是个使用广泛的压缩程序 文件经它压缩后会另外产生具有 zip 扩展名的压缩文件 1 语法 zip 参数 文件或目录 2 功能 可以压缩文件且保留源文件 3 参数 A 调整可执行的自动解压
  • 信号完整性揭秘:于博士SI设计手记----阅读笔记

    文章目录 1 概述 2 数字信号的频谱与带宽 3 传输线 1 概述 1 尽管信号是数字的 但是承载这些信息的电压或电流波形是模拟的 2 SI的根本问题 是信号的上升时间减小了 上升时间越小 信号中包含的高频成分越多 导致的互相耦合得到的畸变
  • YOLOv4 tensorrt推理 python版【附代码】

    学了几天的tensorRT 又经过了几天的努力终于实现了YOLOv4 tensorRT推理 这篇文章将把这些成果开源出来 供大家免费使用 YOLOv4代码我采用的是b站up主Bubbliiiing 相信大家应该都比较熟悉这位大佬 关于trt