之前写过一篇Android版本yolov5s的博客。最近工作搞了下TensorRT,也遇到几个坑不过最终还是实现了,做一下小小的分享。
这里直接上github上大牛的连接,我的代码是在他的基础上改的。里面有很多模型的加速直接看里面的yolov5即可。
https://github.com/wang-xinyu/tensorrtx
注:整个过程在llinux环境下完成
大概流程:
1.将torch模型转换型到.wts
2.cmake 创建编译环境
3.make 编译c++的tensorrt yolov5 工程,这个会最终生成一个yolov5可执行文件这用于转换tensorrt模型以及包括c++(包括cuda c的代码)版本的前后处理代码
4. 转换.wts到.engine
5.运行模型,包括c++版本和python版本
详细流程:
1. 将torch模型转换型到.wts
这个很简单直接跑github工程里面的gen_wts.py即可,这里用到的torch模型最好用best.pt会方便点,整个过程就是获取模型的权重信息
2.cmake 创建编译环境
这一步主要是安装相关的cmake,make,opencv,cuda,cuDNN,tensorrt环境其他也没什么。其中需要说下每个库都有版本要求注意下就好。
大致版本如下:cmake3.5.1 opencv4.3 cuda10.2 tensorrt8
配置好后在build目录下 :
camke ..
3. 只要第二部没问题,这一步主要就是修改模型的参数(batch大小,阈值,模型输入尺寸等):
直接贴作者的原话:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5
- Choose the model s/m/l/x/s6/m6/l6/x6 from command line arguments.
- Input shape defined in yololayer.h
- Number of classes defined in yololayer.h, DO NOT FORGET TO ADAPT THIS, If using your own model
- INT8/FP16/FP32 can be selected by the macro in yolov5.cpp, INT8 need more steps, pls follow
How to Run
first and then go the INT8 Quantization
below
- GPU id can be selected by the macro in yolov5.cpp
- NMS thresh in yolov5.cpp
- BBox confidence thresh in yolov5.cpp
- Batch size in yolov5.cpp
然后就是 make 即可。
4. 这一步也很简单 ,如下我转换的是yolov5l的模型,转换过程稍微有点长耐心等待。这里转换出来的就是tensorrt可以运行的模型,不管是用tensorrt 的c++ API还是python API都可以。
./yolov5 -s yolov5l.wts yolov5l.engine
5.模型的运行实际上有2种方式:
1.作者c++版本的命令: ./yolov5 -d ***********。
2.利用tensorrt的python API:作者也提供了相关的代码yolov5_trt.py。
注:如果模型运行精度和torch结果不一样可能是C++代码batchNorm方法eps数值 导致,修改到和torch一样即可。
个人开发心得:
因为我的工程是在云端运行所以 就直接采用tensorrt python API运行代码,但是yolov5l.engine模型不包括输入图像的前处理和模型后处理NMS相关代码的,这个时候就需要自己写,但是这些代码大部分都是用pytorch的,且在cuda模式运行,这个时候就需要让tensorrt和torch相互拷贝数据数据,且数据必须尽可能都在cuda中运算直到最终结果才拷贝到cpu。所以相关代码要在原作者基础上优化,优化后速度要快上不少。但是这个不在本篇博客内容里,想探讨的同学可以留言。