介绍

这篇文主要讲的是显著实例分割(salient instance segmentation),输入一张图不仅能获得bounding box,还可以获得高质量的分割。显著实例分割只针对图像中最“突出”、最“感兴趣”的目标,而不是所有目标。标题的single stage是指边框回归只有一次。

labelme进行实例分割标注 实例分割怎么标注_目标检测


上图就是本文模型的实现效果。

CNN最近几年在很多领域都取得了不错的效果,对于提取特征有着显著的成就,但是作者认为CNN无视了目标及其附近背景的重要特征分离能力,此外实例分割中的RoIPooling、RoIWarp、RoIAlign方法都有缺点。基于上述所说,作者提出了一种新的方法:RoIMasking。

主要工作分为两部分:

  • 设计了一个新的端到端的单阶段显著实例分割模型
  • 提出RoIMasking

这篇笔记我会把这个模型和Mask R-CNN、MaskX R-CNN对比起来看。

相关工作

显著实例分割目前来说算是比较新的一个任务,主要与三种计算机视觉任务有关:

  • 显著目标检测
  • 目标检测
  • 语义实例分割

相关工作是R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN的一系列介绍,具体见上面那个网址。

这里主要讲下作者的灵感来源。

在CNN方法流行之前,在显著实例分割中常用前背景间的分离特征,不需要学习大量数据,就能很好的实现显著实例分割。如下图:

labelme进行实例分割标注 实例分割怎么标注_Mask_02


GrabCut 方法中使用前背景颜色模型,如高斯混合模型,只需要在目标附近画一个框,就可以获得很好的分割结果。可以看出例图中其实目标和背景有些颜色还特别相近,但也分割得很好。作者就想到,如果要用CNN来分割这种背景和目标有点相近的图,需要大量的训练集,并且训练集中还有很多目标和背景色调很像的图,既耗时又难以训练出好的模型。所以作者认为或许可以把目标附近的背景结合起来,扩大感受野的同时增强前后景之间的对比。

S4Net

整体的简单框架见下图:

labelme进行实例分割标注 实例分割怎么标注_目标检测_03


整体包含两个部分:bounding box检测器和分割部分。base模型是ResNet-50+FPN,为了减少时间,作者抛弃了conv2的连接。这里提了一句跟Faster R-CNN使用FPN差不多,也就是根据RoI的尺度来决定RoIpooling层的输入来自FPN网络的哪一层特征图,这篇文章主要是讲分割方面的创新,就不过多赘述。

分割部分有一点要注意的是RoIMasking的输入包含预测的bbox和backbone里步长为8的特征图,与Mask R-CNN不一样。具体我会在后续进行对比。

RoIMasking
RoIPooling和RoIAlign的具体实现也见上面那个链接,两者都是用来提取特征图上proposal的对应位置的,后者相比前者更精确——不进行四舍五入,后续用双线性插值法。但两者提取的区域通常都要resize成固定的大小,比如7x7/28x28,会影响最终的分类/分割效果。此外两者都局限于proposals的矩形框范围内,背景信息没有利用。于是作者就提出了RoIMasking。

Binary RoIMasking:先从最简单的二元开始,Binary RoIMasking层的输入为特征图和来自检测分支预测的proposals。然后根据矩形框的位置和大小获得一个二元mask,框内为1,框外为0。要注意的是这个框的大小是原来的proposal有多大就是多大,如下图所示:

labelme进行实例分割标注 实例分割怎么标注_Mask_04


图a就是一个二元的RoIMasking示例,橙色框内的mask值为1,框外为0。把这个mask和特征图相乘,就是Binary RoIMasking的输出。如下图中的c:

labelme进行实例分割标注 实例分割怎么标注_目标检测_05


Expanded Binary RoIMasking:也就是把上面的binary RoIMasking区域简单扩宽一点,如图figure5中的b图。相比较binary RoIMasking获得了更多的背景信息,某种意义上来说感受野更大了。

Ternary RoIMasking: 翻译过来是三元的RoIMasking,其实就是把Expanded Binary RoIMasking和binary RoIMasking都用上了,如图figure5中的c图,蓝色的线框住的就是Expanded Binary RoIMasking区域,橙色线就是binary RoIMasking区域。然后mask的具体设置为,Expanded Binary RoIMasking框外的为0,Binary RoIMasking框内的设置为1,二者之间的设置为-1,如图figure4中的d图。后续的RoIMasking都指Ternary RoIMasking方法。

Analysis of RoIMasking
这部分主要是验证RoIMasking是真的有用,可以提取到更多的背景信息,方法是采用画梯度图,不过多说明了。

Segmentation Branch

本篇论文另外一个创新部分,输入的特征图来自base model中的conv3(步长为8)。为了扩大感受野,本文设计的分割部分用到了空洞卷积、跳接、最大池化,具体见下图:

labelme进行实例分割标注 实例分割怎么标注_目标检测_06


所有的卷积层尺寸都是3x3,步长为1;前三层的通道数为128,后面的都是64。

Loss function
损失函数包括三个部分,一是分类,二是bounding box回归,三是分割,如下式:
labelme进行实例分割标注 实例分割怎么标注_卷积_07
其中obj是分类,coord是bbox回归。
三种损失的计算分别如下:

labelme进行实例分割标注 实例分割怎么标注_labelme进行实例分割标注_08

  • labelme进行实例分割标注 实例分割怎么标注_目标检测_09:SmoothL1
  • labelme进行实例分割标注 实例分割怎么标注_目标检测_10:交叉熵损失

实验:

labelme进行实例分割标注 实例分割怎么标注_卷积_11


这个表说明RoIMasking比之前的两种方法都要好。

labelme进行实例分割标注 实例分割怎么标注_卷积_12


table3是试了好几个不同的base model来看性能。table4是与目前唯一的显著实例分割实验作对比,性能提高了很多。

Implementation Details:

训练的时候,分割分支的bounding box的输入是直接用的label,测试的时候输入来自branch detection分支,数量固定为20。

-1的区域是(w + 2w/3,h + 2h/3) 。

Mask R-CNN、MaskX R-CNN、S4Net三者异同

Mask R-CNN、MaskX R-CNN的具体介绍见【论文笔记】Learning to Segment Every Thing

为了方便介绍我下面把 Mask R-CNN简写为MR,MaskX R-CNN简写为MX,S4Net简写为S4。

MR是MX和S4的模型如下:

labelme进行实例分割标注 实例分割怎么标注_卷积_13


labelme进行实例分割标注 实例分割怎么标注_目标检测_14


MR和S4N中的分割部分对比如下:

labelme进行实例分割标注 实例分割怎么标注_labelme进行实例分割标注_15

  • MR和MX都是two stage,因为RPN那有一次边框回归,最后还有一次回归,而S4是single stage,因为没有RPN的边框回归;
  • MR中分类检测分支和分割分支没有关系,MX中分割的参数是通过分类检测分支的参数通过embedding获得的,S4中分割部分的输入是直接利用检测分支生成的bounding box作为proposals;
  • MR、MX用的RoIAlign,S4用的RoIMasking,前者的proposals的尺寸都要resize成固定大小,并且不会利用框外的背景信息,RoIMasking保持proposals的长宽比不变,并且利用了框外的背景信息有利于分割;
  • 三者的分割部分结构不一样;
  • MR的输入和S4的输入形式上差不多,都是label既有bounding Box又有instance分割,MX的数据集则分为两种,小部分是既有bounding Box又有instance分割,大部分是只有bounding Box的,可以说MX是半监督学习。