手把手教你使用LabVIEW TensorRT實現圖像分類實戰(含源碼)
????博客主頁: virobotics(儀酷智能):LabVIEW深度學習、人工智能博主
??本文由virobotics(儀酷智能)原創首發
??歡迎大家關注?點贊??收藏?留言??
@
前言
Hello,大家好,我是virobotics(儀酷智能),一個深耕于LabVIEW和人工智能領域的開發工程師。
各位朋友,今天我們一起來探究一下如何基于LabVIEW使用TensorRT實現圖像分類,本文所用到的工具包的安裝與下載方法可參考博文:https://blog.csdn.net/virobotics/article/details/129304465
一、TensorRT簡介
TensorRT是一個高性能的深度學習推理(Inference)優化器,可以為深度學習應用提供低延遲、高吞吐率的部署推理。TensorRT可用于對超大規模數據中心、嵌入式平臺或自動駕駛平臺進行推理加速。TensorRT現已能支持TensorFlow、Caffe、Mxnet、Pytorch等幾乎所有的深度學習框架,將TensorRT和NVIDIA的GPU結合起來,能在幾乎所有的框架中進行快速和高效的部署推理。主要用來針對 NVIDIA GPU進行高性能推理(Inference)加速。

TensorRT與其他推理引擎速度對比:

注:測試電腦cpu為i7-11800H,Intel集顯為i7-11650G7,獨顯為筆記本RTX 3070(包括預處理和后處理)
二、TensorRT工具包常用函數介紹
TensorRT工具包所在位置:

TrtSession:推理函數系列,可直接推理engine(trt)模型和onnx模型
TensorRT工具包常用函數介紹:


三、使用LabVIEW TensorRT實現圖像分類完整步驟
1、模型獲取及轉換為onnx
- 安裝pytorch和torchvision
- 獲取torchvision中的模型:mobile(我們獲取預訓練好的模型):
original_model = models.mobilenet_v2(pretrained=True)
- 轉onnx
def get_pytorch_onnx_model(original_model):
# define the directory for further converted model save
onnx_model_path = dirname
# define the name of further converted model
onnx_model_name = "mobilenet.onnx"
# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)
# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)
# generate model input
generated_input = Variable(
torch.randn(1, 3, 224, 224)
)
# model export into ONNX format
torch.onnx.export(
original_model,
generated_input,
full_model_path,
verbose=True,
input_names=["input"],
output_names=["output"],
opset_version=11
)
return full_model_path
完整獲取及模型轉換python代碼如下:
import os
import torch
import torch.onnx
from torch.autograd import Variable
from torchvision import models
dirname, filename = os.path.split(os.path.abspath(__file__))
print(dirname)
def get_pytorch_onnx_model(original_model):
# define the directory for further converted model save
onnx_model_path = dirname
# define the name of further converted model
onnx_model_name = "mobilenet.onnx"
# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)
# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)
# generate model input
generated_input = Variable(
torch.randn(1, 3, 224, 224)
)
# model export into ONNX format
torch.onnx.export(
original_model,
generated_input,
full_model_path,
verbose=True,
input_names=["input"],
output_names=["output"],
opset_version=11
)
return full_model_path
def main():
# initialize PyTorch MobileNetV2
original_model = models.mobilenet_v2(pretrained=True)
# get the path to the converted into ONNX PyTorch model
full_model_path = get_pytorch_onnx_model(original_model)
print("PyTorch MobileNet model was successfully converted: ", full_model_path)
if __name__ == "__main__":
main()
注:該模型所用數據集為:ImageNet數據集
2、onnx轉化為engine(save engine_Simple.vi)
使用onnx_to_engine.vi,將該vi拖拽至前面板空白區域,創建并輸入onnx的路徑以及engine的路徑,type即精度,可選擇FP32或FP16,肉眼觀看精度無大差別。(一般FP16模型比FP32速度快一倍)

轉換的完整程序如下:

點擊運行,等待1~3分鐘,模型轉換成功,可在剛剛設定的路徑中找到我們轉化好的mobilenet.engine.
Q:為什么要轉換模型,不直接調用ONNX?
A:tensorRT內部加載ONNX后其實是做了一個轉換模型的工作,該過程時間長、占用內存巨大。因此不推薦每次初始化都加載ONNX模型,而是加載engine。
3、LabVIEW TensorRT調用 mobilenet實現圖像分類(call_tensorRT.vi)
1、加載mobilenet.engine

2、根據轉換前的onnx模型設置輸入輸出緩存

3、將預處理后的輸入tensor及其數據大小(即1 * 3 * 224 * 224)送至run函數中。(可使用輸入一維數組的方式,亦可使用輸入數據指針地址的方式,后者稍快)

4、根據模型輸出的數據量,首先初始化一個相同數據量的數組(1維、2維、3維皆可,根據用戶后處理方便可自行選擇),使用Get_Result獲取相同數據量和形狀的結果。
默認第一個輸出的index為0,如有多個輸出,第n個輸出的index為n-1

5、完整圖像分類源碼

6、分類結果及速度,如下圖所示,使用tensorRT FP16,分類一幀大概需要0.5毫秒左右,速度極快

7、不同工具包實現圖像分類速度比較,對比可見對于分類,純TenosRT推理速度是onnx使用TensoRT推理速度的2倍

四、使用INetworkDefinition編輯模型
1、tensorRT高級API
1、INetworkDefinition(INetwork文件夾):可新建一個空白網絡或加載一個Onnx網絡,獲取其所有的層(算子,ILayer)、輸入和輸出張量(ITensor),用戶也可以執行以下操作:添加算子、輸入輸出、將某一個張量設置為輸出、保存成engine文件等

2、ILayer:INetworkDefinition中的任意一層,實質為一個算子。tensorRT中共有41種Ilayer子類,如右圖。使用屬性節點可獲取、編輯每一種子類(如IConvilutionLayer)的相關信息
使用INetwork下的多態VI addLayer可在網絡中添加指定層

3、ITensor:INetworDefinition中的變量,一般為某一個ILayer的輸入或輸出??赏ㄟ^以下四個函數獲取某一個ITensor:
INetworkDefinition.getInput(index)
INetworkDefinition.getOutput(index)
ILayer.getInput(index)
ILayer.getOutput(index)
在INetworkDefinition中,使用markOutput將某個ITensor設置為網絡的輸出,使用unMarkOutput將某個原本是輸出的ITensor設置為非輸出。

2、給pytorch分類模型加一層softMax
softMax理論知識
假設有一個數組V,V i 表示V中的第i個元素,那么這個元素的softmax值為:

在pytorch分類模型的輸出結果中,j=1000,i為0~999
為什么softmax是這種形式?
首先,我們知道概率有兩個性質:
1)預測的概率為非負數;
2)各種預測結果概率之和等于1。
softmax就是將在負無窮到正無窮上的預測結果按照這兩步轉換為概率的。
使用LabVIEW給分類模型加一層softMax(save engine_add_softMax.vi)
- 加載mobilenet.onnx模型;
- 將原來的輸出tensor設置為非輸出;
- 使用addSoftMax,的輸出tensor后面加一層,返回該層句柄;
- 使用屬性節點的Axes設置為2。因為原本的輸出shape為(1,1000),因此要在1000這個維度的基礎上添加softMax,因此Axes=2;
- 設置新加一層的輸出為整個模型的輸出,保存模型。

調用并推理加了softMax的分類模型engine(call_tensorRT_softMax.vi)

四、完整項目源碼下載
大家可關注微信公眾號: VIRobotics,回復關鍵字:TensorRT實現mobilenet圖像分類 獲取本次分享內容的完整項目源碼及模型。
TensorRT實現mobilenet圖像分類
附加說明
操作系統:Windows10
python:3.6及以上
LabVIEW:2018及以上 64位版本
視覺工具包:techforce_lib_opencv_cpu-1.0.0.98.vip
LabVIEW TensorRT工具包:virobotics_lib_tensorrt-1.0.0.22.vip
總結
以上就是今天要給大家分享的內容,希望對大家有用。我是virobotics(儀酷智能),我們下篇文章見~
如果有問題可以在評論區里討論,如您想要探討更多關于LabVIEW與人工智能技術,歡迎加入我們:705637299。進群請備注:LabVIEW機器視覺
**如果文章對你有幫助,歡迎?關注、??點贊、?收藏
浙公網安備 33010602011771號