TensorRT int8 量化部署 yolov5s 5.0 模型
一.yolov5簡介
如果說在目標檢測領域落地最廣的算法,yolo系列當之無愧,從yolov1到現在的"yolov5",雖然yolov5這個名字飽受爭議,但是阻止不了算法部署工程師對他的喜愛,因為他確實又快又好,從kaggle全球小麥檢測競賽霸榜,到star數短短不到一年突破8k,無疑,用硬實力證明了自己。總而言之,用他,用他,用他!(在我的3080顯卡上測試640*640的圖片,yolov5s 5.0 的模型 tensorrt int8 量化后,inference做到了4.6ms一幀!)
二.環境
ubuntu:18.04
cuda:11.1
cudnn:8.0
tensorrt:7.2.2.3
OpenCV:4.5.0
做INT8模型轉換之前,我建議你至少要有搭建Tensorrt的經驗,如yolov5的yolov5s.pt轉yolov5s.engine模型,並且且測試通過的。
此處對環境的安裝就省略了,如果不知道怎么搭建環境,可以參考我之前的記錄:https://www.cnblogs.com/KdeS/p/14928201.html
如有疑問,郵箱聯系
三.yolov5s模型轉換onnx
3.1安裝需要用到的庫
pip install onnx
pip install onnx-simplifier
3.2 轉換onnx
git clone https://github.com/ultralytics/yolov5.git
cd yolov5/models
vim common.py
把BottleneckCSP類下的激活函數替換為relu,tensorrt對leakyRelu int8量化不穩定(這是一個深坑,大家記得避開)即修改為self.act = nn.ReLU(inplace=True)
訓練得到模型后
cd yolov5
python models/export.py --weights 訓練得到的模型權重路徑 --img-size 訓練圖片輸入尺寸
就會產生如下幾個文件
python3 -m onnxsim onnx模型名稱 yolov5s-simple.onnx 得到最終簡化后的onnx模型
如果你的Tensorrt中有models/export.py ,那么上面的項目就不用出伏拉取了,可以直接用export.py 轉onnx模型,操作步驟不變
四.onnx模型轉換為 int8 tensorrt引擎
git clone https://github.com/Wulingtian/yolov5_tensorrt_int8_tools.git(求star)
cd yolov5_tensorrt_int8_tools
vim convert_trt_quant.py 修改如下參數
BATCH_SIZE 模型量化一次輸入多少張圖片
BATCH 模型量化次數
height width 輸入圖片寬和高
CALIB_IMG_DIR 訓練圖片路徑,用於量化
onnx_model_path onnx模型路徑
python3 convert_trt_quant.py 量化后的模型存到models_save目錄下
成功后會產生兩個文件:
注意:
此處有兩點注意事項
1.BATCH_SIZE*BATCH要小於或等於訓練圖片數量,否則會報錯
2.測試前models_save目錄不能有其他文件,如果models_save目錄沒有則需要自己創建,否則會報錯
五.tensorrt模型推理
git clone https://github.com/Wulingtian/yolov5_tensorrt_int8.git(求star)
cd yolov5_tensorrt_int8
5.1 修改 vim CMakeLists.txt
修改USER_DIR參數為自己的用戶根目錄,圖中划線的位置都需要根據自己的環境做修改
5.2修改 vim http://yolov5s_infer.cc 修改如下參數
output_name1 output_name2 output_name3 yolov5模型有3個輸出(這里目錄可按照下圖填上去,不能隨便填)
trt_model_path 量化的的tensorrt推理引擎(models_save目錄下trt后綴的文件)
test_img 測試圖片路徑
INPUT_W INPUT_H 輸入圖片寬高
NUM_CLASS 訓練的模型有多少類
NMS_THRESH nms閾值
CONF_THRESH 置信度
5.3 安裝netron
我們可以通過netron查看模型輸出名
pip install netron 安裝netron
vim netron_yolov5s.py 把如下內容粘貼
import netron
netron.start('此處填充簡化后的onnx模型路徑', port=3344)
python3 netron_yolov5s.py 即可查看 模型輸出名
參數配置完畢 !
5.4 編譯
mkdir build
cd build
cmake ..
make
./RepVGGsEngine 輸出平均推理時間,實測平均推理時間小於1ms一幀,不得不說,RepVGG真的很香!至此,部署完成!由於我訓練的是貓狗識別下面放一張貓狗同框的圖片結尾。
參考文獻:
https://zhuanlan.zhihu.com/p/348110519
https://my.oschina.net/u/4580321/blog/4951406