【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,實現YOLOv5實時物體識別(含原始碼)

2022-10-31 15:00:20

 

前言

上一篇部落格給大家介紹了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需要的模組

 pip install -r requirements.txt 

3.下載預訓練模型

開啟cmd,進入python環境,使用如下指令下載預訓練模型:

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

 

並新增一個函數def my_export_onnx():

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

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