七天七夜,终于实现了实时的实例分割算法部署TensorRT,40FPS!

本文由林大佬原创,转载请注明出处,我们有来自腾讯、阿里等一线AI算法工程师组成微信交流群, 如果你想交流欢迎添加微信: jintianandmerry 拉群, 添加请备注 “交流群”

2021年的第一篇文章, 我和我的团队经过七天七夜的赶工 (元旦三天别人跨年我们和键盘度过了三天…),终于将panopticfcn部署到了TensorRT, 关于这个算法我在之前的文章有给大家讲解,可以说是一篇非常非常新鲜的文章, 论文中mAP可以高达32, 与MaskRCNN一样, 并且这个算法是一个全景分割算法, 它可以产生的是一个全景分割的输出.

我们都知道, 现如今在实例分割这个领域, 能够跑到Realtime的算法很少, 能够跑到超过实时的算法就更少了. 大家比较熟悉的MaskRCNN, 在detectron2里面, 即便是输入在512的尺寸, 速度也只能达到8-9ms, 这个速度连10fps都没有. 而对于一些实时的算法, 比如Yolact, 它的速度虽然很快,但是精度很感人. 在实际使用中,几乎是不可用的. 而如今我们可以得到一个精度可以和MaskRCNN相媲美, 但同时速度是它40倍的算法! 当然这个加速是基于TensorRT以及算法两部分加成的, 且PanopticFCN并非是一个2 stage的算法, 因此速度相较于MaskrCNN是一个很大的优势.

先来看一下我们最终实现的效果吧:

我们做到的速度大概是网络前传19ms, 所有包括可视化后处理等大概24ms, 总的FPS可以达到40! 可以看到这个速度还是很快的, 并且对于一些小目标的分割来说, 丝毫没有太大的影响.

这个模型的python代码和论文相关大家可以参照:

https://github.com/yanwei-li/PanopticFCN

当然在实现这个模型转tensorrt的过程中, 也是很麻烦的, 遇到了许多挑战(不然不会让我们的男子天团耗费七天七夜的时间). 首先在转到onnx的时候就遇到了许多问题, 比如这个模型是把实例和背景图全部当做是分割图并杂糅在一起的, 我们一开始的思路是先把实例 部分抠出来做部署,因此这两个部分拆分需要修改不少模型的代码. 另外就是这个模型具有5层的FPN的输出, 这和Fcos等模型操作一样, 如何merge这5层的操作, 并将这些输出全部塞到onnx里面去,需要一些技巧. 还有就是这个模型的后处理,涉及到很多TopK的操作, 熟悉模型部署的同学应该都知道, TopK是一个很麻烦的事情, 首先onnx转tensorrt的时候是不支持topk的, 或者对于topk支持不够完全, 另外就是这个模型最大的难点和SOlOv2的TensorRT部署是一样的, 也就是: 它的mask生成是通过卷积权重来合成的, 这就意味着输出有一部分是卷积的权重.

我们最终踏平了所有困难, 导出onnx大概只占了我们所有工作量的30%, 剩下的工作都是在debug CUDA代码…

我们在这个项目里主要实现了:

  • panopticfcn的onnx导出, 当然这个导出我们尽可能的把所有的操作塞进了onnx里面;
  • 解决了InstanceSegmentation op在tensorrt支持的问题;
  • 解决了GatherElements的问题, 事实上GatherElements在TensorRT不支持;
  • 通过将所有的后处理封装为一个Plugin实现了所有的后处理操作, 最后的输出直接就是mask;
  • 实现了一套可行的方案, 处理输出是conv卷积权重的问题.

最后完成了一整套的解决方案. 据我们所知, 这也是业内能找到的唯一一个能跑到这么快的实例分割TensorRT部署方案. 顺便打个广告, 同样的算法和方案也可以通过onnx部署到任何平台, 包括FPGA, CPU, 以及其他库, 欢迎私聊我进行进一步的商业合作.

算法讲解

这个算法的大概处理流程是这样的:

具体细节 大家也可以查看论文. 在处理的时候这里面的难点就是:

  1. KernelGenerator如何处理;
  2. 如何拆分Thing和Stuff, 有人问为什么要拆分, 因为不拆分后处理很复杂,我们无法确保拿到正确的结果, 现在验证了实例部分我们会想办法把全景也加入;
  3. 如何通过Feature encoder输出的feature, 联合输出的卷积权重来生成mask.

由于解决方案过于复杂, 就不赘述了, 具体大家可以从神力平台获取python代码查看具体的修改:

http://manaai.cn

TensorRT部署

最后我们的部署方案在GTX1080TI可以跑到 40FPS, 在RTX2080Ti使用fp16预测速度可以缩减到10ms. 如果再进一步对模型进行小模型优化,速度可以更快. 我们目前部署的版本是Resnet50.

我们在使用C++进行TensorRT部署时发现. 模型的后处理可以尽可能的快, 只要onnx和tensorrt的engine截断方式合理. 由于我们的导出策略, 将大部分复杂的运算全部转成了固定的engine, 从而最终的后处理时间被大大的缩短. 这相较于MaskRCNN等二阶段的实例分割算法部署带来的好处就是更快的端到端时间, 并且不受限于实例的个数.

下一步

大家可以在神力平台获取到我们修改过的python代码 (支持onnx导出以及推理), 同时也可以获取到tensorrt的对应加速方案. 但禁止白嫖, 现在植发越来越贵了,哎…

更多

如果你想学习人工智能,对前沿的AI技术比较感兴趣,可以加入我们的知识星球,获取第一时间资讯,前沿学术动态,业界新闻等等!你的支持将会鼓励我们更频繁的创作,我们也会帮助你开启更深入的深度学习之旅!

往期文章

https://zhuanlan.zhihu.com/p/165009477

https://zhuanlan.zhihu.com/p/149398749

https://zhuanlan.zhihu.com/p/147622974

https://zhuanlan.zhihu.com/p/144727162

七天七夜,终于实现了实时的实例分割算法部署TensorRT,40FPS!相关推荐

  1. 韩国ETRI提出实时Anchor-Free实例分割算法CenterMask,代码将开源

    点击我爱计算机视觉标星,更快获取CVML新技术 今天来自韩国ETRI的一篇论文CenterMask : Real-Time Anchor-Free Instance Segmentation 很抢眼, ...

  2. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条

    作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee 译者 | 刘畅 责编 | Jane 出品 | AI科技大本营(id:rgznai100) [导 ...

  3. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法

    这个带分割是25帧,有漏检. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 原文:速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条 https:/ ...

  4. 超Mask RCNN速度4倍,仅在单个GPU训练的实时实例分割算法

    点击我爱计算机视觉标星,更快获取CVML新技术 作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee 译者 | 刘畅 责编 | Jane 出品 | ...

  5. CVPR2020论文解析:实例分割算法

    CVPR2020论文解析:实例分割算法 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation 论文链接:https://arxiv ...

  6. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)

    CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020) 目标检测:FCOS(CVPR 2019) 目标检测算法FCOS(FCOS: ...

  7. 汇总|实时性语义分割算法(全)

    我们在上篇--汇总|实时性语义分割算法(上篇)中,已经总结了[1]~[12],这里我们继续. [13]用于实时语义分割的双向分割网络 <BiSeNet: Bilateral Segmentati ...

  8. 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自新智元(AI_era)   新智元报道   来源:投稿 编辑:元子 [新智元导读]本文提出了一种基于边界框回归的高效点云实例分割算法,通过最小 ...

  9. yolov7 姿态识别-人体骨架-实时检测+实例分割

    (15条消息) YOLOv7实例分割_迷途小书童的Note的博客-CSDN博客https://blog.csdn.net/djstavaV/article/details/126357677 (15条 ...

最新文章

  1. ITextHtml2canvas js截图 绘制 导出PDF
  2. dBm与Vpp相互转换公式
  3. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
  4. 基于 Bochs 的操作系统内核实现
  5. android第一天
  6. 【TYVJ】1359 - 收入计划(二分)
  7. kafka单机安装(版本kafka_2.11-2.2.0.tgz)
  8. gulp 实现sass自动化 ,监听同步
  9. 2套RAC环境修改scanip后客户端连接异常
  10. pb 如何导出csv_《通讯录管理系统》之 5——数据导出
  11. 【操作系统】Nachos 内核线程
  12. linux 命令是什么的缩写,Linux一部分命令解释(命令缩写代表什么意思)
  13. 让Myeclipse10支持Mac OSX – Retina显示屏
  14. 【React】377- 实现 React 中的状态自动保存
  15. 什么是iBeacon?
  16. Android多进程从头讲到尾,成功定级腾讯T3-2
  17. 【数据结构】最大曼哈顿距离
  18. 8583报文格式介绍
  19. jsp/servlet 实现的图书管理系统
  20. 实战演练--保存QQ账号与密码

热门文章

  1. 【程序设计】Python的桥梁模式
  2. 第六届“温度记录器”—数据类型(u8、u16、u32)+EEPROM存储16位、32位数据方法+EEPROM_Write()的延时
  3. android系统源码7.1.2_r8下载,编译,运行到nexus5X上,修改源码并编译SDK进行测试
  4. 如何创建CSR文件 Apple开发 csr文件
  5. javacv音视频截图,音频抽取汇总
  6. 中科院软件所实习 DAY1
  7. 怎么通过当地时区计算格林尼治_为什么大家都爱买N厂“可乐圈”|劳力士格林尼治...
  8. java知识点快速过
  9. CSS设置链接的样式
  10. jmeter----jtl文件解析