关于机器学习:YOLOv5LabVIEWYOLOv5快速实现实时物体识别Object-Detection含源码

41次阅读

共计 3850 个字符,预计需要花费 10 分钟才能阅读完成。

前言

后面咱们给大家介绍了基于 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/…

将 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 位版本,视觉工具包为博客结尾提到的工具包。

如需源码,如需源码,请关注微信公众号:VIRobotics。回复关键字“yolov5”。

如您想要探讨更多对于 LabVIEW 与人工智能技术,欢送退出咱们的技术交换群:705637299。进群请备注暗号:LabVIEW 深度学习

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

正文完
 0