前言
上一篇博客給大家介紹了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 = https://www.cnblogs.com/virobotics/archive/2022/10/31/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機器學習
如果文章對你有幫助,歡迎關注、點贊、收藏
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/523845.html
標籤:其他
上一篇:Linux行程調度演算法
下一篇:Docker
