SOLO:Segmenting Objects by Locations
SOLO是实例分割全新赛道的论文,以前的方式是先检测出实例框,然后在实例框内分割目标,而SOLO基于最后一层featrue map(SxS)位置确定实例,然后通过mask分支生成S^2个mask,表示最后一层featrue map(SxS)所有grid对应的分割结果,汇总所有grid的结果,就是实例分割结果
什么是 SOLO?
- SOLO 的核心思想是通过位置和大小来分离对象实例
- 位置:一幅图像可以划分为一个 S×S 单元的网格,从而得到 S×S 中心位置类。根据对象中心的坐标,将对象实例指定给其中一个网格单元,作为其中心位置类别。因为本质上实例类别近似于实例的对象中心的位置,并且通过分类,可以更直接、更容易地使用固定数量的通道对不同数量的实例进行建模
- 大小:为了区分不同对象大小的实例,我们采用特征金字塔网络(FPN),将不同大小的对象分配给不同级别的特征映射,作为对象大小类
SOLO 的网络结构?
- SOLO 核心思想是将实例分割问题转化为两个同时存在的类别感知预测和实例感知掩码生成问题。具体来说,我们的系统将输入图像分成一个统一的网格,即 S×S,如果一个对象的中心落在一个网格单元中,该网格单元负责1)预测语义类别,2)分割该对象实例
- 语义分类:对于每个网格,SOLO预测C维输出以指示语义类概率,其中C是类的数量。这些概率取决于网格单元。如果我们将输入图像分成S×S网格,输出空间将是S×S×C。该设计基于这样一个假设:S×S网格的每个单元必须属于一个单独的实例
- 实例掩码:在语义类别预测的同时,每个 positive grid cell 也会生成相应的 instance mask。对于输入图像 I ,如果将其划分为 S×S 网格,则总共最多有 S×S 个预测 mask,语义类别和类不可知mask之间建立了一对一的对应关系
SOLO 的 Mask 预测分支?
- 使用 CoordConv:传统的卷积运算在一定程度上是空间不变的,因为空间不变性可以引入鲁棒性。然而,在本任务中,需要一个空间可变性(位置敏感)模型,因为分割 mask 是以 grid cell 为条件的,并且必须通过不同的特征通道来分离,解决办法是使用 CoordConv,在网络开始时,直接向网络提供标准化像素坐标,具体地,创建一个与输入的空间大小相同的张量,它包含每个像素点的坐标,这些坐标被规范化为[-1,1],然后将这个张量连接到输入特征并传递到下面的层,如果原始输入是 HWD,则新张量是 HW (D+2)
- 类别预测和对应的 mask 生成:通过它们的参考网格单元自然地关联起来,在此基础上,我们可以直接为每个网格生成最终的实例分割结果。原始实例分割结果是通过收集所有网格结果生成的。最后,利用非最大值抑制(NMS)得到最终的实例分割结果。不需要其他后处理操作
- 注意:H、W 相对于原图来说是下采样 2 倍的,后面通过上采样 2 倍还原
SOLO 的 Decoupled Mask 预测分支?
- SOLO 为 SxS 的每个位置预测一个 HxW 大小的 Mask,其数量过于庞大,实际上,在 SxS 个 Mask 中仅有少数被响应,因为图片不会出现太多实例
- 为了解决这个问题,提出了解藕的 Mask 预测分支,它有两个 HxWxS 的 featrue map 组成,分别表示 X、Y 两个方向的向量,如果第 i 个 grid 有实例,直接拿出 X 、Y 的 相乘,即是其 Mask 预测结果
- 解藕后的 Mask 分支,特征数量由 变为 ,数量大大减少
SOLO 的标签分配?
- 对于类别预测分支,网络需要给出每个 S×S 网格的对象类别概率,如何分配实例到哪些 grid 进行学习,是标签分配要做的事
- 根据实例尺寸决定放置的 head:这类似目标检测的多 head 单 anchor 标签分配机制,直接使用座标分配即可,在此基础上根据实例的不同尺寸将正样本放到不同的 head 上
- 确定 grid 的正样本:根据 gt mask 区域中心映射到 SxS 网格后,选择与 gt mask 重叠大于阈值的 grid 作为正样本,一般 1 个实例分配多个正样本,下图是预测结果,可知相邻的 grid 预测了同一实例
SOLO 的损失?
- 损失函数包含 2 部分,一部分是类别预测、一部分是实例 mask 预测
- 类别预测使用 Focal loss
- 实例 mask 预测使用 Dice loss ,即计算每个正样本对应 mask 的 Dice loss,然后取平均值
SOLO 如何推理?
- 图片输入 backbone 和 FPN 后,得到多 head 的预测结果
- 首先使用类别打分阈值过滤低置信度的预测,然后选择 top 500 的类别打分对应的实例,以 0.5 阈值二值化这些实例的分割效果,然后进行 Mask NMS 操作
参考: