Win10下yolov8 tensorrt模型加速部署【實戰】

FeiYull發表於2023-02-04

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推理結果。
yolov8n : Offical( left ) vs Ours( right )

yolov8n : Offical( left ) vs Ours( right )

在這裡插入圖片描述

yolov7-tiny : Offical( left ) vs Ours( right )

在這裡插入圖片描述

yolov6s : Offical( left ) vs Ours( right )

在這裡插入圖片描述

yolov5s : Offical( left ) vs Ours( right )

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賬號,如果您有別的途徑下載安裝也可以。

請新增圖片描述

- 重啟系統

2.2 安裝庫

注:Nvidia相關網站需要註冊賬號。

2.2.1 安裝Nvidia顯示卡驅動

請新增圖片描述

  • 選擇:[搜尋]->[下載] ->[雙擊預設安裝] -> [重啟系統] -> [進入cmd],輸入如下指令:
nvidia-smi

看到如下資訊表明驅動正常:

請新增圖片描述

2.2.2 安裝 cuda11.2

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點給我留言,太捲了,奮鬥精神值得學習。

請新增圖片描述

https://www.bilibili.com/video/BV1SM411i7km/?spm_id_from=333.999.0.0&vd_source=a96c9c3f099f4167807291a34fd50fd5

相關文章