文章目录

  • 前言
  • 一、浅谈tensorrt
  • 二、tensorrtx的使用学习轨迹
    • 1.tensorrtx-初出茅庐
    • 2.崭露头角-tensorrtx
    • 3.身手不凡-ONNX
    • 4.风云叱咤-ONNX
    • 5.功成名就-ONNX+tensorrtx
  • 总结

前言

本文主要是针对onnx部署方式和tensorrtx(通过tensorrt网络定义API实现网络)两种方式进行对比,特别是刚入坑的小伙伴不知道用哪种方式更合适,更合理时,本文或许能够帮你捋清整个tensorrt的学习思路。另外大部分内容都是基于CV方向,其他领域我也不是很懂,望各位看官海涵


提示:这不是开往幼儿园的车,请各位坐稳抓紧了。

一、浅谈tensorrt

能有兴趣看这篇文章的我想或多或少对tensorrt有所了解,我不知道大家是因为什么了解到的tensorrt,于我而言,简单的说就是工作需要,我自己是做CV方向的,项目到了部署阶段的时候无非就是几种方法,若只想用CPU,可以用openvion,如果希望使用GPU,libtorch和tensorrt两种方式均可,libtorch部署pytorch模型确实很方便,但是考虑到GPU整体资源的利用率和效率等我推荐大家还是直接搞tensorrt,因为tensorrt本身就是nvidia自家的东西,自家的N卡用自己的tensorrt当然合适。我们也是经过了几轮对比测试,发现tensorrt确实很好用,也很快,上手难度说高也高,说不高也不高。至于tensorrt具体是什么,这篇文章不会再做什么介绍了,如果连onnx 或者tensorrt是什么都不是很清楚的朋友,后面内容就不用看了。

二、tensorrtx的使用学习轨迹

1.tensorrtx-初出茅庐

关于初学tensorrt的朋友来说,github中的王鑫宇大神的那个项目代码自己肯定clone到本地了吧,如果没有,我们赶紧来一起看看:
https://github.com/wang-xinyu/tensorrtx

我们可以看到, 鑫宇其实总结了很多不同backbone下的tensorrt的项目,但我看了一下,大部分还都是CV方向的,从基础的网络层到目标检测网络到语义分割等等,还是比较适合新手入门的,我之前yolov5 还算用的比较多,所以最早看的是他的yolov5。

特别注意的是他的运行环境大部分都是Ubuntu 上的,那上面cmake确实比较方便,但贴心的是鑫宇后来也在readme中补了很多windows下的教程,这个项目运行起来难度不是很大,关于Ubuntu上的使用我这里不多说,但就windows上来说如果你cmakelist玩的不是很溜,我建议还是自己重新新建一个项目这样效率反而更高。下面我给出一个简单的教程。
https://blog.csdn.net/qq_34809969/article/details/117852231
这个教程本文就不赘述了,因为并不重要。

鑫宇的工程很不错,但需要自己有点耐心慢慢看,懂c++的人基本是可以看懂他的大概流程的,至于tensorrt的那些层的api写法,没自己研究过tensorrt的一般只能看个大概。
推荐指数 ☆☆☆☆☆

2.崭露头角-tensorrtx

对于初学tensorrt的朋友来说,如果你是做CV方向的,且是yolo系列的忠实用户,这个项目不容错过:
https://github.com/enazoe/yolo-tensorrt
什么这么说,因为他的代码是已经帮你封装好的一些列yolo工程的集合体,加了他的QQ群,群主是个暴脾气,哈哈。
但是代码同样值得我们好好学习和借鉴,鑫宇的代码大都是先从pt文件转到wts文件,而他的工程直接使用了weights和cfg文件,可以看看群主工程化的代码是如何实现一层层网络结构的,和鑫宇代码不太一样的是并没有像鑫宇一层一层实现网络,而是对网络中出现的所有节点进行汇总,比如conv或者pool或者yolo后者concat或者shortcut等等,通过一个大的for循环便利所有blocks,如果想快速使用到自己的工程中,这个项目才是真的不二之选。
推荐指数 ☆☆☆☆☆

3.身手不凡-ONNX

从这开始给大家介绍一下onnx这条分支,官方并没有排斥onnx这种使用方式,反而在某种程度上其实也是推荐的,就连sample例子中也不乏onnx的身影,可见这种方式在某种意义上还是有用武之地的。只是官方说了。tensorrtx的速度还是略快于onnx的,但是如果想省事(其实哪种方式更省事还真不一定呢),是可以试试onnx这种方式的,但是其弊端待我慢慢道来。
首先给大家推荐的一个工程是:
https://github.com/linghu8812/tensorrt_inference
这也是我学习tensorrt最早接触的工程,起初也是同事先开始搞tensorrt 我那段时间没空去学习这个,后来才慢慢补上。这个工程还挺好的,因为里面也涉及了很多不同的backbone,代码也很容易看懂,关于onnx->trt 部分其实代码是公用的,也就是说这部分代码我们几乎不用做什么修改,除非要修改一下workspace或者精度什么。但是关于onnx的生成问题,不同的版本的backbone使用的转换代码其实也不一样的,好比你现在用的是yolov5,可以是一段export代码生成onnx,换成了yolov3或者yolov4你export出onnx又是另一个代码,如果你有几个固定的框架在使用,还好,如果想通过这个onnx 做个通用版本的tensorrt,我觉得很难,没所谓什么绝对的通用,真想通用,难,有办法没有,有,后面会说到。
linghu的工程不多做介绍了,很多地方其实和原版相比还是要有一些小修改,并不是很推荐给大家进行长期使用。但如果想快速上手试试onnx,也是个选择吧。

另外关于yolov3或者yolov3-tiny 工程onnx的转出,一定要使用linghu的代码进行转出,他的代码有个好处就是python版本我们不必非得2.x,很多老的tensorrt 使用onnx 时候,转onnx的代码都需要python2.x,其实很不方便,虽然我也成功了,但过程及其痛苦和艰辛,不建议大家再走python2.x这个路子了,9012年了都,想什么呢。
推荐指数 ☆☆☆☆

4.风云叱咤-ONNX

再给大家推荐一个onnx的工程,就是这个:https://github.com/ttanzhiqiang/onnx_tensorrt_project
其实细心的同学可以发现,如果你想用onnx,有个老项目:
https://github.com/onnx/onnx-tensorrt
反正鄙人没有进行这个工程的测试和运行,但是我推荐的是上面第一个链接,好,真的好。里面的内容包括了centernet + yolov5+ yolo(v3+v4)+classify分类+unet分割 ,怎么样,爽不爽?
推荐指数 ☆☆☆☆☆
如果你纠结自己要做一个通用版本的onnx tensorrt工程,咳咳。。剽就完事了。
其实tensorrt工程看多以后真的大同小异吧,更多的是看不同人的工程化处理,如果使用onnx,无非就是先搞onnx转trt,然后利用这个engine得到context上下文然后进行数据预处理,再将预处理后的数据从cpu搞到gpu,然后gpu进行运算,然后output信息搞回到cpu中,然后后处理得到你要的结果。其实很有意思的是,不同backbone 预处理会有一些小区别,而后处理同样也不尽相同,预处理通常和网络结构没太大关系,比如有这个letterbox,而后处理很多和网络结构有关,到底是怎么处理,需要自己真的懂网络。
另外想说的是,使用onnx得到的engine然后再经过tensorrt加速得到的结果是没有经过后处理的,需要你自己再对这些数据进行处理,这个过程我看过,还挺复杂。而我用鑫宇的代码使用tensorrt加速后得到的结果是已经经过了后处理的,就是输出个数*6(或者7)+1个数据,比如检测到了一个框,输出数据中第一个数据是记录输出个数,后面6个有的是7个继续置信度。类别,还有rect信息等,然后再经过这些都是在gpu中全部搞定,舒服的一b,只有最后的nms是放到cpu上处理,所以也是tensorrtx快一些原因,另外预处理同样可以搞到gpu中哈,cuda编程了解一下,这些都是招式而已,重要的还是修炼自己内功。

5.功成名就-ONNX+tensorrtx

看到这里,相信你确实对这篇文章有些兴趣,那我最后就给你个大保健,送你个一条龙。
https://github.com/wdhao/tensorrtCV
本文的作者一小部分代码融合了onnx,当然onnx这里他不如我上面推荐的这个兄弟搞得透,搞得深,而且代码现在还在不断完善方面,比如几乎没有一个完整的目标检测整体流程代码,但是其思路,我觉得大家可以看看,进行学习,其实也没啥,就是代码中已经搞定了所有经常用到的block。如下(关键是还在不断增加和完善中)。

这玩意搞出来有什么用,嗨,用处可大了,你可以根据自己的网络进行json格式的网络结构编写,代码读进来json信息,最终帮你构建网络,这样可以某种意义上实现所谓的通用,你可以不断优化自己的代码,完善block就行了。
我自己写了个yolov3-tiny的json,这是网上还找不到的,有兴趣的朋友可以进行下载:
https://download.csdn.net/download/qq_34809969/19635384
其实就是这样的一个json文件:

后面他会不断补充json文件,包括我们常用的yolov5s等。敬请期待吧。
另外他b站有个这个工程的教学视频:
https://space.bilibili.com/72373490/
感兴趣的自己看看,学习一下。
其实最最最后,我推荐大家一个学习tensorrt的好资源,就是他去年录得一个视频,视频我这里不方便发,有兴趣的朋友帖子留言QQ号,我加你们然后给你们视频的下载链接。
推荐指数 ☆☆☆☆☆

总结

无,把上面我推荐的5个工程都自己看了跑过了,tensorrt你也就算了是入门了,tensorrt我不建议大家深搞,这就是个工具,能用会用,项目用上,好给甲方吹牛逼就完事了。

一文玩转tensorrt onnx+tensorrtx相关推荐

  1. TensorRT ONNX 基础

    TensorRT ONNX 基础 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下. 概述 TensorRT 的核心在于对模型算子的优化(合并算子 ...

  2. C++深度模型部署bili视频的tensorrt onnx和知乎的libtorch

    问了自动驾驶的工作人员,使用tensorRT的还是占多数 学习Tensor RT和ONNX步骤 TensorRT是什么 https://www.bilibili.com/video/BV1Xw411f ...

  3. tensorrt之tensorrtx编译:遇到的错误提示

    一.tensorrtx 编译步骤: mkdir build cd build cmake .. make // /workspace/tensorrt_release/include# cp -r N ...

  4. tensorRT onnx中属性名相同,但实际大小不同生成问题

    onnx转TensorRT的问题 TensorRT7.0.1.1转换没出问题 TensorRT8.2.4.2一直报下面的错误 4: [shapeCompiler.cpp::nvinfer1::buil ...

  5. TensorRt(2)快速入门介绍

    文章目录 1.使用ONNX部署的示例 1.1.导出模型 1.2.设置batch size批处理大小 1.3.指定数值精度 1.4.转换模型 1.5.部署模型 2.使用ONNX转换为engine再部署的 ...

  6. Speeding Up Deep Learning Inference Using TensorRT

    引用 It uses a C++ example to walk you through converting a PyTorch model into an ONNX model and impor ...

  7. 2021届图像/计算机视觉算法提前批的面经 | 附内推码

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:雲水謡 来源:https://www.nowcoder.com ...

  8. 模型压缩、模型剪枝、模型部署

    模型压缩.模型剪枝.模型部署 目录 模型压缩.模型剪枝.模型部署 ONNX & TensorRT ONNX model: TensorRT使用过程分为两步࿱

  9. ubuntu16.04安装cuda11.3、cudnn8.2.1、tensorrt8.0.3.4全过程

    安装前呢先说明几点,因为之前不熟悉linux 的安装方式,所以看了一下有很多种安装方式,其中包含源码编译.dpkg.apt等,这里的源码方式大家都懂通过Makefile或者cmake进行编译,然后进行 ...

最新文章

  1. 使用代码将github仓库里某个issue同步到CSDN博客上
  2. scrapyd部署爬虫项目到LINUX服务器
  3. python 用一个数组实现三个栈
  4. 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
  5. arm 架构_Arm架构之Arm内核解析
  6. java double 的精度_Java Double的精度问题
  7. amd黑苹果万能显卡驱动_22款显卡乱战《赛博朋克2077》:AMD 4K败走麦城-显卡,赛博朋克2077,AMD,NVIDIA ——快科技(驱动之家旗下媒体)-...
  8. linux CentOS普通用户无法从ssh登录解决方案
  9. PowerShell加密SQL Server的密码技术
  10. c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
  11. solidworks有限元分析_新手学习心得体会
  12. png图片转化为ico图标并保留透明背景方法
  13. 异常与调试之SEH、UEH、VEH、VCH以及SEH原理
  14. 星星之火OIer:总分题解
  15. SystemInit()时钟系统初始化函数解析
  16. 文字识别——检测部分 CTPN论文翻译
  17. 打开计算机页面只有上面一半,我电脑打开网页总是打开一半,不知道是为什么,请高手指教,谢谢!...
  18. 我的微信被限制使用了!
  19. display: flex以及flex-direction,justify-content,align-items
  20. 【读过的书】《杠杆阅读术》

热门文章

  1. 解决error vmlinuz has invalid signature. alloc magic is broken at ...Aborted.press any key to exi
  2. 利用border属性画哆啦A梦
  3. V.CodeGenerator WPF代码生成器
  4. 支付宝口令红包php,支付宝如何发口令红包 支付宝口令红包使用攻略
  5. java语言中类定义数组赋值_在Java语言中,下列对于字符数组的定义并赋值正确的是(选一项)_学小易找答案...
  6. 微信小程序实现各种特效实例
  7. ps快捷键命令#ps学习教程基础视频抠图
  8. 营销型网站建设前期策划的意义
  9. MATLAB实现周期信号的傅里叶级数的展开
  10. Error running 'serve': Please specify npm or yarn package: cannot find binary file inside 'D:\mytool