前言

上一篇博客给大家介绍了LabVIEW凋谢神经网络交互工具包【ONNX】,明天咱们就一起来看一下如何应用LabVIEW凋谢神经网络交互工具包实现TensorRT减速YOLOv5。

以下是YOLOv5的相干笔记总结,心愿对大家有所帮忙。

内容地址链接
【YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来https://blog.csdn.net/virobotics/article/details/124951862
【YOLOv5】LabVIEW OpenCV dnn疾速实现实时物体辨认(Object Detection)https://blog.csdn.net/virobotics/article/details/124929483

一、TensorRT简介

TensorRT是一个高性能的深度学习推理(Inference)优化器,能够为深度学习利用提供低提早、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或主动驾驶平台进行推理减速。TensorRT现已能反对TensorFlow、Caffe、Mxnet、Pytorch等简直所有的深度学习框架,将TensorRT和NVIDIA的GPU联合起来,能在简直所有的框架中进行疾速和高效的部署推理。次要用来针对 NVIDIA GPU进行 高性能推理(Inference)减速。

通常咱们做我的项目,在部署过程中想要减速,无非就那么几种方法,如果咱们的设施是CPU,那么能够用openvion,如果咱们心愿可能应用GPU,那么就能够尝试TensorRT了。那么为什么要抉择TensorRT呢?因为咱们目前次要应用的还是Nvidia的计算设施,TensorRT自身就是Nvidia自家的货色,那么在Nvidia端的话必定要用Nvidia亲儿子了。
不过因为TensorRT的入门门槛稍微有些高,间接劝退了想要入坑的玩家。其中一部分起因是官网文档比拟芜杂;另一部分起因就是TensorRT比拟底层,须要一点点C++和硬件方面的常识,学习难度会更高一点。咱们做的凋谢神经网络交互工具包GPU版本在GPU上做推理时,ONNXRuntime可采纳CUDA作为后端进行减速,要更疾速能够切换到TensorRT,尽管和纯TensorRT推理速度比还有些差距,但也非常快了。如此能够大大降低开发难度,可能更快更好的进行推理。。

二、筹备工作

依照 LabVIEW凋谢神经网络交互工具包(ONNX)下载与超具体装置教程 装置所需软件,因本篇博客次要给大家介绍如何应用TensorRT减速YOLOv5,所以倡议大家装置GPU版本的onnx工具包,否则无奈实现TensorRT的减速

三、YOLOv5模型的获取

为方便使用,博主曾经将yolov5模型转化为onnx格局,可在百度网盘下载
链接:https://pan.baidu.com/s/15dwoBM4W-5_nlRj4G9EhRg?pwd=yiku
提取码:yiku

1.下载源码

将Ultralytics开源的YOLOv5代码Clone或下载到本地,能够间接点击Download ZIP进行下载,

下载地址:https://github.com/ultralytics/yolov5

2.装置模块

解压刚刚下载的zip文件,而后装置yolov5须要的模块,记住cmd的工作门路要在yolov5文件夹下:

关上cmd切换门路到yolov5文件夹下,并输出如下指令,装置yolov5须要的模块

pip install -r requirements.txt

3.下载预训练模型

关上cmd,进入python环境,应用如下指令下载预训练模型:

import torch# Modelmodel = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # or yolov5n - yolov5x6, custom

胜利下载后如下图所示:

4.转换为onnx模型

在yolov5之前的yolov3和yolov4的官网代码都是基于darknet框架实现的,因而opencv的dnn模块做指标检测时,读取的是.cfg和.weight文件,十分不便。然而yolov5的官网代码是基于pytorch框架实现的。须要先把pytorch的训练模型.pt文件转换到.onnx文件,而后能力载入到opencv的dnn模块里。

将.pt文件转化为.onnx文件,次要是参考了nihate大佬的博客:https://blog.csdn.net/nihate/...

将export.py做如下批改,将def export_onnx()中的第二个try正文掉,即如下局部正文:

    '''    try:        check_requirements(('onnx',))        import onnx        LOGGER.info(f'\n{prefix} starting export with onnx {onnx.__version__}...')        f = file.with_suffix('.onnx')        print(f)        torch.onnx.export(            model,            im,            f,            verbose=False,            opset_version=opset,            training=torch.onnx.TrainingMode.TRAINING if train else torch.onnx.TrainingMode.EVAL,            do_constant_folding=not train,            input_names=['images'],            output_names=['output'],            dynamic_axes={                'images': {                    0: 'batch',                    2: 'height',                    3: 'width'},  # shape(1,3,640,640)                'output': {                    0: 'batch',                    1: 'anchors'}  # shape(1,25200,85)            } if dynamic else None)        # Checks        model_onnx = onnx.load(f)  # load onnx model        onnx.checker.check_model(model_onnx)  # check onnx model        # Metadata        d = {'stride': int(max(model.stride)), 'names': model.names}        for k, v in d.items():            meta = model_onnx.metadata_props.add()            meta.key, meta.value = k, str(v)        onnx.save(model_onnx, f)'''

并新增一个函数def my_export_onnx():

def my_export_onnx(model, im, file, opset, train, dynamic, simplify, prefix=colorstr('ONNX:')):    print('anchors:', model.yaml['anchors'])    wtxt = open('class.names', 'w')    for name in model.names:        wtxt.write(name+'\n')    wtxt.close()    # YOLOv5 ONNX export    print(im.shape)    if not dynamic:        f = os.path.splitext(file)[0] + '.onnx'        torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'], output_names=['output'])    else:        f = os.path.splitext(file)[0] + '_dynamic.onnx'        torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'],                          output_names=['output'], dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'},  # shape(1,3,640,640)                                        'output': {0: 'batch', 1: 'anchors'}  # shape(1,25200,85)                                        })    return f

在cmd中输出转onnx的命令(记得将export.py和pt模型放在同一门路下):

python export.py --weights yolov5s.pt --include onnx

如下图所示为转化胜利界面

其中yolov5s可替换为yolov5m\yolov5m\yolov5l\yolov5x

四、LabVIEW应用TensorRT减速YOLOv5,实现实时物体辨认(yolov5_new_onnx.vi)

1.LabVIEW调用YOLOv5源码

2.辨认后果

抉择减速形式为:TensorRT

应用TensorRT减速,实时检测推理用时为20~30ms/frame,比单纯应用cuda减速快了30%,同时没有失落任何的精度。博主应用的电脑显卡为1060显卡,各位如果应用30系列的显卡,速度应该会更快。

五、纯CPU下opencv dnn和onnx工具包加载YOLOv5实现实时物体辨认推理用时比照

1、opencv dnn cpu下YOLOv5推理速度为:300ms左右/frame

2、onnx工具包cpu下YOLOv5推理速度为:200ms左右/frame


比照咱们发现,同样应用cpu进行推理,onnx工具包推理速度要比opencv dnn推理速度快30%左右。

六、源码及模型下载

可关注微信公众号:VIRobotics ,回复关键词:yolov5_onnx ,进行源码下载

附加阐明:计算机环境

  • 操作系统:Windows10
  • python:3.6及以上
  • LabVIEW:2018及以上 64位版本
  • 视觉工具包:virobotics_lib_onnx_cuda_tensorrt-1.0.0.11以上版本

总结

以上就是明天要给大家分享的内容。大家可依据链接下载相干源码与模型。

如果有问题能够在评论区里探讨,发问前请先点赞反对一下博主哦,如您想要探讨更多对于LabVIEW与人工智能技术,欢送退出咱们的技术交换群:705637299,进群请备注暗号:LabVIEW机器学习

如果文章对你有帮忙,欢送关注、点赞、珍藏