乐趣区

关于人工智能:YOLOv5手把手教你使用LabVIEW-ONNX-Runtime部署-TensorRT加速实现YOLOv5实时物体识别

前言

上一篇博客给大家介绍了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

# Model
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/…

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

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

退出移动版