经典论文系列| 实例分割中的新范式-SOLO
前言:
这是实例分割中的一篇经典论文,以往的实例分割模型都比较复杂,这篇论文提出了一个简单且直接的实例分割模型,如何设计这种简单直接的模型且要达到一定的精度往往会存在一些困难,论文中有很多思路或思想值得借鉴,因此十分值得一读。
在本文中,为让各个方向的读者都能看得懂并抓住重点,较为详细地介绍了本文的创新或改进思路,而对一些细节不予赘述。
论文:SOLO: Segmenting Objects by Locations*
代码:https://git.io/AdelaiDet
Introduction
实例分割需要正确分离图像中所有对象,同时还需要在像素级别对每个实例进行语义分割。最近的实例分割方法可以分类为两组,即自上而下和自下而上的范式。
第一种方法“detect-then-segment”,首先检测边界框,然后在每个边界框中分割instance mask。第二种方法通过推开属于不同实例的像素并拉近同一实例中的像素来学习亲和关系,将embedding vector分配给每个像素,然后需要进行分组后处理以分离实例。这两种范式都是step-wise的和indirect,它们要么严重依赖于精确的边界框检测,要么依赖于每个像素的embedding 学习和分组处理。
相比之下,我们的目标是在完整instance mask标注的监督下直接分割instance mask,而不是检测框内的mask或其他像素对关系。我们重新开始思考一个问题:在一张图片中,什么是目标实例之间最本质的区别呢?
作者分析了MS COCO数据集,验证子集中总共有36个,780个对象,其中98.3%的对象对的中心距离大于30个像素。至于其余的1.7%的对象对,其中40.5%的大小比大于1.5倍。总之,在大多数情况下,图像中的两个实例要么具有不同的中心位置,要么具有不同的对象大小。这一发现使我们怀疑是否可以通过中心位置和对象大小直接区分实例?
在语义分割中,现在的主流范式利用全卷积网络(FCN)来输出具有N个通道的密集预测。每个输出通道负责一个语义类别(包括背景)。语义分割旨在区分不同的语义类别。类似地,在这项工作中,我们建议通过引入“ instance categories ”的概念来区分图像中的对象实例,即量化的中心位置和对象大小,从而可以按位置对对象进行分割,因此我们的方法名称为SOLO。
SOLO结构
前面提到作者认为图像中实例对象之间最基础的区别在于大小和位置,因此,SOLO使用FPN来生成通道数相同但大小不同的特征金字塔,来实现不同大小的实例对象在不同的level进行检测。对于金字塔每一层的feature maps都输入到两个预测头中。
注:为了简化图示,在这里没有显示特征金字塔网络(FPN),下图中的FCN没写错,后面会介绍。

如上图所示,将实例细分重新定义为两个子任务:类别预测和instance mask生成。输入图像被分成均匀的网格,即S×S。如果目标的中心落入网格单元,则该网格单元负责预测语义类别(Category Branch)和实例掩码(Mask Branch)。
注:金字塔每层的预测头的权重是共享的。
格子数量(即S)在不同层是不一样的。
Semantic Category
这个做法与YOLO相同,通过FPN把图像分成S x S 的网格,其张量形状为S x S x C。其中每个格子属于一个单独的实例,因此每个格子只属于一个语义类别。每个格子只要是在ground truth的区域内,它就是positive。在推理阶段,C维通道预测该格子属于每个目标实例的可能性,C =类别数量。
Instance Mask
可以看到上面那个图中,Semantic Category中的每个格子是跟下方Instance Mask中的mask是一一对应的。由于每个格子都会预测一个实例对象,也就是会预测S^2个mask,而mask的大小为原图大小,即H x W。因此,Instance Mask的形状为H x W x S^2。
它们的对应关系是Semantic Category中第i行第j列的格子对应Instance Mask中第k维 ( k = i·S + j )的mask。
预测Instance Mask的一种直接方法是采用全卷积网络,例如语义分割中的FCN 。然而,常规的卷积运算在某种程度上在空间上是不变的。空间不变性对于某些任务(例如图像分类)是理想的,因为它会引入鲁棒性。但是,因为我们的分割mask以网格为条件,并且必须由不同的特征通道分开,因此在这里我们需要一个空间变化的模型,或者更精确地说,是位置敏感的模型。
做法比较简单,在网络初期引入两个feature map,一个是x坐标,一个y坐标,归一化在[-1,1]之间,以concatenate的方式与原始tensor结合。
SOLO是怎样起作用的

上图显示了由S = 12个网格生成的网络输出。子图(i,j)表示相应的mask通道产生的soft mask预测结果。 在这里我们可以看到不同的实例在不同的掩码预测通道上激活。 通过在不同位置显式分割实例,SOLO将实例分割问题转换为位置感知分类任务。在每个网格处将仅激活一个实例,并且可以通过多个相邻的mask通道来预测一个实例。 在推理期间,我们使用NMS来抑制这些冗余mask。
Decoupled SOLO
当格子数量比较大时,如S取20,则会生成400个Instance Mask,在大部分情况下,图像中的目标比较稀疏且少,没必要太多的Instance Mask。

如上图所示,将原来的输出tensor HxWxS^2用两个形状为HxWxS的tensor来代替,分别为x, y。而位置(i,j)的mask通过Xj 与Yi逐元素相乘获得。
这种分解方式比原来的方式需要的内存更少,而精度几乎一样。
Conclusion

本文来源于公众号CV技术指南的论文分享系列,更多内容请扫描文末二维码关注公众号。

最近把公众号所有的技术总结打包成了一个pdf,在公众号中回复关键字“技术总结”可获取。

经典论文系列| 实例分割中的新范式-SOLO的更多相关文章
- 经典论文系列 | 缩小Anchor-based和Anchor-free检测之间差距的方法:自适应训练样本选择
前言 本文介绍一篇CVPR2020的论文,它在paperswithcode上获得了16887星,谷歌学术上有261的引用次数. 论文主要介绍了目标检测现有的研究进展.anchor-based和 ...
- 经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷
前言: 目标检测的预测框经过了滑动窗口.selective search.RPN.anchor based等一系列生成方法的发展,到18年开始,开始流行anchor free系列,CornerNe ...
- CVPR2020论文解析:实例分割算法
CVPR2020论文解析:实例分割算法 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation 论文链接:https://arxiv ...
- CVPR2021 | Transformer用于End-to-End视频实例分割
论文:End-to-End Video Instance Segmentation with Transformers 获取:在CV技术指南后台回复关键字"0005"获取该论文 ...
- SOLOv 2:实例分割(动态、更快、更强)
SOLOv 2:实例分割(动态.更快.更强) SOLOv2: Dynamic, Faster and Stronger 论文链接: https://arxiv.org/pdf/2003.10152. ...
- CVPR2019 | 超越Mask R-CNN!华科开源图像实例分割新方法MS R-CNN
安妮 乾明 发自 凹非寺 本文转载自量子位(QbitAI) 实习生又立功了! 这一次,亮出好成绩的实习生来自地平线,是一名华中科技大学的硕士生. 他作为第一作者完成的研究Mask Scoring R- ...
- 实时实例分割的Deep Snake:CVPR2020论文点评
实时实例分割的Deep Snake:CVPR2020论文点评 Deep Snake for Real-Time Instance Segmentation 论文链接:https://arxiv.org ...
- 谷歌MapReduce经典论文翻译(中英对照)
MapReduce: Simplified Data Processing on Large Clusters(MapReduce: 简化大型集群下的数据处理) 作者:Jeffrey Dean and ...
- CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等
CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等 CVPR 2020中选论文放榜后,最新开源项目合集也来了. 本届CPVR共接收6656篇论文,中选1470篇,&q ...
随机推荐
- 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)
Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...
- centos7 SNMP错误记录
如果本地测试ok,远程测试出现如下报错: No Such Object available on this agent at this OID或No more variables left in th ...
- Go语言学习之路-11-方法与接口
目录 编程方式 go语言对象方法 自定义类型和方法 接收器: 方法作用的目标(类型和方法的绑定) go面向对象总结 方法的继承 go语言接口 为什么要用接口 接口的定义 接口的作用总结 接口的嵌套 空 ...
- Linux磁盘分区格式化和扩容
Note:根据各系统上磁盘的类型不同,磁盘命名规则也会不同:例如/dev/xvd,/dev/sd,/dev/vd,/dev/hd 目录 磁盘格式化 MBR格式 GPT分区 磁盘扩容 MBR格式扩容 G ...
- Spring Boot 老启动失败,这次再也不怕了!
Spring Boot 项目是不是经常失败,显示一大堆的错误信息,如端口重复绑定时会打印以下异常: *************************** APPLICATION FAILED TO ...
- 31Si2CrMoB
转: 31Si2CrMoB 31Si2CrMoB是推土机用钢的一种耐磨钢:此钢有很高的强度和韧度,适合于推土机XX.31Si2CrMoB冶炼技术工艺:电弧炉冶炼,初轧开坯.钢板轧制:可√189-170 ...
- BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...
- Nodejs学习笔记(4) 文件操作 fs 及 express 上传
目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...
- 时间&空间(complexity)
时间&空间复杂度 时间复杂度: 通俗来说就是随着数据量的增加,程序运行的时间花费量是怎么变化的,时间复杂度常用大o表示.举个例子,猜数字,猜10个,100个.1000个,猜数的数据量是在增加的 ...
- python之模块与类库
什么是模块 模块是一组类,函数,方法所组成的.这些类都储存在文本文件中..py是python程序代码中的扩展名,模块可能是c或者python写的.模块的扩展名可以是.py或者是.pyc(经过编译的.p ...