前言

上一篇博客给大家介绍了LabVIEW开放神经网络交互工具包【ONNX】,今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5。

以下是YOLOv5的相关笔记总结,希望对大家有所帮助。

内容 地址链接
【YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来 https://www.cnblogs.com/virobotics/p/16802248.html
【YOLOv5】LabVIEW OpenCV dnn快速实现实时物体识别(Object Detection) https://www.cnblogs.com/virobotics/p/16788146.html

一、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需要的模块

  1.  pip install -r requirements.txt 

3.下载预训练模型

打开cmd,进入python环境,使用如下指令下载预训练模型:

  1. 1 import torch
  2. 2
  3. 3 # Model
  4. 4 model = 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/article/details/112731327

将export.py做如下修改,将def export_onnx()中的第二个try注释掉,即如下部分注释:

  1. 1 '''
  2. 2 try:
  3. 3 check_requirements(('onnx',))
  4. 4 import onnx
  5. 5 ​
  6. 6 LOGGER.info(f'\n{prefix} starting export with onnx {onnx.__version__}...')
  7. 7 f = file.with_suffix('.onnx')
  8. 8 print(f)
  9. 9 ​
  10. 10 torch.onnx.export(
  11. 11 model,
  12. 12 im,
  13. 13 f,
  14. 14 verbose=False,
  15. 15 opset_version=opset,
  16. 16 training=torch.onnx.TrainingMode.TRAINING if train else torch.onnx.TrainingMode.EVAL,
  17. 17 do_constant_folding=not train,
  18. 18 input_names=['images'],
  19. 19 output_names=['output'],
  20. 20 dynamic_axes={
  21. 21 'images': {
  22. 22 0: 'batch',
  23. 23 2: 'height',
  24. 24 3: 'width'}, # shape(1,3,640,640)
  25. 25 'output': {
  26. 26 0: 'batch',
  27. 27 1: 'anchors'} # shape(1,25200,85)
  28. 28 } if dynamic else None)
  29. 29 ​
  30. 30 # Checks
  31. 31 model_onnx = onnx.load(f) # load onnx model
  32. 32 onnx.checker.check_model(model_onnx) # check onnx model
  33. 33 ​
  34. 34 # Metadata
  35. 35 d = {'stride': int(max(model.stride)), 'names': model.names}
  36. 36 for k, v in d.items():
  37. 37 meta = model_onnx.metadata_props.add()
  38. 38 meta.key, meta.value = k, str(v)
  39. 39 onnx.save(model_onnx, f)'''

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

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

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

  1. 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机器学习

如果文章对你有帮助,欢迎关注、点赞、收藏

 

【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)的更多相关文章

  1. 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)

    目录 前言 一.工具包位置 二.图像采集与色彩空间转换 1.文件读写 2.实现图片读取 3.使用算子cvtColor实现颜色空间转换 三.从摄像头采集图像 1.Camera类 2.属性节点 3.实现摄 ...

  2. 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)

    前言 今天我们一起来使用LabVIEW AI视觉工具包快速实现图像的滤波与增强:图像灰度处理:阈值处理与设定:二值化处理:边缘提取与特征提取等基本操作.工具包的安装与下载方法可见之前的博客. 一.图像 ...

  3. 【YOLOv5】LabVIEW+YOLOv5快速实现实时物体识别(Object Detection)含源码

    前言 前面我们给大家介绍了基于LabVIEW+YOLOv3/YOLOv4的物体识别(对象检测),今天接着上次的内容再来看看YOLOv5.本次主要是和大家分享使用LabVIEW快速实现yolov5的物体 ...

  4. 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    @ 目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...

  5. 手把手教你使用LabVIEW实现Mask R-CNN图像实例分割

    前言 前面给大家介绍了使用LabVIEW工具包实现图像分类,目标检测,今天我们来看一下如何使用LabVIEW实现Mask R-CNN图像实例分割. 一.什么是图像实例分割? 图像实例分割(Instan ...

  6. 手把手教你使用LabVIEW OpenCV dnn实现图像分类(含源码)

    @ 目录 前言 一.什么是图像分类? 1.图像分类的概念 2.MobileNet简介 二.使用python实现图像分类(py_to_py_ssd_mobilenet.py) 1.获取预训练模型 2.使 ...

  7. 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

    前言 今天和大家一起分享如何使用LabVIEW调用pb模型实现物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEW AI视觉工具包(非NI Vision)下载与安装教程中下载 一.物体识别 ...

  8. 手把手教你 在Pytorch框架上部署和测试 关键点人脸检测项目DBFace,成功实现人脸检测效果

    这期教向大家介绍仅仅 1.3M 的轻量级高精度的关键点人脸检测模型DBFace,并手把手教你如何在自己的电脑端进行部署和测试运行,运行时bug解决. 01. 前言 前段时间DBFace人脸检测库横空出 ...

  9. 手把手教你Linux服务器集群部署.net网站 - 让MVC网站运行起来

    一.Linux下面安装需要软件 我们这里需要安装的软件有: 1) Mono 3.2.8 : C#跨平台编译器,能使.Net运行与Linux下,目前.net 4.0可以完美运行在该平台下 2) ngin ...

随机推荐

  1. YC-Framework版本更新:V1.0.9

    分布式微服务框架:YC-Framework版本更新V1.0.9!!! 本文主要内容: 1.V1.0.9版本更新主要内容 2.YC-Framework新的征程 一.V1.0.9版本更新主要内容 (1)接 ...

  2. 【java】学习路径41-使用缓冲输入输出复制文件

    结论:Buffered+数组 这种方式速度是最快的. public void testBufferedIO(String source,String target){ BufferedInputStr ...

  3. KingbaseES 全文检索功能介绍

    KingbaseES 内置的缺省的分词解析器采用空格分词,因为中文的词语之间没有空格分割,所以这种方法并不适用于中文.要支持中文的全文检索需要额外的中文分词插件:zhparser and sys_ji ...

  4. KingbaseES 并行查询

    背景:随着硬件技术的提升,磁盘的IO能力及CPU的运算能力都得到了极大的增强,如何充分利用硬件资源为运算加速,是数据库设计过程中必须考虑的问题.数据库是IO和CPU密集型的软件,大规模的数据访问需要大 ...

  5. 解决国内 github.com 打不开的准确方法

    前言 github是目前比较公认的一个开源网站,对于像我们这类使用机器学习进行科学计算的研究人员来讲,github提供了代码开源,验证原文献中计算结果正确性的一个平台. 到目前为止,几乎所有使用机器学 ...

  6. .Net之接口小知识

    目的 通过一个简单的项目,在原来的文章基础上完善一下常用的几种WebApi编写方式以及请求方式,一方面是用于给我一个前端朋友用来学习调用接口,另一方面让我测试HttpClient的一些效果. 本文示例 ...

  7. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)

    前言:前面写过2篇文章,介绍jenkins通过slave节点部署构建并发布应用到虚拟机中,本篇介绍k8s(k3s)环境下,部署jenkins,通过流水线脚本方式构建发布应用到k8s(k3s)集群环境中 ...

  8. 坚守自主创新,璞华HawkEye IETM系统惠及国计民生

    可上九天揽月,可下五洋捉鳖,这是我们很多年的梦想.而要实现这样的梦想,不仅需要安全可靠的技术装备,还需要让这些技术装备处于良好的维保状态.于是,作为装备维保过程中必须的知识创作.管理.发布.浏览工具, ...

  9. 【HMS Core】集成地图服务不显示地图问题

    ​[问题描述] 关于华为HMS-地图服务不显示地图的问题. 背景:集成华为地图服务运行后页面不显示地图,运行app后不展示地图报错MapsInitializer is not initialized. ...

  10. 累加和为 K 的最长子数组问题

    累加和为 K 的最长子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的最长子数组问题 CSDN:累加和为 K 的最长子数组问题 题目描述 给定一个整数组成的无序数组 arr,值可能正.可 ...