JetsonNano2GB編譯Yolov5並用TensorRT加速教程
上一期我們教大家如何給新的JetsonNano 2GB燒錄系統。這一期我們將教大家如何在JetsonNano上部署最新的Yolov5檢測模型,並且採用TensorRT加速,看看我們的模型能否在JetsonNano這樣的小裝置上跑到實時。
首先我們來確認一下系統裡面opencv對應的版本:
是最新的4.1,不錯。
今天這是我們要實現的效果:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Us5L9WaW-1605327260590)(https://i.loli.net/2020/11/11/OeuA2y3MkF4fSbP.png)]
是的,你沒有看錯,我們將在JetsonNano上跑一個經過TensorRT加速的YoloV5演算法,演算法的功能是實現口罩佩戴的檢測。從圖中你可以看到,對於口罩佩戴的檢測還是很準確的,而且基本上可以達到實時!這裡要說明的是,這個模型的輸入尺寸不大,並且在Yolov5的基礎上經過了裁剪,所以能夠做到這麼快,但是如果你的模型直接拿官方的部署,可能無法跑到這個速度,最後速度帶來的當然是精度的降低,不過在可以接受的範圍之內!
還等什麼,快來依照我們的教程來實現吧~
技術棧
本篇文章不涉及到Python或者任何訓練方面的東西,純部署,而且純C++,因此教程裡面可能會出現一些你不熟悉的庫或者術語,沒關心,你看到最後我們跑出來的結果就可以了,至於過程你可以通過加入我們的社群來獲取想要的材料。大部分程式碼都在github開源。核心技術包括:
- C++;
- TensorRT相關基礎知識;
- 對ONNX瞭解;
- 對Yolov5的基本網路結構瞭解。
準備工作
先做一些準備工作,什麼準備工作呢?我們需要先安裝一個C++下面比較常用的視覺化庫,thor:
git clone https://github.com/jinfagang/thor
大家可以進入到主頁依照readme進行編譯。為什麼要做這個準備幹工作?原因有兩個:
- 它依賴一些庫,如果你能夠成功編譯它,說明你的環境沒有問題,如果不能,你的環境可能有問題了;
- 它可以很方便的視覺化我們的檢測輸出結果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-MmRVptpR-1605327260592)(https://i.loli.net/2020/11/11/mHyaS6R2q4fJpDk.png)]
引用一張thor官方的圖:
畫檢測結果既好看又方便!
編譯onnx-tensorrt
我們給大家準備好了一個轉好的onnx檔案,如果你需要匯出自己的onnx,過程有點複雜,你可以通過加入社群交流如何匯出,我們沒有現成的程式碼提供。
git clone --recursive https://github.com/onnx/onnx-tensorrt
編譯onnx-tensorrt 在JetsonNano上可能會遇到一些問題。為什麼呢?
第一個錯誤:
CMake Error at CMakeLists.txt:21 (cmake_minimum_required):
CMake 3.13 or higher is required. You are running version 3.10.2
-- Configuring incomplete, errors occurred!
然後你就需要重新編譯一下CMake了:
git clone https://github.com/Kitware/CMake
說實話這個CMake也是異常的龐大了。clone下來100多M。然後開始編譯CMake了:
./bootstrap.sh
make
sudo make install
cmake -V
編譯過程還是挺慢的.
然後就可以接著編譯onnx-tensorrt了。
編譯完onnx-tensorrt之後,就可以用 onnx2trt
將模型轉出到tensorrt 的engine了。
在JetsonNano上將ONNX轉到engine檔案
想必大家已經安裝好了必備的工具,如果你在安裝工具的時候遇到問題,不要灰心喪氣,因為最終是可以work的。我們已經走到這一步了。
接下來就是拿一個onnx來做試驗了。這裡我推薦一個onnx檔案,大小隻有6M,我們將用它來實現前面的檢測效果。
至於如何訓練對應的模型,大家可以在神力平臺找到對應的訓練程式碼。
http://manaai.cn
我們成功的將onnx轉到了engine:
onnx2trt best_sim.onnx -o a.trt -w 10909920
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FlBdC4Ex-1605327260593)(https://i.loli.net/2020/11/14/kCdPOfblJW41cEz.png)]
這裡需要注意的是這個-w
, 它指的是我們的workspace多大,你不要預設,也不要設定的太小,大概按照我這樣的設定就可以了,預設的話就當機了,太小會報錯。
對TensorRT Engine進行推理
接下來就要對這個Engine檔案進行推理了。推理部分我們要實現load上面的tensorrt engine並實現口罩的後處理檢測。對應的程式碼也可以在神力平臺找到:
http://manaai.cn
最後我們這裡貼出核心的推理程式碼:
YoloV5 model(inputParams, trtParams, v5Params);
if (!model.initSession(0)) {
std::cerr << "model init failed!\n";
exit(0);
}
string data_f = FLAGS_data_f;
if (thor::os::isfile(data_f)) {
if (thor::os::suffix(data_f) == "mp4" ||
thor::os::suffix(data_f) == "avi") {
std::cout << "inference on video.\n";
VideoCapture cap(data_f);
if (!cap.isOpened()) {
cout << "Error opening video stream or file" << endl;
return -1;
}
cap.set(CAP_PROP_POS_FRAMES, 60);
VideoWriter video("yolov5_result.mp4", CV_FOURCC('M', 'J', 'P', 'G'), 25,
Size(cap.get(3), cap.get(4)));
while (1) {
Mat image;
cap >> image;
if (image.empty()) break;
auto bboxes = model.predOneImage(image);
std::vector<thor::Detection> dets = toThorDetections(bboxes);
auto res =
thor::vis::VisualizeDetections(image, dets, CLASSES, &COLORS);
cv::imshow("yolov5", res);
video.write(res);
char c = (char)waitKey(25);
if (c == 27) break;
}
video.release();
}
由此可以得到我們上面給大家展示的效果。
總結
我們對JetsonNano 2GB進行了較為全面的評測,包括它的軟體相容性以及在一些極致優化的模型下的表現速度。事實上,如果用我們的512輸入尺寸的Yolov5模型的TensorRT加速,它的最高速度可以達到25ms, 這基本上可以讓你在一個嵌入式板子上將檢測模型跑到realtime.
所以當你需要部署某個應用的時候,缺乏硬體考量?JetsonNano 2GB絕對是一個不錯的首選。
哦對了對了,這次評測忘了一個很重要的點: JetsonNano 2GB的TensorCore支援fp16推理!! 這意味著在我們的評測速度上,JetsonNano 2GB還可以做到更快的速度!
本次教程的所有相關程式碼均為我們原創,轉載請註明出處,謝謝!
相關文章
- 【jetson nano】yolov5環境配置tensorrt部署加速NaNYOLO
- 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,實現YOLOv5實時物體識別YOLOView
- 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,實現YOLOv5實時物體識別(含原始碼)YOLOView原始碼
- 用TensorRT針對AArch64使用者的交叉編譯示例編譯
- 乾貨 | YOLOV5 訓練自動駕駛資料集,並轉成tensorrt【左側有碼】YOLO自動駕駛
- windows上用vs2017靜態編譯onnxruntime-gpu CUDA cuDNN TensorRT的坎坷之路Windows編譯GPUDNN
- Openwrt編譯教程編譯
- 用Gulp編譯Sass並實時重新整理編譯
- 【實戰】yolov8 tensorrt模型加速部署YOLO模型
- 反編譯系列教程(上)編譯
- 反編譯系列教程(中)編譯
- 小程式反編譯教程編譯
- 如何量化並加速你的程式設計能力【譯】程式設計
- Android Apk反編譯系列教程(一)如何反編譯APKAndroidAPK編譯
- ubuntu編譯安裝pcl教程。Ubuntu編譯
- ubuntu編譯安裝kernel教程。Ubuntu編譯
- macOS nginx 編譯安裝教程MacNginx編譯
- 【go】【應用編譯】Go編譯
- Nginx 的編譯並打包成二.txtNginx編譯
- Linux下nginx編譯安裝教程和編譯引數詳解LinuxNginx編譯
- 針對flume中扇出複用(源exec)原始碼修改,並編譯flume原始碼編譯
- 編譯並裁剪 FFmpeg 在 Android 上做視訊編輯編譯Android
- Mac中編譯FFmpeg教程(Android版)Mac編譯Android
- Windows10下yolov8 tensorrt模型加速部署【實戰】WindowsYOLO模型
- Win10下yolov8 tensorrt模型加速部署【實戰】Win10YOLO模型
- 用於ONNX的TensorRT後端後端
- 安裝YOLOv5模型環境並測試YOLO模型
- Jetson Nano配置YOLOv5並實現FPS=25NaNYOLO
- Linux使用命令列編譯並用st-link燒錄STM32Linux命令列編譯
- Centos7編譯安裝Apache教程。CentOS編譯Apache
- Centos7編譯安裝Memcached教程。CentOS編譯
- Centos7編譯安裝Docker教程。CentOS編譯Docker
- Centos7編譯安裝Tomcat教程。CentOS編譯Tomcat
- Cnetos7編譯安裝PHP教程。編譯PHP
- Cnetos7編譯安裝MySQL教程。編譯MySql
- Cnetos7編譯安裝Nginx教程。編譯Nginx
- Cnetos7編譯安裝phpMyAdmin教程。編譯PHP
- [編譯] 10、kconfig 入門指導教程編譯