【YOLOv5】LabVIEW+YOLOv5快速實現實時物體識別(Object Detection)含原始碼

wangstoudamire發表於2022-11-24

前言

前面我們給大家介紹了基於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深度學習

如果文章對你有幫助,歡迎關注、點贊、收藏

相關文章