YOLOV5加速之TensorRT篇

        之前写过一篇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。所以相关代码要在原作者基础上优化,优化后速度要快上不少。但是这个不在本篇博客内容里,想探讨的同学可以留言。

        

你可能感兴趣的:(AI模型加速,pytorch,目标检测)