如果有跟著上一篇文章操作的話,相信大家已經訓練好自己的模型 best.pt 了。這次就是要教大家如何使用自己的模型做推論,並經由TensorRT,針對自己的模型與硬體做加速。事不宜遲,讓我們馬上開始!

TensorRT (source: NVIDIA)
YOLOv5 官方文件其實提供了幾個方法,讓使用者可以使用自己的模型(Custom Model),那在這邊我們就用熟悉的方式「detect.py」來執行。
依照前一天文章執行完 Colab 程式碼後,訓練完成的模型應該會儲存在「Downloads」資料夾內。

請將這個「best.pt」模型,複製到「yolov5」資料夾內。待會兒我們將會用程式,呼叫這個模型。

接著打開終端機,並輸入下方指令進到 yolov5 資料夾內。
cd yolov5
與之前在測試 YOLOv5 模型時一樣,我們會呼叫 detect.py 程式,請輸入下方指令呼叫我們自己的模型做推論。比對之前的指令可以發現,只是替換掉 --weights 後面的模型名稱而已,是不是超簡單。
python3 detect.py --weights best.pt --source 0 --nosave
等待程式執行後,就能看到顯示結果與推論資訊。趕緊將自己想要辨識的物體放到攝影機前,看看模型是否能正確辨識。

查看終端機內的資訊,可以看到每推論一幀影像,會需要花費約 61ms 的時間。那有沒有機會加速推論時間呢?有的,我們可以借助 TensorRT。
TensorRT 是 NVIDIA 針對自己的產品所做的一個工具,主要目的在於協助使用者的模型,能更快更有效的取用自家 GPU 資源,並透過一些優化程序,加速模型的推論。由下圖可以看到,它支援現今常見且流行的神經網路框架。
優化的項目如下圖所示,共有六項。透過轉換模型降低精度,以及優化模型結構,並針對使用的硬體做優化。這裡有個特別的重點,就是針對硬體優化這件事,也就是說大家若是在 Jetson Nano 上,執行了 TensorRT 優化模型,那麼產生出來的模型檔案 模型名稱.engine ,就不能複製到其他不同的硬體做使用。

TensorRT 特色 (source: NVIDIA)
知道 TensorRT 的好處後,當然要直接將我們的模型轉換一波呀!轉換的方法也相當簡單,YOLOv5
官方程式碼有提供轉換程式 export.py ,這個程式提供使用者能將自己的 YOLOv5 模型轉換成不同的格式,其中就包括 TensorRT 的 .engine 檔案。
但在轉換成 .engine 檔案的過程中,會需要先將 Pytorch 的 .pt 轉換成 .onnx ,再由 .onnx 轉換成我們要的 .engine 檔案。ONNX(Open Neural Network Exchange)是一套開放神經網路交換格式,在安裝 YOLOv5 的時候並沒有安裝相關軟體,所以在轉換前,我們需要先手動安裝 ONNX 相關套件。
首先要安裝相依套件,請打開終端機並輸入下列指令。
sudo apt install protobuf-compiler libprotoc-dev

過程中會需要使用者同意,請輸入「y」並按下 Enter 同意安裝。

接著請輸入下列指令安裝 Cython。
pip3 install Cython --user
最後安裝 onnx,這邊需要指定版本,請輸入下列指令安裝。
pip3 install onnx==1.9.0 --user --verbose
安裝完成後如下所示:

轉換模型之前我們需要新增「標籤」對應檔案,附檔名是「yaml」,這個檔案清楚寫明我們這個模型辨識的類別數量,與每個辨識到的類別名稱是什麼。
請在 yolov5 資料夾底下,輸入下列指令開啟文字編輯器,新增 labels.yaml 檔案:
gedit labels.yaml
請參照下列文件格式,依照自己的模型修改內容。
# Classes
nc: 2  # number of classes
names: ['hole', 'radish']

若需要的辨識數量是 3 種,請修改 nc: 後方的數字,例如:nc: 3 。然後在 names: 後方的陣列中新增自己的標籤名稱,比方說您的模型可以辨識到三種水果,請在陣列當中放入個水果名稱的字串,並用逗號隔開,例如: names: [‘strawberry’, ‘orange’, ‘banana’] 。以此類推,修改完成後請存檔,並關閉視窗。
OK~一切準備就緒,模型有了、標籤檔案有了以及 onnx 也安裝了,接下來讓我們輸入以下指令,開始轉換我們的模型。
python3 export.py --weights best.pt --data labels.yaml --include engine --half --device 0

指令當中的 --data 後方就是填入我們的標籤檔案, --include 後方則是填入要轉換的模型類型,因為要轉換的是 TensorRT,所以是 engine 。--half 則是我們要將原先的辨識精度 FP32 下調成
FP16,以下修精度換得速度的方式加快推論時間。最後的「–device」後方則是填入使用的 GPU 編號,它會依照使用的 GPU 做硬體優化,Jetson Nano 只有一個 GPU,編號是 0。
轉換過程需要很長一段時間,轉換完畢後如下圖所示,內容顯示筆者這次轉換時間需要 613.46 秒,將近 10 分鐘多。以及提供相關資訊,例如轉換後的檔案放在哪,該怎麼使用模型……等。

實際來到 yolov5 資料夾,可以找到轉換後的 engine 檔案 best.engine ,以及轉換過程產出的 onnx 檔案 best.onnx 。

獲得優化後的 best.engine 檔案後,馬上來測試一下效果如何吧!請輸入以下指令:
python3 detect.py --weights best.engine --half --data labels.yaml --nosave --source 0
一樣將 --weights 後方更改為我們的 engine 檔案 best.engine ,並加入 --half 表示模型精度為 FP16,以及新增 --data 輸入標籤檔案 labels.yaml。實際執行後,可以看到推論速度大幅提升,處理每幀的時間下降到約 38ms,是不是相當驚人!

綜合以上,在 Jetson Nano 運行 YOLOv5 這段落就算完結了,從環境的安裝、資料的標記、訓練模型、到這篇 TensorRT 加速,相信大家已經對在 Jetson Nano 上面,使用 YOLOv5 做物件辨識有所了解。若您手邊還有 NVIDIA Jetson 系列效能更好的 Jetson Xavier NX 或是最新的 Jetson AGX Orin 等,都可以試著以相同的步驟運行 YOLOv5喔!
您好~想請教一些問題
我是使用Jetson TX2
輸入
python3 detect.py --weights best.pt --source 0 --nosave
後出現
Traceback (most recent call last):
File "detect.py" , line 45, in «module> from models.common import DetectMultiBackend File " /home/nvidia/yolov5/models/common. py
, line 26, in module>
from torch. cuda import amp
ImportError: cannot import name
'amp'
想知道這樣如何解決~
謝謝!
Hi oakley77,
在 TX2 應該是差不多的,可以先確認一下 JetPack 版本以及 torch 與 torchvision 版本喔!
這篇操作是 JetPack 4.6 以上, pytorch 與 torchvision 要使用 NVIDIA 官方提供的版本。