一文玩转tensorrt onnx+tensorrtx
文章目录
- 前言
- 一、浅谈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相关推荐
- TensorRT ONNX 基础
TensorRT ONNX 基础 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下. 概述 TensorRT 的核心在于对模型算子的优化(合并算子 ...
- C++深度模型部署bili视频的tensorrt onnx和知乎的libtorch
问了自动驾驶的工作人员,使用tensorRT的还是占多数 学习Tensor RT和ONNX步骤 TensorRT是什么 https://www.bilibili.com/video/BV1Xw411f ...
- tensorrt之tensorrtx编译:遇到的错误提示
一.tensorrtx 编译步骤: mkdir build cd build cmake .. make // /workspace/tensorrt_release/include# cp -r N ...
- tensorRT onnx中属性名相同,但实际大小不同生成问题
onnx转TensorRT的问题 TensorRT7.0.1.1转换没出问题 TensorRT8.2.4.2一直报下面的错误 4: [shapeCompiler.cpp::nvinfer1::buil ...
- TensorRt(2)快速入门介绍
文章目录 1.使用ONNX部署的示例 1.1.导出模型 1.2.设置batch size批处理大小 1.3.指定数值精度 1.4.转换模型 1.5.部署模型 2.使用ONNX转换为engine再部署的 ...
- 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 ...
- 2021届图像/计算机视觉算法提前批的面经 | 附内推码
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:雲水謡 来源:https://www.nowcoder.com ...
- 模型压缩、模型剪枝、模型部署
模型压缩.模型剪枝.模型部署 目录 模型压缩.模型剪枝.模型部署 ONNX & TensorRT ONNX model: TensorRT使用过程分为两步
- ubuntu16.04安装cuda11.3、cudnn8.2.1、tensorrt8.0.3.4全过程
安装前呢先说明几点,因为之前不熟悉linux 的安装方式,所以看了一下有很多种安装方式,其中包含源码编译.dpkg.apt等,这里的源码方式大家都懂通过Makefile或者cmake进行编译,然后进行 ...
最新文章
- 使用代码将github仓库里某个issue同步到CSDN博客上
- scrapyd部署爬虫项目到LINUX服务器
- python 用一个数组实现三个栈
- 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
- arm 架构_Arm架构之Arm内核解析
- java double 的精度_Java Double的精度问题
- amd黑苹果万能显卡驱动_22款显卡乱战《赛博朋克2077》:AMD 4K败走麦城-显卡,赛博朋克2077,AMD,NVIDIA ——快科技(驱动之家旗下媒体)-...
- linux CentOS普通用户无法从ssh登录解决方案
- PowerShell加密SQL Server的密码技术
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
- solidworks有限元分析_新手学习心得体会
- png图片转化为ico图标并保留透明背景方法
- 异常与调试之SEH、UEH、VEH、VCH以及SEH原理
- 星星之火OIer:总分题解
- SystemInit()时钟系统初始化函数解析
- 文字识别——检测部分 CTPN论文翻译
- 打开计算机页面只有上面一半,我电脑打开网页总是打开一半,不知道是为什么,请高手指教,谢谢!...
- 我的微信被限制使用了!
- display: flex以及flex-direction,justify-content,align-items
- 【读过的书】《杠杆阅读术》
热门文章
- 解决error vmlinuz has invalid signature. alloc magic is broken at ...Aborted.press any key to exi
- 利用border属性画哆啦A梦
- V.CodeGenerator WPF代码生成器
- 支付宝口令红包php,支付宝如何发口令红包 支付宝口令红包使用攻略
- java语言中类定义数组赋值_在Java语言中,下列对于字符数组的定义并赋值正确的是(选一项)_学小易找答案...
- 微信小程序实现各种特效实例
- ps快捷键命令#ps学习教程基础视频抠图
- 营销型网站建设前期策划的意义
- MATLAB实现周期信号的傅里叶级数的展开
- Error running 'serve': Please specify npm or yarn package: cannot find binary file inside 'D:\mytool