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

前言

前面我们给大家介绍了基于LabVIEW+YOLOv3/YOLOv4的物体识别(对象检测),今天接着上次的内容再来看看YOLOv5。本次主要是和大家分享使用LabVIEW快速实现yolov5的物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEW AI视觉工具包(非NI Vision)下载与安装教程中下载。若配置运行过程中遇到困难,欢迎大家评论区留言,博主将尽力解决。

一、关于YOLOv5

YOLOv5是在 COCO 数据集上预训练的一系列对象检测架构和模型。表现要优于谷歌开源的目标检测框架 EfficientDet,在检测精度和速度上相比yolov4都有较大的提高。目前YOLOv5官方代码中,最新版本是YOLOv5 v6.1,一共给出了5个版本的模型,分别是 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLO5x 五个模型(如下图所示)。这些不同的变体模型使得YOLOv5能很好的在精度和速度中权衡,方便用户选择。其中五个模型性能依次增强。比如YOLOv5n模型参数量最小,速度最快,AP精度最低;YOLOv5x模型参数量最大,速度最慢,AP精度最高。本博客,我们以YOLOv5最新版本来介绍相关的部署开发。

在这里插入图片描述
YOLOv5相比于前面yolo模型的主要特点是:
1、小目标的检测精度上有明显的提高;
2、能自适应锚框计算
3、具有数据增强功能,随机缩放,裁剪,拼接等功能
4、灵活性极高、速度超快,模型超小、在模型的快速部署上具有极强优势

关于YOLOv5的网络结构解释网上有很多,这里就不再赘述了,大家可以看其他大神对于YOLOv5网络结构的解析。

二、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/article/details/112731327

将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调用YOLOv5模型实现实时物体识别(yolov5_new_opencv.vi)

本例中使用LabvVIEW工具包中opencv的dnn模块readNetFromONNX()载入onnx模型,可选择使用cuda进行推理加速。

1.查看模型

我们可以使用netron 查看yolov5m.onnx的网络结构,浏览器中输入链接:https://netron.app/,点击Open Model,打开相应的网络模型文件即可。
在这里插入图片描述
如下图所示是转换之后的yolov5m.onnx的属性:
在这里插入图片描述

2.参数及输出

blobFromImage参数:
size:640*640
Scale=1/255
Means=[0,0,0]

Net.forward()输出:
单数组 25200*85

3.LabVIEW调用YOLOv5源码

如下图所示,调用摄像头实现实时物体识别
在这里插入图片描述

4.LabVIEW调用YOLOv5实时物体识别结果

本次我们是以yolov5m.onnx为例来测试识别结果和速度的;
不使用GPU加速,仅在CPU模式下,实时检测推理用时在300ms/frame左右
在这里插入图片描述
使用GPU加速,实时检测推理用时为30~40ms/frame,是cpu速度的十倍多
在这里插入图片描述

总结

以上就是今天要给大家分享的内容,本次分享内容实验环境说明:操作系统为Windows10,python版本为3.6及以上,LabVIEW为2018及以上 64位版本,视觉工具包为博客开头提到的工具包。

如需源码,请在评论区留下您的邮箱。

如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。

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

### LabVIEW 中调用 YOLO 进行物体检测的方法 #### 使用 LabVIEW OpenVINO 工具包实现 YOLO 推理部署 为了在 LabVIEW 中成功调用 YOLO 模型进行物体检测,推荐使用 Intel 的 OpenVINO™ 工具套件。该工具允许开发者通过优化后的推理引擎,在不同硬件平台上高效运行深度学习模型[^1]。 具体来说,LabVIEW 提供了一个专门用于集成 OpenVINO 功能的插件——LabVIEW OpenVINO 工具包。此工具包简化了将预训练好的神经网络(如YOLO)导入并配置到LabVIEW应用程序的过程[^2]。 #### 创建 LabVIEW 应用程序框架 首先创建一个新的 VI (Virtual Instrument),设置输入输出接口以便于后续处理图像数据流以及显示结果。对于实时视频源的应用场景,则需考虑加入摄像头驱动支持模块来获取连续帧画面作为待测样本集的一部分[^3]。 ```labview // 初始化相机采集卡控件 Camera Acquisition Control Initialize; ``` #### 加载与配置 YOLO 模型 利用 LabVIEW OpenVINO 插件加载已转换成 IR(Intermediate Representation)格式的目标检测模型文件(.xml 和 .bin): ```labview // 设置模型路径参数 Set Model Path "path_to_your_model.xml"; Load Network; // 加载网络结构定义 Read Weights File "path_to_weights.bin"; // 读取权重二进制文件 Configure Inference Engine; // 配置推断环境 ``` 完成上述操作之后即可准备执行实际预测任务前必要的准备工作,比如调整输入尺寸匹配、设定阈值过滤低概率框等。 #### 执行对象识别流程 当一切就绪后就可以开始循环读入每一帧图片送入模型做分类判断,并提取出所有满足条件的结果矩形区域连同类别标签一同返回给前端界面展示出来: ```labview while (not Stop Button Pressed){ Capture Frame from Camera; Preprocess Image for Input Shape Requirement; Infer with Loaded Model on Current Frame; Post-process Detection Results to Get Bounding Boxes and Labels; Draw Rectangles Around Detected Objects On Original Image; } ``` 以上便是基于 LabVIEW 平台结合 OpenVINO 技术栈快速搭建起一套完整的端侧智能视觉系统的简易指南。
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

virobotics

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

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

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

打赏作者

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

抵扣说明:

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

余额充值