Win10下yolov8 tensorrt模型加速部署【實戰】
TensorRT-Alpha基於tensorrt+cuda c++實現模型end2end的gpu加速,支援win10、linux,在2023年已經更新模型:YOLOv8, YOLOv7, YOLOv6, YOLOv5, YOLOv4, YOLOv3, YOLOX, YOLOR,pphumanseg,u2net,EfficientDet。
關注倉庫《TensorRT-Alpha》:https://github.com/FeiYull/TensorRT-Alpha
一、加速結果展示
1.1 效能速覽
?快速看看yolov8n 在移動端RTX2070m(8G)的新能表現:
model | video resolution | model input size | GPU Memory-Usage | GPU-Util |
---|---|---|---|---|
yolov8n | 1920x1080 | 8x3x640x640 | 1093MiB/7982MiB | 14% |
下圖是yolov8n的執行時間開銷,單位是ms:
更多TensorRT-Alpha測試錄影在B站影片:
B站:YOLOv8n
B站:YOLOv8s
1.2精度對齊
下面是左邊是python框架推理結果,右邊是TensorRT-Alpha推理結果。
YOLOv4 YOLOv3 YOLOR YOLOX略。
二、Windows10環境配置
三步解決win環境配置:
- 1、安裝vs2019、Nvidia驅動、cuda,cudnn、opencv、tensorrt;
- 2、建立屬性表;
- 3、工程設定,執行;
問題:為什麼使用vs2019屬性表,而不用cmake?
回答:因為屬性表可以做到:一次建立,到處使用。
提示:如果您一定需要使用cmake+vs2019 or cmake + clion,請參考附錄,這是一位熱心觀眾的方法,供參考。
2.1 安裝VS2019
需要Microsoft賬號,如果您有別的途徑下載安裝也可以。
- 進入:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
- 選擇:[2019] -> [下載]
- 在新頁面選擇: Visual Studio Community 2019 (version 16.11)
- 下載完成之後安裝過程選擇如下圖:
2.2 安裝庫
注:Nvidia相關網站需要註冊賬號。
2.2.1 安裝Nvidia顯示卡驅動
- 進入: https://www.nvidia.cn/Download/index.aspx?lang=cn#
- 依據實際情況選擇,如下圖是我的選擇(for RTX3070):
- 選擇:[搜尋]->[下載] ->[雙擊預設安裝] -> [重啟系統] -> [進入cmd],輸入如下指令:
nvidia-smi
看到如下資訊表明驅動正常:
2.2.2 安裝 cuda11.2
- 進入: https://developer.nvidia.com/cuda-toolkit-archive
- 選擇:CUDA Toolkit 11.2.0 (December 2020)
- 選擇:[Windows] -> [x86_64] -> [10] -> [exe(local)] -> [Download(2.9GB)]
- 雙擊安裝,重啟在cmd視窗輸入如下指令:
nvcc -V
CMD視窗列印如下資訊表示cuda11.2安裝正常
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Nov_30_19:15:10_Pacific_Standard_Time_2020
Cuda compilation tools, release 11.2, V11.2.67
Build cuda_11.2.r11.2/compiler.29373293_0
note:cuda11.2 不需要手動設定環境變數,如下圖,環境變數都是自動設定的。
2.2.3 安裝 cudnn8.2.1
- 進入網站:https://developer.nvidia.com/rdp/cudnn-archive
- 選擇: Download cuDNN v8.2.1 (June 7th, 2021), for CUDA 11.x
- 選擇: cuDNN Library for Windows (x86)
- 你將會下載這個壓縮包: "cudnn-11.3-windows-x64-v8.2.1.32_2.zip"
- 解壓之後,cudnn的標頭檔案、庫檔案都要複製到cuda安裝目錄。
- 如下圖,進入cudnn解壓所在資料夾中include,複製所有標頭檔案,貼上到CUDA/v11.2/include中
- lib、bin中的檔案也複製到對應cuda目錄中
- 重啟系統
2.2.4 下載 tensorrt8.4.2.4
- 進入網站: https://developer.nvidia.cn/nvidia-tensorrt-8x-download
- 把這個打勾: I Agree To the Terms of the NVIDIA TensorRT License Agreement
- 選擇: TensorRT 8.4 GA Update 1
- 選擇: TensorRT 8.4 GA Update 1 for Windows 10 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 ZIP Package
- 你將會下載這個壓縮包: "TensorRT-8.4.2.4.Windows10.x86_64.cuda-11.6.cudnn8.4.zip"
- 解壓到F:\ThirdParty,並重新命名為:TensorRT-8.4.2.4
- 並將路徑"F:\ThirdParty\TensorRT-8.4.2.4\lib"新增到環境變數,如下圖:
- 重啟系統
2.2.5 OpenCV4.5.5安裝
- 進入:https://opencv.org/releases/
- 選擇:[OpenCV – 4.5.5] -> [Windows]
- 下載完成之後,是一個exe的自解壓格式,解壓到:D:\ThirdParty
- 並將路徑:"D:\ThirdParty\opencv4.5.5\build\bin" 和 "D:\ThirdParty\opencv4.5.5\build\x64\vc15\bin"新增到環境變數,如下圖:
- 重啟系統
note:我的opencv在D盤,tensorrt在E盤,根據實際情況修改就行了。
2.3 建立屬性表
一般地,Visual Studio 2019,一個庫對應兩個屬性表檔案,分別對應:vs2019的debug模式和release模式,例如:本文中OpenCV建立了這兩種。而TensorRT和CUDA只需要建立一種屬性表(適用以上兩種模式)。
2.3.1 建立OpenCV屬性表
建立opencv庫debug屬性表:
- step1:基於VS2019隨便新建一個C++專案,如下圖,專案設定為Debug、X64模式
- step2:如下圖,選擇:[屬性視窗] -> [右擊Debug|x64] -> [新增新專案屬性表]
- step3:檔案命名為:OpenCV4.5.5_DebugX64.props -> [新增]
- 編輯屬性表:[如下圖:雙擊屬性表]
- step4:如下圖,選擇:[通用屬性] -> [VC++目錄] -> [包含目錄] -> [編輯]
- step5:如下圖,將兩個OpenCV兩個標頭檔案目錄複製進去 -> [確認]
- step6:選擇:[通用屬性] -> [VC++目錄] -> [庫目錄] -> [編輯] -> 將路徑:"D:\ThirdParty\opencv4.5.5\build\x64\vc15\lib"複製進去 -> [確認]
- step7:選擇:[通用屬性] -> [連結器] -> [輸入] -> [附加依賴項] -> 將檔名"opencv_world455d.lib"複製進去->[確認]
小結:
到這裡,opencv庫debug屬性表製作完成,release屬性表和上述流程一樣,唯一區別在於,如下圖,專案切換到Release x64模式,新建OpenCV4.5.5_ReleaseX64屬性表,然後在step7中,將檔名修改為:"opencv_world455.lib"
請記住,製作屬性表就3個步驟:
- 複製include路徑
- 複製lib路徑,外加設定dll到系統環境變數
- 複製lib檔名稱
2.3.2 建立TensorRT屬性表
右擊Debug|x64 or 右擊Release|x64新建屬性表,重新命名為:TensorRT8.4.2.4_X64,
# include路徑
F:\ThirdParty\TensorRT-8.4.2.4\include
F:\ThirdParty\TensorRT-8.4.2.4\samples\common
F:\ThirdParty\TensorRT-8.4.2.4\samples\common\windows
# lib路徑
F:\ThirdParty\TensorRT-8.4.2.4\lib
# lib檔名稱(for release& debug)
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib
依照上一節3個步驟:
- step1:選擇:[通用屬性] -> [VC++目錄] -> [包含目錄] -> [編輯] -> 把上述3個include路徑複製進去
- step2:選擇:[通用屬性] -> [VC++目錄] -> [庫目錄] -> [編輯] -> 把上述lib路徑複製進去
- step3:選擇:[通用屬性] -> [連結器] -> [輸入] -> [附加依賴項] -> [編輯] -> 將上述lib檔名稱複製進去->[確認]
最後,修改tensorrt屬性表:[通用屬性] -> [C/C++] -> [前處理器] -> [前處理器定義] -> 新增指令:_CRT_SECURE_NO_WARNINGS -> [確認]
2.3.3 建立CUDA屬性表
CUDA屬性表直接白嫖官方,在路徑:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\extras\visual_studio_integration\MSBuildExtensions\CUDA 11.2.props
最後,我們應該有了如下屬性表檔案:
其中,cuda 和tensorrt的屬性表同時相容release x64 和debug x64,你再新建TensorRT-Alpha中yolov8 yolov7 yolov6 等專案後,只需要把上述提前做好的屬性表引入到工程就行了,**當然專案還需要進行簡單設定**(設定NVCC,避免tensorrt的坑),在後文提到。屬性表做到了一次新建,到處使用。
三、YOLOv8模型部署
Windows10環境安裝YOLOv8,參考我的另一篇《Win10環境下yolov8快速配置與測試》:https://blog.csdn.net/m0_72734364/article/details/128815530
3.1 獲取YOLOv8onnx檔案
直接在網盤下載 weiyun or google driver 或者使用如下命令匯出onnx:
# ? yolov8 官方倉庫: https://github.com/ultralytics/ultralytics
# ? yolov8 官方教程: https://docs.ultralytics.com/quickstart/
# ?TensorRT-Alpha will be updated synchronously as soon as possible!
# 安裝 yolov8
conda create -n yolov8 python==3.8 -y
conda activate yolov8
pip install ultralytics==8.0.5
pip install onnx
# 下載官方權重(".pt" file)
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8m.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8l.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x.pt
https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x6.pt
匯出 onnx:
# 640
yolo mode=export model=yolov8n.pt format=onnx dynamic=True #simplify=True
yolo mode=export model=yolov8s.pt format=onnx dynamic=True #simplify=True
yolo mode=export model=yolov8m.pt format=onnx dynamic=True #simplify=True
yolo mode=export model=yolov8l.pt format=onnx dynamic=True #simplify=True
yolo mode=export model=yolov8x.pt format=onnx dynamic=True #simplify=True
# 1280
yolo mode=export model=yolov8x6.pt format=onnx dynamic=True #simplify=True
3.2 編譯 onnx
# trtexec.exe在路徑:F:\ThirdParty\TensorRT-8.4.2.4\bin
# 640
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8n.onnx --saveEngine=yolov8n.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8s.onnx --saveEngine=yolov8s.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8m.onnx --saveEngine=yolov8m.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8l.onnx --saveEngine=yolov8l.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8x.onnx --saveEngine=yolov8x.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
# 1280
../../../../TensorRT-8.4.2.4/bin/trtexec.exe --onnx=yolov8x6.onnx --saveEngine=yolov8x6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280
你將會的到例如:yolov8n.trt、yolov8s.trt、yolov8m.trt等檔案。
3.3 編譯執行
3.3.1 新建、設定專案
下載TensorRT-Alpha倉庫:
git clone https://github.com/FeiYull/tensorrt-alpha
- 新建yolov8 C++專案:參考B站影片【提示:從0分34秒開始,演示如何設定NVCC編譯,如何避免tensorrt在win環境的坑】:
yolov8 tensorrt 實戰之先導
小結:
後續建立TensorRT-Alpha中YOLOv7、 YOLOv6等工程之後,只需要將上文中的屬性表新增到工程,然後按照《yolov8 tensorrt 實戰之先導》提到的設定工程就OK。
這篇教程太詳細了,這年頭,好像很少有人願意免費給出這麼誠意的教程。
3.3.2 編譯執行
上面影片在vs2019中設定命令列引數,您也可以在CMD命令列上執行程式,如下:
# 下面引數解釋
# --show 表示視覺化結果
# --savePath 表示儲存,預設儲存在build目錄
# --savePath=../ 儲存在上一級目錄
## 640
# 推理圖片
./app_yolov8.exe --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=1 --img=../../data/6406407.jpg --show --savePath
./app_yolov8.exe --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=8 --video=../../data/people.mp4 --show --savePath
# 推理影片
./app_yolov8.exe --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=8 --video=../../data/people.mp4 --show --savePath=../
# 線上推理相機影片
./app_yolov8.exe --model=../../data/yolov8/yolov8n.trt --size=640 --batch_size=2 --cam_id=0 --show
## 1280
# infer camera
./app_yolov8.exe --model=../../data/yolov8/yolov8x6.trt --size=1280 --batch_size=2 --cam_id=0 --show
我的B站所有影片都在WIN10環境執行,https://space.bilibili.com/2028719613
[video(video-zRQTyZp3-1675415874102)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=778153500)(image-https://img-blog.csdnimg.cn/img_convert/4faa0b726044d139a1282d3883c6ed08.jpeg)(title-yolov8 tensorrt cuda模型推理加速部署TensorRT-Alpha《ski facility》)]
[video(video-Ej2C6hgr-1675415817040)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=650665729)(image-https://img-blog.csdnimg.cn/img_convert/04c8cb5b7ebe3fd410e4af53548a668f.jpeg)(title-yolov8 tensorrt cuda模型推理加速部署TensorRT-Alpha《NewYork-Stree》)]
[video(video-xbOkXTEV-1675415667896)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=565721755)(image-https://img-blog.csdnimg.cn/img_convert/a4469f9c7a048393d4fee5b7bba2893d.jpeg)(title-yolov7 tensorrt cuda模型推理加速部署TensorRT-Alpha《Korea-Night》)]
四、參考
https://github.com/FeiYull/TensorRT-Alpha
附錄
一位熱心小夥做的,他好努力,前幾天經常半夜2點、3點給我留言,太捲了,奮鬥精神值得學習。