前言 今日这儿首要介绍运用Python布置TensorRT的模型以及运用C++布置TensorRT的模型这两种办法。其实在日常布置的工作中,更多是运用C++进行布置,由于这样能够愈加丝滑地迁移到硬件上进行编译运用。
又由于咱们一般是布置在Linux平台上,不管是服务器仍是边际设备,运用的体系大多都是Linux操作体系。因此在本文的前一小部分还会讲述怎么在Linux进行cuda、cudnn、TensorRT的装置,来让咱们在环境装备时少走一些弯路。

欢迎重视大众号CV技能攻略,专注于核算机视觉的技能总结、最新技能盯梢、经典论文解读、CV招聘信息。

核算机视觉入门1v3辅导班

本教程禁止转载。一起,本教程来自常识星球【CV技能攻略】更多技能教程,可参加星球学习。

cuda环境装备

下载cuda

在官网 developer.nvidia.com/cuda-toolki… 挑选适宜的cuda进行装置。

装置

运用以下指令进行装置:sh cuda_11.0.2_450.51.05_linux.run,接下来会问你是否赞同,你直接按Enter回车赞同就能够了。

在装置的选项中,留意,除了不装置驱动,其他都挑选装置。

环境变量设置

装置完毕后,回到终端打开~.bashrc,进行环境变量的设置:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

保存后退出,并激活环境变量 :source ~/.bashrc

验证

在终端上输入指令:nvcc -V,假如成功打印出版别信息,并且没有报错的话就证明装置成功。

cudnn环境装备

下载cudnn

去官网中下载符合你平台的cudnn:developer.nvidia.com/rdp/cudnn-a…

解压装置

下载完之后就能够进行解压,解压完结后会得到一个cuda文件夹。解压指令如下:tar -zxvf cudnn-10.2-linux-x64-v8.0.3.33.tgz咱们知道,下载了cudnn之后需求将里边的文件拷贝到cuda中。所以需求履行以下指令:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

检查cudnn的版别

装置结束后检查cudnn的版别,来验证是否正确装置。

cat /usr/local/cuda-10.1/include/cudnn.h | grep CUDNN_MAJOR -A 2

TensorRT环境装备

下载TensorRT

第一步同样是下载。依据你的cuda版别和cudnn版别去TensorRT的官网 developer.nvidia.com/tensorrt 挑选对应版别的装置包。

进行解压

解压指令如下:tar -zxvf TensorRT.tar.gz

环境变量设置

完结解压后依旧要增加到环境变量中:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

退出保存后:source /etc/profile

除了/etc/profile,也能够经过修正~/.bashrc来进行设置。

/etc/profile此文件为体系的每个用户设置环境信息,当第一个用户登录时,该文件被履行。而~/.bashrc:该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,都会读取这个文件。

/etc/profile只会在用户登录时履行一次,并且在每次修正后都需求从头source来激活;而~/.bashrc在用户每次登录以及打开终端窗口时都会履行。

装置TensorRT下的whl

这儿需求为Python装置运转TensorRT的必要包。

进入到tensorRT下的python文件夹,并依据python版别装置适宜的包pip install tensorrt-8.2.1.8-cp38-none-linux_x86_64.whl

一起装置uff和graphsurgeon同样,tensorRT下有uff和graphsurgeon文件夹,别离装置两个文件夹下的装置包:

pip install uff-0.6.5-py2.py3-none-any.whl

pip install graphsurgeon-0.4.1-py2.py3-none-any.whl

测验

这儿同样是运用mnist来进行测验。首要进入到data\mnist文件夹下,运转python download_pgms.py

之后程序就会开端下载测验图片,然后经过samples/sampleMNIST下进行编译,终究生成可履行的文件。

进程如下:

首要在 ./samples/sampleMNIST 目录下履行 make 指令,在 ./bin/ 目录下生成可履行文件。

然后在 ./ 目录下运转 ./bin/sample_mnist

程序运转成功后就会在 data\mnist下随机选取一张图进行预测。

除了以上的测验办法之外,你还能够在python中经过输入以下指令进行测验:

import tensorrt
print(tensorrt.version)

假如能够正常打印出tensorrt的版别号,就说明装置无误了。

以上便是关于在Linux下,cuda、cudnn、TensorRT的环境装备了。假如是在Linux上的平台,最好的办法便是经过docker进行装置。这样能够少踩很多坑。概况能够检查TensorRT教程系列的第三篇:TensorRT的装置教程。

Python布置

运用TensorRT + Python的布置办法依照YOLOv5官方所供给的用例就没什么问题。

流程也是比较固定:先将pt模型转为onnx,再将onnx模型转为engine,所以在履行export.py时要将onnx、engine给到include。

PT模型转化为ONNX模型

python path/to/export.py --weights yolov5s.pt --include torchscript onnx coreml saved_model pb tflite tfjs

转化之后就会进行检查,看有没有算子是不支撑的:onnx.checker.check_model(model_onnx) # check onnx model

ONNX 模型构建流程

在这儿简略介绍下ONNX的构建流程:

  1. 依据网络结构运用make_node办法来创建相关节点,节点中 inputs 和 outputs 的参数决议了 graph 的衔接状况;
  2. 运用界说好的节点然后运用 make_graph 来生成后面的核算图;
  3. 最终运用生成的核算图来构建模型;
  4. 检查模型,没有发生过错之后就能够进行保存。

ONNX导出的参数介绍

这儿是经过torch.onnx.export进行导出:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

这儿介绍一下其间每个参数的含义:

model:便是需求转为 ONNX 的源 pth 模型,只有源模型的结构和权重,才干转化为有用的 ONNX 模型。

args:支撑单个参数或者多个参数。任何非变量参数将被硬编码到导出的模型中,依照它们在参数中出现的次序,任何变量参数都将成为输出模型的输入。它指的是模型的输入,只要满意输入张量的 shape 正确就能够。由于关于导出来说,咱们只需关怀张量从输入到输出的所流经的路径是否就能够了,而不关怀它的成果是否正确。一般来说这个是固定巨细的。

f:导出 ONNX 的方位,指定好后就会在相应的地方保存好成功导出的 ONNX。

export_params:代表是否存储模型的权重,默许为 True,为 True 则将一切参数将被导出。由于与 pytorch 不同,pytorch 的模型结构和权重是能够存储在在同一文件里,也能够存储在不同文件中,但 ONNX 存储在一块的。ONNX 格局的权重文件,不只包含了权重值,也包含了网络中每一层的输入输出信息以及其他辅佐信息。

verbose:表明是否打印调试的信息。

traning:默许为False,假如指定为True,将在练习模式下导出模型。一般来说 ONNX 只是为了导出模型,所以一般都为False。

input_names:是模型的输入节点称号,假如不设置的话,会主动分配一些简略的数字作为称号。

output_names:是模型的输出节点称号,和上面一样。ONNX 是经过这些称号来获取输出数据的。

opset_version:默许为9,表明的是转化时是运用哪个 ONNX 算子集版别。假如版别过低,就不支撑upsample 等操作。概况可看 github.com/onnx/onnx/b…

do_constant_folding:表明常量折叠优化,默许为 False。假如为 True,则在导出时进行常量折叠优化。常量折叠优化将用预先核算的常量节点来替换那些一切都是常量输入的操作。

dynamic_axes:用于指定输入、输出的动态改变的入参,是个字典。KEY为输入或输出称号,VALUE为shape的索引以及或许用于导出的axes称号。通常,依据以下的一种办法或两种办法进行组合,终究确认该值:

1.指定所供给输入的动态axes的整数列表,最终将生成主动称号,并应用于导出时所供给的输入/输出的维度上。

2.一个字典,指定从相应输入/输出中的动态shape索引到导出期间希望应用于此类输入/输出的axes的称号的映射。ONNX 默许输入的张量是固定巨细的,这样是为了进步效率。但是在实际运用中,咱们输入张量的shape或许是动态的,特别是关于没有输入限制的全卷积网络,所以咱们能够经过这个参数来进行哪些维度是能够动态改变的。

keep_initializers_as_inputs:默许为 None。假如为 True,那么就导出图中的一切初始值的设定项,一般对应到参数,最终也会作为输入,增加到图中。假如为 False,那么初始值的设定项就不会作为输入增加到图中,而只是将非参数作为输入进行增加。

custom_opsets:用于在导出时指示自界说 opset 域和版别的字典。假如模型包含自界说的操作集,那么就能够挑选在字典中指定域和操作集版别:其间KEY为操作集域名,它的 VALUE为操作集版别。留意的是,假如在这个字典中没有供给自界说的操作集,那么操作集版别就默许设置为1。

enable_onnx_checker:默许为 True。假如为 True,onnx 模型检查器将作为导出的一部分运转,以确保导出的模型是没有问题的 ONNX 模型。

use_external_data_format:默许为 False。假如为 True,那么模型就会以 ONNX 外部数据格局导出,比方说,有些模型的参数是存储在二进制文件中的,而不是存储在 ONNX 模型文件中。

onnxsim的运用

假如要精简onnx,就能够将simplify设置为True。设置为True之后,就会调用onnxsim来对本来onnx去除不必要的op操作,也叫去除胶水。在运用之前需求装置onnx-simplifier。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

精简完之后能够把简化前和简化后的模型放进netron看优化了哪些地方。netron 便是一个网络结构的可视化神器。咱们能够经过它来检查网络的结构。由于这儿的模型太大,会占用较长的篇幅,所以本文就不展示了。

构建TensorRT引擎

构建完onnx后,就开端从onnx转为engine。在TensorRT上首要存在以下几个目标:

  • builder:用于创建 config、network、engine 等其它目标。

  • network:在其它结构的模型解析之后,就会被用于填充到网络 network中去。

  • config:首要用于装备builder。

  • OnnxParser:用于解析onnx的模型文件,对 ONNX 进行解析并填充到 tensorrt network 的结构当中。

  • engine:依据特定的config 与特定的硬件上编译出来的引擎,只能应用于特定的 config 与硬件上。此外,引擎能够持久化保存到本地,以节约下次运用时,不必要的编译时刻。engine 集成了模型结构、模型参数 与能够完成最优核算 的kernel 装备。但是于此一起,engine 与硬件和 TensorRT的版别有着强绑定,所以要求进行engine编译与履行的硬件上的TensorRT 版别要保持一致。

  • context:用于推理的上下文,是履行 inference 时运用到的实际目标。由 engine 创建,与 engine 是一对多的关系。

在YOLOv5中所供给的转化代码如下:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

详细每个进程如构建builder、解析onnx的详细内容能够检查TensorRT教程系列的第二篇:TensorRT进阶介绍和第四篇:解读官方例程MNIST,里边有详细的流程介绍。

推理代码

运用engine推理和运用pt推理的流程是迥然不同的,同样是运用detect.py。区别就在于model = DetectMultiBackend(weights, device=device, dnn=dnn)中的weight是pt模型仍是onnx模型仍是engine模型。

进入到DetectMultiBackend这个类中检查,直接跳转到构建engine的部分:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

在进行前向推理时,就会调用DetectMultiBackend的forward办法:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

其间y返回的便是推理成果。这个成果会返回到detect.py中,当detect.py捕获到成果之后,就正常走目标检测的后处理流程了。

C++布置

转化onnx、engine的进程上面有了,这儿就不再赘述。直接来看怎么运用C++进行推理。

推理代码

首要是进行一些模型的准备工作,包含设置nms阈值、置信度阈值、gpu设备的id,以及将引擎进行反序列化,用于后面的推理。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

这儿还会创建了一个TensorRT的推理目标,这个目标具备了引擎的创建、加载模型,反序列化,创建线程等一系列操作。详细完成为:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

然后就开端读图然后获取成果,留意这儿需求依据图片本身的巨细以及输入到模型的巨细进行一个缩放的进程。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

commit为提交图片到推理引擎中,该函数的详细完成为:

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

能够看到,这儿是运用多线程异步推理。当完结异步推理后会同步cuda上的推理成果,并从GPU转移到CPU上。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

推理完之后便是常规的进行nms过滤、画图、保存操作了。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

上面有个std::tie,我之前比较少见到,所以在这儿也记录一下:std::tie的作用在于将tuple进行解包为独立目标,能够了解为完成批量赋值。

成果比照

以下是运用python加载engine进行推理以及运用C++加载engine进行推理的成果。

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

TensorRT教程(六)使用Python和C++部署YOLOv5的TensorRT模型

能够看到,两者的不同并不明显,并且能够到达较高的精度。

文末

尽管本文篇幅看起来略微较长,但是大多内容都能够在之前的文章中查阅到,如TensorRT的装置进程、Engine引擎的构建流程。至于是运用Python来写布置代码,仍是运用C++来写布置代码,我个人觉得运用C++的需求会更多。

由于关于移动设备,运用C++会愈加友爱。抛去言语的性能不说,有的设备能够直接运转C++代码却无法运转Python的代码。所以各位工程师们在业余时刻能够看一下C++的有关常识,以增加自己的技能面。

参阅链接

github.com/ultralytics…

github.com/ZJU-lishuan…

本教程禁止转载。一起,本教程来自常识星球【CV技能攻略】更多技能教程,可参加星球学习。

欢迎重视大众号CV技能攻略,专注于核算机视觉的技能总结、最新技能盯梢、经典论文解读、CV招聘信息。

核算机视觉入门1v3辅导班

【技能文档】《从零建立pytorch模型教程》122页PDF下载

QQ沟通群:444129970。群内有大佬负责解答咱们的日常学习、科研、代码问题。

其它文章

深度了解变分自编码器(VAE) | 从入门到精通

核算机视觉入门1v3辅导班

核算机视觉沟通群

用于超大图画的练习策略:Patch Gradient Descent

CV小常识讨论与分析(5)到底什么是Latent Space?

【免费送书活动】关于语义切割的亿点考虑

新方案:从过错中学习,点云切割中的自我规范化层次语义表明

经典文章:Transformer是怎么进军点云学习范畴的?

CVPR 2023 Workshop | 首个大规模视频全景切割竞赛

怎么更好地应对下游小样本图画数据?不平衡数据集的建模的技巧和策

Transformer沟通群

经典文章:Transformer是怎么进军点云学习范畴的?

CVPR 2023 Workshop | 首个大规模视频全景切割竞赛

怎么更好地应对下游小样本图画数据?不平衡数据集的建模的技巧和策

U-Net在2022年相关研讨的论文推荐

用少于256KB内存完成边际练习,开支不到PyTorch千分之一

PyTorch 2.0 重磅发布:一行代码提速 30%

Hinton 最新研讨:神经网络的未来是前向-前向算法

聊聊核算机视觉入门

FRNet:上下文感知的特征强化模块

DAMO-YOLO | 超越一切YOLO,统筹模型速度与精度

《医学图画切割》总述,胪陈六大类100多个算法

怎么高效完成矩阵乘?万文长字带你从CUDA初学者的视点入门

近似乘法对卷积神经网络的影响

BT-Unet:医学图画切割的自监督学习结构

语义切割该怎么走下去?

轻量级模型规划与布置总结

从CVPR22出发,聊聊CAM是怎么激活咱们文章的热度!

入门必读系列(十六)经典CNN规划演变的关键总结:从VGGNet到EfficientNet

入门必读系列(十五)神经网络不work的原因总结

入门必读系列(十四)CV论文常见英语单词总结

入门必读系列(十三)高效阅览论文的办法

入门必读系列(十二)池化各要点与各办法总结

TensorRT教程(五)运用TensorRT布置YOLOv6

TensorRT教程(四)解读官方例程MNIST

TensorRT教程(三)TensorRT的装置教程

TensorRT教程(一)初度介绍TensorRT

TensorRT教程(二)TensorRT进阶介绍