论文阅读:实例分割新宠-SOLO系列

SOLOv1

论文链接:https://arxiv.org/abs/1912.04488
项目地址:https://github.com/WXinlong/SOLO

SOLO贡献

  • 端到端训练,且无后处理
  • 只需要mask的标注信息,无需 bbox 标注信息
  • 在 MASKCOCO 上实现了和 Mask R-CNN 基本持平的效果
  • SOLO 只需要解决两个像素级的分类问题,类似于语义分割
  • 本质上,SOLO 通过离散量化,将坐标回归转化为分类问题,可以避免启发式的坐标规范化和 log 变换,通常用于像 YOLO 这样的检测器中。

背景回顾

目前实例分割的两大类策略:

  • 基于检测的实例分割:其实就是MaskRCNN系列,检测实例对象的边界框,然后在框内做语义分割,前后景区分。也就得到了实例分割结果。
  • 基于像素编码的实例分割:就是对输入图像进行像素的编码,然后再通过聚类手段得到分割结果。

他们要么依赖于检测结果,要么需要后处理。繁琐,速度慢。

SOLO的思想

作者最初的思想是:我们知道语义分割将分割任务当成了分类任务,即对每个像素分类。那么实例分割可不可以也这么做呢?语义分割每个像素点都需要对应一个类别,我们可以利用通道数来表示像素每个类别的概率。但实例分割却不是每个像素都需要分配类别,那我们应该怎么、用什么来表示这个用分类的方式实现实例分割的想法呢?这也就是论文提出的“实例类别“的概念。

那么核心问题就是:

1、什么是物体的实例类别?

2、有了实例类别后,怎么来划分不同实例?

对于第一个问题作者是如何思考的:
物体的语义类别是由人为的定义来区分的,是由人来标注的。那图片里物体的什么属性可以用来区分实例呢?—— 位置和形状。我们可以自然而然的发现,不同实例对象的坐标位置天生就不同(不然他们就重叠了啊,人也难以区分出来啊),并且他们的形状也往往是不同的!作者首先对MSCOCO数据集的验证数据集进行了分析,发现36780个对象中98.3%的实例对象之间的中心点距离都超过了30个像素。而在剩下的1.7%中,40.5%两个实例对象大小比例超过了1.5倍的比例。基于此,我们完全可以推论:利用目标的Center locations和目标的Sizes是否就能较好表示不同的实例对象? 这也就是作者提出的实例类别的概念:(量化的)实例的中心点位置和形状。(文中直接用尺寸表示形状)

对第二个问题:
实例分割和语义分割在算法处理上最大的不同就是,实例分割需要处理同类别的实例重叠或粘连的问题。那么如果将不同的实例分配到不同的输出channel上,不就可以解决这个问题了吗?本文作者正是这种思路,不过这样也面临两个问题: 一是通道分配顺序的问题,语义分割是根据类别进行通道分配的。而对于实例分割,相同类别的不同实例需要分配到不同通道上,需要解决按照什么样的规则分配。二是尺度问题,不同尺度的物体利用相同大小的输出来预测会导致正负样本不平衡,以及小目标分割边缘不够精细的问题。所以作者利用位置来分配实例应该落入哪一个通道,利用FPN来解决尺度问题。

SOLO的具体框架

问题建模

由以上的思想,问题的核心在于实例类别表示以及利用实例类别做像素分类的问题。
SOLO 的核心:将实例分割问题转化为两个问题:类别预测+实例 mask 生成。

  • 将输入图像分成S的平方个格子 :S × S
  • 如果目标的中心落到格子里边,则这个格子要输出实例的语义类别(semantic category)+ 分割实例mask(segmenting instance mask)
    问题:怎么判断目标的中心,落到格子里?

每个格子的semantic category:输出C维的语义类别概率,即上面提到的语义分割的那种方式,一个像素点对于N个通道的语义类别概率,不过这里是每个格子对应C个通道的语义类别概率。那么一张输入图片,共S × S个格子,输出S × S× C。这里有一个重要假设:每个格子都只属于一个单独的实例。每个格子仅仅属于(可以分配)一个语义类别。

问题:这就是存在问题的地方,不好解决两个物体有重叠的情况或者一个格子里多个实例。但是这也是论文提到的统计数据中的少数情形。

实例mask

对于一张图片划分为S × S个格子,那么输出shape为
H × W × S 2 H × W × S^{2} H×W×S2
每个通道表示对应的Positive的一个格子的分割结果。这里所谓的Positive指的是,只要这个格子在任何一个Groud Truth的中心区域里,就将这个格子认为是Positive的。

在这里插入图片描述
最后将semantic category和instance mask 一对一关联。

综上:
SOLO将图像划分为SxS个网格,认为每个网格都是一个潜在的目标实例。

具体实现上,图像经过全卷积网络(FCN)后进入两个分支的预测。一个类别分支,预测每个网格所处的物体类别,每个网格对应一个C维类别向量(C为类别数),总的类别矩阵大小为S x S x C;一个mask分支预测每个网格所属的物体mask,总的mask矩阵大小为H x W x (S x S)。

请注意:mask是不关乎类别的,无论是什么物体,只要该物体落入了这个网格,mask 分支都预测它的mask。如下图所示:在中间两个长颈鹿存在的网格中,分割的mask是两者都有的。

在这里插入图片描述

mask分支预测得到的每个网格的mask的大小是和原图大小相等,每个网格只对应落入此网格的物体的mask。

这样来自相同位置(网格)的物体类别和相应mask就出来了,每个网格完成了单个目标实例的分割。

由于一个物体可能落在不同的相邻网格里,所以以上过程得到的肯定是多个网格含有相同的物体的mask。故最后必须进行NMS(非极大抑制),以消除重复的分割结果。

回顾

后面具体的就不写了。感兴趣的自己看论文吧。这里想自己再思考一下作者解决这个问题的过程。
从Introduction里面看,作者的思路是:

bbox其实是区分不同实例对象的一个定位条件。那么如果不用bbox或者其他关联信息,我们怎么区分不同的实例对象?
–>不同的实例对象有不同的中心位置和大小。

好,有了区分不同实例对象的条件,那我们怎么做对每个对象做分割?

我们知道语义分割将分割任务当成了分类任务,即对每个像素分类。那么实例分割可不可以也这么做呢?语义分割每个像素点都需要对应一个类别,我们可以利用通道数来表示像素每个类别的概率。自然而然,我们可以想到如果每个实例类别可以分配到不同的通道上,用不同通道表示每个类别的概率,那不也可以分类了吗!

那我们怎么定义实例类别?
刚刚已经知道了,不同的实例对象有不同的中心位置和大小。
位置的话,把特征图划分成小块,每个小块认为只包含一个目标,这样就可以通过位置区分很多实例了,另外就是如果两个目标很不幸落在同一个块内,那么大概率他们的尺寸不同,那么通过FPN就把这两个目标分到不同分辨率的特征图上面去了,这样就完成了实例分割最重要的实例目标区分,至于实例目标的mask和类别,可以很方便的通过语义分割来解决:要不直接多分类,要不二分类+类别预测。

总结:其实感觉solo v1最大的问题还是在于多个尺寸类似的实例对象出现在同一网格。能不能引入实例权重的概念优化这个问题?类似于注意力机制。

**疑问:**其实还是不太理解为什么,一个网格对应的mask channel上分割结果就只有那一个实例。这不是看到部分,得到全部吗?不太理解。。。有明白的评论告诉我一下!

SOLOv2

论文链接:SOLOv2: Dynamic, Faster and Stronger
项目地址:https://github.com/WXinlong/SOLO

对SOLOv1 的两点改进:

  • 对于mask生成,加入动态卷积,根据不同实例确定卷积核的大小。
  • 提出Matrix NMS,大大提升速度。

改进1-动态卷积的引入

在这里插入图片描述
为什么要引入动态卷积?
答:对于原来的实例mask表示和学习,消耗大量内存和计算资源。因为对FPN网络的不同level的特征图,都要去做网格划分和采用不用的卷积,造成低效。但是其实很多地方根本就没有实例对象,根本不需要大的卷积核去做操作。

Matrix NMS

具体的就不写了。。反正只是一个快速NMS的工具。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值