【目标检测】使用TensorRT加速YOLOv5

前言

今天是程序员节,当然是以程序员的方式来度过节日。
很早就听说TensorRT可以加速模型推理,但一直没时间去进行实践,今天就来把这个陈年旧坑填补一下。

背景知识

在实践之前有必要了解一下相关知识。

TensorRT简介

TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架。我们利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速度[1]。

TensorRT支持几乎所有主流深度学习框架,将python框架转换成C++的TensorRT,从而可以加速推理。

在这里插入图片描述

具体而言,TensorRT主要做了以下几点来加快推理速度[1]:

在这里插入图片描述

  • 算子融合(层与张量融合):简单来说就是通过融合一些计算op或者去掉一些多余op来减少数据流通次数以及显存的频繁使用来提速
  • 量化:量化即IN8量化或者FP16以及TF32等不同于常规FP32精度的使用,这些精度可以显著提升模型执行速度并且不会保持原先模型的精度
  • 内核自动调整:根据不同的显卡构架、SM数量、内核频率等(例如1080TI和2080TI),选择不同的优化策略以及计算方式,寻找最合适当前构架的计算方式
  • 动态张量显存:我们都知道,显存的开辟和释放是比较耗时的,通过调整一些策略可以减少模型中这些操作的次数,从而可以减少模型运行的时间
  • 多流执行:使用CUDA中的stream技术,最大化实现并行操作

当然,TensorRT主要缺点是与特定GPU绑定[1],在不同型号上转换出来的模型不能通用(这一点笔者暂未去从实践证实)

TensorRT官方在其仓库提供了三个开源工具,之后有需要可以使用。

在这里插入图片描述
三个工具大致用途[1]:

  • ONNX GraphSurgeon
    可以修改我们导出的ONNX模型,增加或者剪掉某些节点,修改名字或者维度等等
  • Polygraphy
    各种小工具的集合,例如比较ONNX和trt模型的精度,观察trt模型每层的输出等等,主要用-来debug一些模型的信息
  • PyTorch-Quantization
    可以在Pytorch训练或者推理的时候加入模拟量化操作,从而提升量化模型的精度和速度,并且支持量化训练后的模型导出ONNX和TensorRT

ONNX简介

Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是微软和Facebook提出用来表示深度学习模型的开放格式,定义了一组和环境,平台均无关的标准格式,可使模型在不同框架之间进行转移[2]。

假设模型在 TensorFlow 中,但想要在TensorRT中使用,或者模型在PyTorch中,想要在TFLite中使用,就可以利用 ONNX 作为中介,进行模型转换。

典型的几个线路[3]:

  • Pytorch -> ONNX -> TensorRT
  • Pytorch -> ONNX -> TVM
  • TF -> onnx -> ncnn
  • Pytorch -> ONNX -> tensorflow

ONNX结构是将每一个网络的每一层或者每一个算子当作节点Node,再由这些Node去构建一个Graph,最后将Graph和这个onnx模型的其他信息结合在一起,生成一个model。

可以通过在线网站https://netron.app/来查看ONNX模型结构。

实践上手

下面来进行实践上手。

实验环境

这是我的电脑环境:

  • 操作系统:Windows10
  • 显卡:RTX2060
  • CUDA版本:11.6
  • Pytorch版本:1.7.1
  • Python版本:3.8

查看CUDA版本

TensortRT非常依赖CUDA版本,在安装之前,需要先查看本机安装好的CUDA版本,查看方式有多种,第一种方式可以通过NVIDIA 控制面板查看;第二种方式可以通过在控制台输入nvcc -V进行查看。

在这里插入图片描述

安装TensorRT

首先需要到Nvidia官网去下载对应Cuda版本的TensorRT安装包。

我这里下载的是红框选中的这一个,这个版本支持CUDA11.0-11.7

在这里插入图片描述
下载好后,将压缩包进行解压缩,然后到Anaconda环境中,以此进入到以下几个文件夹,安装这几个whl文件

cd TensorRT-8.4.3.1\python
pip install tensorrt-8.4.3.1-cp38-none-win_amd64.whl

cd TensorRT-8.4.3.1\graphsurgeon
pip install graphsurgeon-0.4.6-py2.py3-none-any.whl

cd TensorRT-8.4.3.1\onnx_graphsurgeon
pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl

cd TensorRT-8.4.3.1\uff
pip install uff-0.6.9-py2.py3-none-any.whl

然后需要移动安装包里的一些文件:

  • TensorRT-8.4.3.1\include中头文件拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include
  • TensorRT-8.4.3.1\lib中所有lib文件拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64
  • TensorRT-8.4.3.1\lib中所有dll文件拷贝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin

注:这里的v11.6根据自己的Cuda版本号即可

之后,需要手动将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin路径添加到用户Path环境变量中

在这里插入图片描述
添加完之后,重启电脑,让环境变量生效。

之后进行验证:

python
import tensorrt
print(tensorrt.__version__)

import时发生报错,

FileNotFoundError: Could not find: nvinfer.dll. Is it on your PATH?

此时只需要将缺少的文件找到,然后添加到上面的bin目录下即可,我这里是在安装的torch中lib文件下找到的部分文件,缺什么移什么即可。

如无报错,再次验证,可以输出tensorrt版本:

在这里插入图片描述

下面运行安装包里面的一个sample.py文件,以确保tensorrt能够正常工作。
进入到下图所示的路径,运行sample.py,如果正常输出,则代表tensorrt安装成功。

在这里插入图片描述

如果提示没装pycuda,还需要再安装一下

pip install pycuda

YOLOv5使用TensorRT加速

这部分内容看到不少博客都是用Cmake编译生成yolov5的VS工程,非常繁琐麻烦,主要是这些博文写作时间较早。
而在YOLOv5 6.0版本更新后,官方新增了一个export.py文件,支持大部分框架模型的导出,包括TensorRT。

下面我所使用的是YOLOv5官方最新的6.2版本。

下面直接导出官方提供的yolov5s模型试试,终端输入:

python export.py --weights yolov5s.pt --data data/coco128.yaml --include engine --device 0 --half

注:这里的--half表示半精度模型,使用半精度可以加快推理速度,但会损失一定精度,直接导出可以不加

初次导出,遇到如下报错

ONNX: export failure 0.4s: Exporting the operator silu to ONNX opset version 12 is not supported.

这个报错需要修改pytorch的激活函数,找到该函数位置:D:\anaconda\envs\pytorch\Lib\sitepackages\torch\nn\modules\activation.py(此处结合自己的anaconda实际安装位置来更改)

修改代码如下:

class SiLU(Module):

    __constants__ = ['inplace']
    inplace: bool
 
    def __init__(self, inplace: bool = False):
        super(SiLU, self).__init__()
        self.inplace = inplace
 
    def forward(self, input: Tensor) -> Tensor:
        # ------------------------------------- #
        # 把F.silu替换掉,修改后如下
        return input * torch.sigmoid(input)
 
        #原来的代码
        return F.silu(input, inplace=self.inplace)

再次导出,不再报错。

值得注意的是,YOLOv5并不会直接导出TensorRT模型,而是会先导出ONNX模型,然后将ONNX模型转换成TensorRT模型,因此导出完成后,会在模型位置处生成yolov5s.onnxyolov5s.engineyolov5s.engine就是可以用来直接推理的TensorRT模型。

经过实测,不添加半精度导出yolov5s模型花费时间99.5s,添加半精度之后,导出yolov5s模型花费时间404.2s。

实验结果

图片检测

首先是来检测一下图片的推理速度,首先修改detect.py,统计程序花费时间。

if __name__ == "__main__":
    begin_time = time.time()
    opt = parse_opt()
    main(opt)
    end_time = time.time()
    print("程序花费时间{}秒".format(end_time-begin_time))

然后依次使用不同模型进行推理

python detect.py --weights yolov5s.pt
python detect.py --weights yolov5s.engine
python val.py --weights yolov5s.pt
python val.py --weights yolov5s.engine

这里数据源选择的是coco128中128张图片,整体实验结果如下表所示:

模型推理花费时间(s)AP50
原始模型8.3971.4%
TensorRT(全精度)5.4571.1%
TensorRT(半精度)4.8370.8%

从数据可以发现,使用TensorRT加速之后,模型推理速度提升了约35%,但是模型精度并没有下降太多。coco数据集128张图片,模型训练和检测都是用同一份数据,这可能会对AP产生一定影响,于是再换用Visdrone数据集在进行实验。

下面对Visdrone数据集进行实验,使用yolov5m模型,训练100个epoch.

使用VisDrone2019-DET-test-dev中的1610张图片进行验证和检测:

验证命令:

python val.py --data data/VisDrone.yaml --weights runs/train/exp3/weights/best.engine --batch-size 4 --task test

使用VisDrone2019-DET-test-dev中的

检测命令:

python detect.py --weights runs/train/exp3/half/best.engine --source D:/Desktop/Work/Dataset/VisDrone/VisDrone2019-DET-test-dev/images --data data/VisDrone.yaml

实验结果如下表所示:

模型验证花费时间(s)PRAP50推理花费时间(s)
yolov5m101.2843.1%34.9%32.0%157.51
onnx156.1642.8%34.9%32.0%158.97
TensorRT(全精度)124.3742.8%34.9%32.0%144.93
TensorRT(半精度)127.8542.8%34.8%31.9%139.97

由表可见,使用TensorRT加速之后,推理速度提升约了10%,同时精度只掉了0.3%,AP50基本上变化不大。

下面选一张图片来直观对比一下,左侧图为原始模型推理图,右侧图为TensorRT(半精度) 推理图,两者大致上差异不大,各有各的漏检对象。

在这里插入图片描述

视频检测

视频检测用了王者荣耀数据集做一个实验,比较了常规检测,tensorrt和onnx推理速度和帧率。推理所花费的时间分别为:

  • 常规推理 程序花费时间20.88s
  • onnx推理 程序花费时间25.68s
  • tensorrt推理 程序花费时间16.03s

视频帧率如下视频所示:

YOLOv5:使用TensorRT加速效果对比

综合比较来看,tensorrt的推理速度最快,并且帧率会比原本检测帧率提升约20%左右,而用onnx模型推理,速度和帧率反而会变慢,这一点我是存在一些疑问的,看到一些博客说onnx模型对比pytorch模型速度更快,但我的实验结果并非如此,个人猜测是pytorch对模型优化已经做得比较出色,onnx模型作为一个通用标准模型,为了翻译功能,损失了部分性能。

参考

[1]TensorRT详细入门指北:https://blog.csdn.net/IAMoldpan/article/details/117908232
[2]ONNX简介:https://blog.csdn.net/qq_29258377/article/details/122907981
[3]ONNX简明教程:https://blog.csdn.net/xjm850552586/article/details/114898679

### 回答1: 很抱歉,我是一名语言模型AI,无法进行操作和编程。但是,我可以为您提供一些相关信息。TensorRT是一种高性能深度学习推理库,可以加速模型的推理速度。YoloV5是一种目标检测算法,可以用于检测图像或视频中的物体。在Windows上使用TensorRT加速YoloV5,您需要先安装TensorRTYoloV5,并将YoloV5模型转换为TensorRT格式。然后,您可以使用TensorRT API加载和推理模型,从而加速YoloV5的推理速度。具体操作步骤可以参考TensorRTYoloV5的官方文档。 ### 回答2: TensorRT是NVIDIA为深度学习框架提供的高性能推理引擎。YoloV5是一种经典的目标检测算法,具有较高的准确率和实时性能。在Windows系统中,使用TensorRT可以加速YoloV5的推理速度,以实现更高效的目标检测。 要在Windows上使用TensorRT加速YoloV5,需要执行以下几个步骤: 1. 安装TensorRT和深度学习框架:在Windows系统中,TensorRT可以通过官方网站下载安装包进行安装。目前,TensorRT支持PyTorch、TensorFlow等多种深度学习框架,用户应根据自己的需要选择合适的框架。 2. 编译YoloV5YoloV5的源代码可以从官方GitHub库中获取。在Windows系统中,需要使用Visual Studio等工具编译源代码,并生成可执行文件。 3. 应用TensorRT进行推理加速:将编译后的YoloV5可执行文件加载至TensorRT中,并使用NVIDIA GPU进行推理加速。 在使用TensorRT加速YoloV5时需要注意的一些问题: 1. 版本兼容性:TensorRT和深度学习框架的不同版本可能存在兼容性问题,用户需要根据官方文档提供的信息选择合适的版本。 2. TensorRT配置:用户需要根据自己的硬件配置和应用场景,对TensorRT引擎进行合理的配置。主要包括模型优化、内存使用方式、线程数等方面。 3. 精度损失:使用TensorRT进行推理加速可能会导致精度的损失,用户需要评估自己的应用场景,权衡速度和精度之间的平衡。 综上所述,使用TensorRT加速YoloV5是一种有效的推理加速方法,在Windows系统中也可以实现。用户需要根据自己的实际需求和硬件配置,选择合适的TensorRT版本和深度学习框架,进行相关的配置和优化,以获得最佳的性能和精度。 ### 回答3: 近年来,深度学习在计算机视觉领域得到广泛应用,如物体检测、图像分类等。其中,Yolo系列算法以其速度快、效果好、精度高等优点受到了广泛关注和应用。但是,Yolo系列算法在运行速度方面还有提升的空间。此时,选用TensorRT工具可以对Yolo系列算法进行优化加速TensorRT是Nvidia针对深度学习推理领域开发的一款高性能优化工具,可以将训练好的深度学习模型进行优化后加速模型推理的过程,可以显著提高推理速度和效率。而Yolov5算法是基于PyTorch框架实现的,因此TensorRT需要与PyTorch框架进行结合使用。由于TensorRT在Windows系统中的使用不太友好,本文将对如何在Windows上使用TensorRT加速Yolov5算法进行详细解释。 首先,搭建深度学习环境:安装pytorch、Cuda、cudnn等环境及其依赖项; 其次,生成ONNX模型文件:使用Pytorch训练好的Yolov5模型需要转化为ONNX格式,这个可以使用torch.onnx.export()函数进行转换。 然后,生成TensorRT模型文件:在生成ONNX模型的基础上使用TensorRT的创建推理引擎工具create_inference_engine.py进行转换。 最后,利用TensorRT加速推理过程:在代码中使用TensorRT推理引擎,并比较与未使用TensorRT加速时的运行时间。 需要注意的是,在使用TensorRT优化Yolov5模型时需要调整一些参数,例如batch size、max workspace size等,以及根据硬件环境进行优化,可参考TensorRT官方文档和案例。 总的来说,使用TensorRT可以显著提高Yolov5算法的推理速度和效率,对于实时热点视频监控、智能安防等方面的应用具有重要意义。同时,TensorRT在Windows系统上的使用虽然存在一些不便,但只要按照步骤进行操作,还是能够顺利完成优化加速过程。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zstar-_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值