当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=jpeg


作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee

译者 | 刘畅

责编 | Jane

出品 | AI科技大本营(id:rgznai100)

 

【导读】在论文《YOLACT:Real-time Instance Segmentation》中,作者提出了一种简洁的实时实例分割全卷积模型,仅使用单个 Titan Xp,以 33 fps 在MS COCO 上实现了 29.8 的 mAP,速度明显优于以往已有的算法。而且,这个结果是就在一个 GPU 上训练取得的!

 

引言

 

一开始,作者提出了一个疑问:创建实时实例分割算法需要什么?

 

在过去的几年中,在实例分割方向取得了很大进展,部分原因是借鉴了物体检测领域相关的技术。比如像 mask RCNN 和 FCIS 这样的实例分割方法,是直接建立在像Faster R-CNN 和 R-FCN 这样的物体检测方法之上。然而,这些方法主要关注图像性能,而较少出现 SSD,YOLO 这类关注实时性的实例分割算法。因此,本文的工作主要是来填补这一空白。SSD 这类方法是将 Two-Stage 简单移除成为 One-Stage 方法,然后通过其它方式来弥补性能的损失。而这类方法在实例分割领域扩充起来却并不容易,由于 Two-Stage 的方法高度依赖于特征定位来产生 mask,而这类方法不可逆。而 One-Stage 的方法,如 FCIS,由于后期需要大量的处理,因此也达不到实时。

 

YOLACT 介绍


基于此,作者在这项研究中提出一种放弃特征定位的方法——YOLACT(You Only Look At CoefficienTs)来解决实时性问题。


YOLACT 将实例分割分解为两个并行任务:(1)在整副图像上生成非局部原型 mask 的字典;(2)为每个实例预测一组线性组合系数。 从这两部分内容生成全图像实例分割的想法简单:对于每个实例,使用预测的系数线性组合原型,然后用预测边界框来 crop。作者通过这种方式来让网络学会如何定位实例mask本身,这些在视觉上,空间上和语义上相似的实例,在原型中却不同。


作者发现,由于这个过程不依赖于 repooling,因此此方法可以产生高质量和高动态稳定性的 masks。尽管本文使用了全卷积网络实现,但模板 mask 可以自己在具有平移变换情况下对实例进行定位。最后,作者还提出了 Fast NMS,这比标准 NMS 的快12ms,并且性能损失很小。

 

这种方法有是三个优点:第一,速度非常快。第二,由于没使用类似“repool”的方法,mask的质量非常高。第三,这个想法可以泛化。生成原型和mask系数的想法可以添加到现有的目标检测的算法里面。

算法

 

算法介绍

 

为了提高实例分割的速度,作者提出了一种快速、单阶段的实例分割模型——YOLACT。主要思想是将 Mask 分支添加到单阶段目标检测框架中。因此,研究人员将实例分割任务分解为两个更简单的并行任务,将其组合以形成最终的 Mask。YOLACT 的网络结构图如下图所示。

       640?wx_fmt=png       

作者将实例分割的复杂任务分解为两个更简单的并行任务,这些任务可以组合以形成最终的 mask。 第一个分支使用 FCN 生成一组图像大小的“原型掩码”(prototype masks),它们不依赖于任何一个实例。第二个是给目标检测分支添加额外的 head ,用于预测每个 anchor 的“掩码系数”(mask coefficients)的向量,其中 anchor 是在编码原型空间中的实例表示。最后,对经过NMS后的每个实例,本文通过线性组合这两个分支来为该实例构造mask。

 

YOLACT 将问题分解为两个并行的部分,利用 fc 层(擅长产生语义向量)和 conv 层(擅长产生空间相干掩模)来分别产生“掩模系数”和“原型掩模” 。因为原型和掩模系数可以独立地计算,所以 backbone 检测器的计算开销主要来自合成(assembly)步骤,其可以实现为单个矩阵乘法。通过这种方式,论文中的方法可以在特征空间中保持空间一致性,同时仍然是 One-Stage 和快速的。

 

  • 原型生成

       640?wx_fmt=png       

原型生成分支是预测整个图像的一组K个原型 mask。采用 FCN 来实现protonet ,其最后一层有 k 个 channels(每个原型一个)并将其附加到 backbone 特征层。

 

  • 掩码系数(mask coefficients)

       640?wx_fmt=png      

在实验中,YOLACT 为每个Anchor预测(4+C+k)个值,额外 k 个值即为 mask系数。另外,为了能够通过线性组合得到 mask,很重要的一步是从最终的mask 中减去原型 mask。换言之,mask 系数必须有正有负。所以,在 mask系数预测时使用了 tanh 函数进行非线性激活,因为 tanh 函数的值域是(-1,1)。

 

  • 合成Mask

 

为了生成实例掩模,通过基本的矩阵乘法配合 sigmoid 函数来处理两分支的输出,从而合成 mask。

640?wx_fmt=png

                                                                   

其中,P 是 h×w×k 的原型 mask 集合;C 是 n×k 的系数集合,代表有 n 个通过 NMS 和阈值过滤的实例,每个实例对应有 k 个 mask 系数。

 

Loss 设计:Loss 由分类损失、边界框回归损失和 mask 损失三部分组成。其中分类损失和边界框回归损失同 SSD,mask 损失为预测 mask 和 ground truth mask 的逐像素二进制交叉熵。

 

Mask 裁剪:为了改善小目标的分割效果,在推理时会首先根据检测框进行裁剪,再阈值化。而在训练时,会使用 ground truth 框来进行裁剪,并通过除以对应 ground truth框面积来平衡 loss 尺度。

 

  • Emergent Behavior

 

在实例分割任务中,通常需要添加转移方差。在 YOLACT 中唯一添加转移方差的地方是使用预测框裁剪 feature map 时。但这只是为了改善对小目标的分割效果,作者发现对大中型目标,不裁剪效果就很好了。

 

  • Backbone 检测器

 

因为预测一组原型 mask 和 mask 系数是一个相对比较困难的任务,需要更丰富更高级的特征,所以在网络设计上,作者希望兼顾速度和特征丰富度。因此,YOLACT 的主干检测器设计遵循了 RetinaNet 的思想,同时更注重速度。 YOLACT 使用 ResNet-101 结合 FPN 作为默认主干网络,默认输入图像尺寸为550×550,如上图所示。使用平滑-L1 loss 训练 bounding box 参数,并且采用和 SSD 相同的 bounding box 参数编码方式。 使用 softmax 交叉熵训练分类部分,共(C+1)个类别。同时,使用 OHEM 方式选取训练样本,正负样本比例设为 1:3. 值得注意的是,没有像 RetinaNet 一样采用 focal loss。

 

  • 快速 NMS(fast NMS)

 

a.对每一类的得分前 n 名的框互相计算 IOU,得到 C*n*n 的矩阵X(对角矩阵),对每个类别的框进行降序排列。

 

b.其次,通过检查是否有任何得分较高的框与其 IOU 大于某个阈值,从而找到要删除的框,通过将 X 的下三角和对角区域设置为 0 实现。这可以在一个批量上三角中实现,之后保留列方向上的最大值,来计算每个检测器的最大 IOU 矩阵 K。

 

c.最后,利用阈值 t(K<t)来处理矩阵,对每个类别保留最优的检测器。


640?wx_fmt=png

                             

论文实验

 

作者在 MS COCO 的 test-dev 数据集上对 YOLACT 和目前最好的方法进行了性能对比。本文的关注点在于速度的提升,且所有实验都是在 Titan Xp 上进行的,故一些结果和原文中的结果可能略有不同。

       640?wx_fmt=png       

实验来验证本文模型在不同大小输入图像情况下的性能。除了基本的 550×550 模型,还有输入为 400×400 和 700×700 的模型,相应地也调整了 anchor 的尺寸(sx=s550/550*x s)。降低图像大小会导致性能的大幅度下降,这说明越大的图像进行实例分割的性能越好,但提升图像尺寸带来性能提升的同时会降低运行速度。

 

当然作者还做了关于 Mask 质量与视频动态稳定性相关的对比实验,并详细分析了优劣缘由。详见论文。

 

总结

 

YOLACT 网络的优势:快速,高质量的 mask,优良的动态稳定性。

YOLACT 网络的劣势:性能略低于目前最好的实例分割方法,很多由检测引起的错误,分类错误和边界框的位移等。

 

此外,作者最后还提到了该方法的一些典型错误:

 

1)定位误差:当场景中一个点上出现多个目标时,网络可能无法在自己的模板中定位到每个对象,此时将会输出一些和前景 mask 相似的物体,而不是在这个集合中实例分割出一些目标。

 

2)特征泄露(Leakage):网络对预测的集成 mask 进行了裁剪,但并未对输出的结果进行去噪。这样一来,当b-box 准确的时候,没有什么影响,但是当 b-box 不准确的时候,噪声将会被带入实例 mask,造成一些“泄露”。

 

解读到这里告一段落,感兴趣的小伙伴可以在下方地址中阅读 Paper 原文~


原文地址:

https://arxiv.org/pdf/1904.02689.pdf

代码地址:

https://github.com/dbolya/yolact


(*本文为 AI科技大本营编译文章,转载请微信联系1092722531


精彩推荐


640?wx_fmt=png


推荐阅读:


  • 免费GPU哪家强?谷歌Kaggle vs. Colab

  • 高能!8段代码演示Numpy数据运算的神操作

  • 从3年前接触区块链, 到开发出装机量最大客户端Geth, 看看人家的职业发展之路|人物志

  • 刚刚!6月榜单:JS跌惨,Python又霸榜,C++再无翻身可能!

  • 互联网大佬高考往事

  • 他是哈佛计算机博士,却成落魄画家,后逆袭为硅谷创业之父 |人物志

  • Lambda 表达式有何用处?


640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

相关文章:

JSP内置对象基础知识小结

JSP提供9大内置内象&#xff1a;一、request内象&#xff1a;封装了由客户端生成的HTTP请求的所有细节&#xff0c;主要包括了http头信息&#xff0c;系统信息&#xff0c;请求方式&#xff0c;请求参数等。1、获取访问请求参数&#xff1a;request.getParameter("arg&quo…

一个正执行的程序如何启动另一新程序并关闭现执行程序

最简单的方法有两个函数即可实现&#xff1a; //启动新程序WinExec("存放另一新程序的路径", SW_SHOW);//关闭现执行软件 ExitThread(0); 若在win ce 下&#xff0c;用WinExec这个函数就不对了&#xff0c;那时就应该用ShellExecuteEx了。 SHELLEXECUTEINFO ShExecIn…

【android】java.lang.NoClassDefFoundError或classnotfount等异常错误

在android上开发&#xff0c;当导入一个外部的包&#xff0c;可能会出现这类错误&#xff0c;我已经两次碰到了&#xff0c;一次是用科大讯飞的android开发包&#xff0c;另一次是用Jsoup包&#xff08;html 解析&#xff09;。 解决方案&#xff1a; 先去掉加入的外部包 不要把…

Java面试题(一)部分题目

博主马上要面对几家公司的面试&#xff0c;故自己准备了点面试题&#xff0c;仅供参考&#xff01; 1&#xff0c;线程的创建的方式&#xff1a;答&#xff1a;1,继承Thread(注意&#xff0c;此类其实也是实现了Runnable接口的)&#xff0c;2,实现Runnable接口2&#xff0c;1. …

在win ce中如何使正在运行的软件自动升级更新

创建两个独立的程序A和B&#xff1a;A是现正在运行的程序&#xff0c;B是用于辅助新版本的A覆盖旧版A 在客户端先运行A&#xff0c;使A提供从服务器端下载新版A放于一临时文件夹中&#xff0c;并运行B&#xff0c;关闭A&#xff1b; 运行的B用于执行&#xff1a;用新版A覆盖旧…

刘铁岩:AI打通关键环节,加快物流行业数字化转型

导语&#xff1a;近日&#xff0c;在微软亚洲研究院创新论坛上&#xff0c;微软亚洲研究院副院长刘铁岩分享了关于“AI物流”行业的实践经验。以下为其发言内容。 随着时代的发展&#xff0c;人工智能成为了决定性的技术&#xff0c;我们所谈的企业数字化转型也正在从“互联网”…

Unity的三种Interceptor

Unity默认提供了三种拦截器&#xff1a;TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。 TransparentProxyInterceptor&#xff1a;代理实现基于.NET Remoting技术&#xff0c;它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRe…

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei&#xff08;腾讯高级工程师&#xff09;转载自腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说&#xff0c;机器相比人类的最大优点之一&#xff0c;就是机器可以不眠不休的重复做某件事情&#xff0c;但人却不行。而“循环”&#xff0c;则是实现让…

作为JavaScript开发人员,这些必备的VS Code插件你都用过吗

本文翻译自&#xff1a;https://www.sitepoint.com/vs-code-extensions-java-developers/转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。如今&#xff0c;Visual Studio Code无疑是最流行的轻量级…

matlab常遇小问题汇总

1、如何注释掉多行&#xff1a; 同时注释掉多行&#xff0c;有2种方法可行&#xff1a; (1)、选中所有要注释的行&#xff0c;按快捷键"Ctrl R" 或者 选择工具菜单"Text --> Comment"; 如果释放所有要注释的行&#xff0c;则按快捷键"Ctrl T&qu…

《几何与代数导引》习题1.35.4

求直线之间的距离$l_1:\frac{x1}{-1}\frac{y-1}{3}\frac{z5}{2}$.$l_2:\frac{x}{3}\frac{y-6}{-9}\frac{z5}{-6}$.解&#xff1a;点$q(-1,1,-5)$在直线$l_1$上&#xff0c;点$p(0,6,-5)$在直线$l_2$上.$\vec{pq}(-1,-5,0)$.直线$l_1$的方向向量为$(-1,3,2)$,直线$l_2$的方向向量…

深度学习难,这本书让你轻松学深度学习

深度学习在短短几年之内便让世界大吃一惊。它非常有力地推动了计算机视觉、自然语言处理、自动语音识别、强化学习和统计建模等多个领域的快速发展。随着这些领域的不断进步&#xff0c;人们现在可以制造自动驾驶的汽车&#xff0c;基于短信、邮件甚至电话的自动回复系统&#…

matlab中用于小数取整的函数的用法

matlab中小数取整的函数大约有四个&#xff1a;floor、ceil、round、fix 若 A [-2.0, -1.9, -1.55, -1.45, -1.1, 1.0, 1.1, 1.45, 1.55, 1.9, 2.0]; floor:朝负无穷方向靠近最近的整数&#xff1b; floor(A) ans -2 -2 -2 -2 -2 1 1 1 1 …

SQLServer之删除约束

使用SSMS数据库管理工具删除约束 1、连接数据库&#xff0c;选择数据表-》展开键或者约束-》选择要删除的约束-》右键点击-》选择删除。 2、在删除对象弹出框中-》点击确定。 3、刷新表-》展开键或者约束-》查看结果。 使用T-SQL脚本删除约束 语法&#xff1a; --声明数据库使用…

新建silverlight项目提示未将对象设置到实例解决方案

1.打开 visual studio 命令提示 输入一下命令 2.devenv /resetskippkgs 这条命令会启动visual stuio 关闭visual studio然后输入下面的命令3.devenv /setup

毕业十年后,我忍不住出了一份程序员的高考试卷

作者 | 程序员小吴转载自公众号五分钟学算法&#xff08;ID: CXYxiaowu&#xff09;一、选择题&#xff08;共计 50 分&#xff09;1、在下列四种排序算法&#xff0c;只有&#xff08; &#xff09;是一种不稳定排序A、冒泡排序B、选择排序C、插入排序D、归并排序2、一个数组&…

查看matlab中函数源代码的方法

有几种方法可以实现查看matlab里自带函数的源代码&#xff1a; 在命令窗口中输入&#xff1a; (1)、type 函数名(如 type rgb2gray 或者 type rgb2gray.m):即可在命令窗口中显示此函数的源代码&#xff1b; (2)、open 函数名(如 open rgb2gray 或者 open rgb2gray.m):即可打开…

Watir-webdriver处理table

最近大脸猫同学给了我一个popup的demo&#xff0c;让我试着定位弹出窗口中的按钮元素。在研究过程中&#xff0c;发现webdriver与watir代码有区别&#xff0c;一度让我很郁闷&#xff0c;在网上也找不到相应的解决方案&#xff0c;刚才code运行成功&#xff0c;在这记一笔&…

PyTorch Hub发布获Yann LeCun强推!一行代码调用经典模型

作者 | Team PyTorch译者 | Monanfei责编 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;6月11日&#xff0c;Facebook PyTorch 团队推出了全新 API PyTorch Hub&#xff0c;提供模型的基本构建模块&#xff0c;用于提高机器学习研究的模型复…

【会议纪要】非洲新经济-线下沙龙分享

沙龙 主题&#xff1a; 《解开非洲新经济神秘面纱》 时间&#xff1a; 2018年09月08日 14&#xff1a;00 ~ 15&#xff1a;00 地点&#xff1a; 杭州丰潭路 UXCoffee 背景&#xff1a; 随着中非合作峰会召开&#xff0c;非洲发展潜力越来越受到关注。。。许多人眼中的非洲是贫穷…

图像处理和图像识别中常用的matlab函数

下面仅给出函数的大概意思&#xff0c;详细用法见&#xff1a; help 函数名 或 matlab help 1、imread&#xff1a;read image from graphics file&#xff1b; 2、imshow&#xff1a;display image in Handle Graphics figure&#xff1b; 3、imwrite&#xff1a;write image…

Powershell管理Active Directory 复制和拓扑

Powershell管理Active Directory 复制和拓扑 Active Directory 的 Windows PowerShell (AD) 支持复制和拓扑管理。它包含了管理复制、站点、域和林、域控制器和分区的功能。过去的管理工具&#xff08;如 AD 站点和服务管理单元与 repadmin.exe&#xff09;的用户将发现如今也可…

实战 | 如何用最快的速度学会Dlib人脸识别开发?

作者 | 小宋是呢来源 | 转载自小宋是呢项目GitHub地址&#xff1a;https://github.com/xiaosongshine/dlib_face_recognition1.背景介绍Dlib是一个深度学习开源工具&#xff0c;基于C开发&#xff0c;也支持Python开发接口&#xff0c;功能类似于TensorFlow与PyTorch。但是由于…

matlab内存管理

转自&#xff1a;http://my.donews.com/deng/2006/09/24/vijgqxehmkxiruywdauvxyiafogtskeymhyw/ 用 Matlab 进行大规模科学计算或仿真时&#xff0c;内存是一个需要时常注意的问题。当你写的 Matlab 程序跳出“Out of Memory” 时&#xff0c;以下几点措施是需要优先考虑的解决…

Koa2和Redux中间件源码研究

一、Koa2中间件源码分析 在Koa2中&#xff0c;中间件被存放在一个数组中。 使用koa中&#xff0c;最常见的就是app.use(fn)&#xff0c;use函数部分源码如下所示。首先中间件必须是个函数。若是generator函数&#xff0c;则需要进行转化。最后把该中间件推入middelaware数组中。…

matlab内存管理(二)

转自&#xff1a;http://hi.baidu.com/bi%CB%AB%C9%FA%BB%A8/blog/item/5ab86c38ac2f45e715cecbab.html 1&#xff0c;确保内存的连续性Matlab 中数组必须占用连续分配的内存段当无法为新建的数组分配连续的内存段的时候Out of Memory 就会出现由于反复分配和释放数组会使可用的…

校招经验分享—高考结束!校招还会远么~~

作者 | 石晓文来源 | 转载自小小挖掘机&#xff08;ID: wAIsjwj&#xff09;今天是6.11&#xff0c;高考已经结束了&#xff0c;那大考-校招还会远么&#xff1f;我们先来看一下去年的校招时间表&#xff1a;互联网大厂校招一般7月就开始了&#xff0c;也就是说&#xff01;如果…

数据科学究竟是什么?

数据科学是一门将数据变得有用的学科。它包含三个重要概念&#xff1a; 统计机器学习数据挖掘/分析数据科学的定义 如果你回顾一下数据科学这个术语的[早期历史]()&#xff0c;会发现有两个主题密切相连&#xff1a; 大数据意味着计算机的使用频率增加。统计学家很难将纸张上所…

SQL with NUll处理,Join系列,between,in对比exists以及少量题目

2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c from tableta wherea(select max(a) from tabletb where tableb.b tableta.b ) 随机抽取出10条数据 Select to…

清华大学提出APDrawingGAN,人脸照片秒变艺术肖像画

作者 | 刘永进教授来源 | 转载自数据派THU&#xff08;ID:DatapiTHU&#xff09;清华大学提出APDrawingGAN&#xff0c;该项工作被CVPR 2019录取为oral paper。CVPR是计算机视觉和人工智能领域内的国际顶级会议&#xff0c;2019共收到投稿5160篇&#xff0c;录取1300篇&#xf…