• Yolov5实例分割Tensorrt部署实战


    0.引言

             ultralytics在yolov5的6.2版本发布了实例分割模型,可实现快速实例分割,采用官方v5s-seg.pt效果如下图所示:

             本博客将以此为基础,开发c++版本的tensorrt推理代码,直接上链接:这里,本人环境为:

    cuda10.2 cudnn8.2.4 Tensorrt8.0.1.6 Opencv4.5.4。。。。。。代码列表如下

    1. ├── CMakeLists.txt
    2. ├── images
    3. │   ├── bus.jpg
    4. │   └── zidane.jpg
    5. ├── logging.h
    6. ├── main1_onnx2trt.cpp
    7. ├── main2_trt_infer.cpp
    8. ├── models
    9. │   ├── yolov5s-seg.engine
    10. │   └── yolov5s-seg.onnx
    11. ├── output.jpg
    12. ├── README.md
    13. └── utils.h

    1.生成onnx模型

            首先我们克隆最新的版本的代码,即6.2版本,并下载对应的pt模型,这里以yolov5s-seg.pt为例进行后面的叙述。

    1. git clone git@github.com:ultralytics/yolov5.git#官方代码
    2. git clone git@github.com:fish-kong/Yolov5-instance-seg-tensorrt.git#我的tensort推理c++代码

            yolov5-6.2的官方代码export.py中提供了直接生成engine的方法,但是我不推荐直接用,原因是生成的engine是跟电脑环境有关的,你换了一个环境之后,之前电脑生成的engine就不能用了,除非两个电脑的环境一模一样,所以我们仅生成onnx模型,命令如下

    python export.py --data coco128-seg.yaml --weights yolov5s-seg.pt --cfg yolov5s-seg.yaml --include onnx
    

    将会生成名字叫yolov5s-seg.onnx,采用Netron打开后,我们可以看到输入是1x3x640x640,输出output0是1x25200x117,输出output1是1x32x160x160,这些size对后续推理很重要,都是需要写进c++推理代码中的参数。

     2. 生成engine模型

    1.首先定位到你clone的repo目录下,就是Yolov5-instance-seg-tensorrt目录下
    2.复制 yolov5s-seg.onnx 到 models/

    3.运行下列代码,生成转换与推理的可执行文件-->onnx2trt  trt_infer

    1. mkdir build
    2. cd build
    3. cmake ..
    4. make

    4.模型转换

    sudo ./onnx2trt ../models/yolov5s-seg.onnx ../models/yolov5s-seg.engine

            通过上述操作,我们能得到yolov5s-seg.engine(前提是安装好了cuda,cudnn,tensorrt,opencv,推荐采用我的版本)

    3.推理

    通过2节操作,其实已经生成了trt_infer这个可执行文件只需要执行即可

    sudo ./trt_infer ../models/yolov5s-seg.onnx ../images/bus.jpg
    1. for (int i = 0; i < 10; i++) {//计算10次的推理速度
    2. auto start = std::chrono::system_clock::now();
    3. doInference(*context, data, prob, prob1, 1);
    4. auto end = std::chrono::system_clock::now();
    5. std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
    6. }

    在main2_trt_infer.cpp中的上述代码是推理10次,并显示时间,在我的1080ti上,基本维持在10ms一帧图片,速度相当之快。

    最终结果如下,对比文章最前面的图(这个是官方code直接用pt推理的结果),可以看出基本一致。

    4.参考

    1.wangxinyu大佬的tensorrtx

    2.UNeedCryDear大佬的opencv推理

    3.2022.09.29更新 c++下面使用opencv部署yolov5和yolov7实例分割模型(六)_爱晚乏客游的博客-CSDN博客_c++ opencv yolo分割

    完整的代码已经上传,直接clone使用即可,欢迎评论区评论如果觉得有用,麻烦给我的github repo点个心,谢谢

  • 相关阅读:
    百题千解计划【CSDN每日一练】计数问题(附解析+多种实现方法:Python、Java、C、C++、JavaScript、C#、go)
    JVM第三话 -- JVM性能调优实战和高频面试题记录
    Vue事件绑定(v-on用法)
    redis未授权访问漏洞【vulhub靶场】复现
    【Java程序员面试专栏 算法思维】一 高频面试算法题:排序算法
    数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景
    找零钱的贪心算法
    康耐视visionpro定位引导标定简介及方法
    react: antd组件使用 FC Fragment
    Java--简介
  • 原文地址:https://blog.csdn.net/qq_41043389/article/details/127754384