文章目录

论文:https://arxiv.org/abs/1912.04488
代码:https://github.com/WXinlong/SOLO
git
1、背景
实例分割具备很大的挑战性,由于它须要正确分离图像中的全部对象,同时还须要在像素级对每一个实例进行语义分割。图像中的对象属于一组固定的语义类别,可是实例的个数是未知的,因此,语义分割能够被看作是一个密集的分类问题(对每一个像素进行分类),直接利用分类的方法来预测每一个像素的类别是一个很大的挑战。github
现有的方法是怎么作的:markdown
- top-down:也就是“先检测,后分割”,先检测 bbox,后在每一个bbox中进行mask的分割
- bottom-up:学习关系亲和场,给每一个 pixel 分配一个嵌入式向量,将属于不一样实例的 pixel 推远,把属于同一个实例的 pixel 拉近。以后,须要一个后处理来分开每一个实例。
上述方法的特色: 分步实现 + indirect,前者很大程度上基于检测结果的准确性,后者很大程度上依赖于嵌入式向量的学习和 grouping prcessing.网络
2、本文方法
本文旨在于直接分割实例 mask。框架
做者提出的问题: 图像中实例的本质区别是什么?ide
解答:函数
以 MS COCO为例,验证集中有 36780 个目标布局
- 98.3% 的目标对儿的中心距离大于 30 pixels
- 1.7% 的目标对儿中,其中 40.5% 的大小之比大于 1.5x
总结:在大多数状况下,图像中的两个实例,要么中心位置不一样,要么大小不一样。性能
反思:是否能够经过中心位置和对象大小直接区分实例?学习
SOLO:Seperate Object instances by Location and sizes
在语义分割中,如今主流的方法是使用FCN来输出N个通道的密集预测,每一个输出通道负责其中一个语义类别(包括背景),语义分割的目的是区分不一样的语义范畴,在本文中,引入“实例类别”的概念来区分图像中的对象实例,即量化的中心位置和对象大小,这使得能够利用位置来分割对象,故名为“SOLO”。
Locations: 图像被分为 S × S S \times S S×S 的格子,获得 S 2 S^2 S2 个中心位置类别
根据目标中心,每一个目标实例被分配到其中一个格子内,做为其中心位置的类别。本文将中心位置的类别编码成 channel axis,相似于语义分割中的语义类别。
每一个输出通道都是对每一个中心位置类别的响应,对应的 channel 的特征图能够预测属于该类别的实例的mask。因此,结构化的几何信息天然地保存在空间矩阵中。
实际上,实例类别近似于实例的对象中心位置,所以,经过将每一个 pixel 分类到其实例类别中,就至关于使用回归方法从每一个像素来预测对象中心。
将位置预测任务转化为分类而不是回归任务的缘由在于: 使用分类时,更加直接,且更易于使用固定数量的通道对多个实例进行建模,同时不依赖于分组或学习嵌入式向量之类的后处理。
Sizes:使用 FPN 来区分不一样大小的目标实例,以便将不一样大小的对象分配给不一样 level 的特征图,做为对象大小类别。
全部的实例都被规则的分配,使得可以经过 “instance categories” 来区分类别。
注意:FPN是本文的核心之一,由于它对分割性能有着很大的影响,尤为是对不一样大小的物体。
SOLO效果:
- 端到端训练,且无后处理
- 只须要mask的标注信息,无需 bbox 标注信息,
- 在 COCO 上实现了和 Mask R-CNN 基本持平的效果
- SOLO 只须要解决两个像素级的分类问题,相似于语义分割,
- 本质上,SOLO 经过离散量化,将坐标回归转化为分类问题,能够避免启发式的坐标规范化和 log 变换,一般用于像 YOLO 这样的检测器中。
3、本文方法的具体作法
3.1 问题定义
给定一个任意的图像,实例分割系统须要肯定是否有须要分割的实例, 若是有,则返回分割的 mask。
SOLO 的核心想法:将实例分割问题转化为两个问题:类别预测+实例 mask 生成
- 将输入图像分红格子 : S × S S\times S S×S
- 若是目标的中心落到格子里边,则这个格子要 输出实例类别(semantic category)+ 分割实例(segmenting instance)
3.1.1 Semantic category
对于每一个 grid, SOLO 会预测 C 维的输出,分别表明每一个类别的置信得分,C 为类别个数。把图像划分为 S × S S\times S S×S 个格子,输出就是 S × S × C S \times S \times C S×S×C,如图2_top所示。
该设计方法是基于一个假设:每一个格子都只属于一个单独的实例。
推理阶段:C 维输出表示每一个实例属于不一样类别的几率
3.1.2 Instance Mask
和类别预测并列的分支是实例mask预测分支,该分支对每一个 positive grid cell 产生一个对应的 instance mask。
对于输入图像 I I I,将其分为 S × S S\times S S×S 的格子,则最多会预测 S 2 S^2 S2 个格子,将这些 mask 编码成一个 3D 输出的tensor,输出有3维,也就是3个通道。则, instance mask 分支的输出维度为: H I × W I × S 2 H_I \times W_I \times S^2 HI×WI×S2。 k t h − c h a n n e l k_{th}-channel kth−channel 是对 ( i , j ) (i,j) (i,j) 位置的分割响应,其中 k = i × S + j k= i\times S + j k=i×S+j。最后,在 semantic category 和 class-agnostic mask 之间创建了一对一的对应关系(图2所示)。
现有的方法如何预测实例掩码: 采用 FCN
不足:传统的卷积在运算上具备空间不变性,图像分类须要空间不变性,但语义分割模型须要对空间变化敏感的模型,由于这个模型是以 grid cell 为条件的,因此必须由不一样的特征通道来分开。
本文方法如何实现预测 mask: 网络开头的地方,直接给网络输入归一化后的 pixel 坐标(参考 CoordConv operator[14])。也就是创建一个和原始的输入尺寸相同的 tensor,这个 tensor 里边的 pixel 的坐标被归一化到 [-1,1]。以后,将该 tensor concat 到输入特征,并传递到以后的层。为了使得卷积可以访问其本身的输入坐标,本文将空域 functionality 加到 FCN 模型中。
假设原始特征 tensor 尺寸为 H × W × D H \times W \times D H×W×D,新的 tensor 尺寸为 H × W × ( D + 2 ) H \times W \times (D+2) H×W×(D+2),其中,最后的两个 channels 是 x − y x-y x−y pixel 坐标。
Forming Instance Segmentation: SOLO中,类别的预测和对应的 mask 能够很天然的使用其 grid cell 来联系起来, k = i ⋅ S + j k=i \cdot S + j k=i⋅S+j。基于此,能够直接对每一个 grid 来创建最终的实例分割结果。
原始的实例分割结果是经过将全部 grid 的结果结合起来获得的,以后,使用 NMS 来得到最终的实例分割结果,没有其余后处理。
3.2 Network Architecture
SOLO 使用 FPN 做为 backbone,FPN 在每一个 level 产生固定通道但不一样大小的特征图(通道一般为256-d),这些特征图做为预测 head 的输入:semantic category head + instance mask head。同一个head的不一样 level的参数是共享的。不一样 level 的grid number 是不一样的。另外,只有最后的 1x1 conv 的参数是没有共享的。
为了代表 SOLO 的通用性和高效性,做者使用了不一样的 backbone 和 head 进行实验:
- backbone
- head
- loss 函数
3.3 SOLO learning
3.3.1 Label Assignment
类别预测分支: 网络须要给每一个小格子预测目标类别几率。以 ( i , j ) (i,j) (i,j) 位置为例,若是该网格内落入了任何 gt mask 的中心区域,则被分为正例,不然被分为负例。中心点采样在如今的目标检测方法中是很是高效的,因此做者在mask 类别分类任务上使用了相似的方法。
给定 gt mask 的中心 ( c x , c y ) (c_x, c_y) (cx,cy),宽 w w w,高 h h h。中心区域的尺度控制因子是 ϵ : ( c x , c y , ϵ w , ϵ h ) \epsilon:(c_x, c_y, \epsilon w, \epsilon h) ϵ:(cx,cy,ϵw,ϵh)。
本文做者设定 ϵ = 0.2 \epsilon=0.2 ϵ=0.2,则每一个 gt mask 平均有 3 个 正样本(positive samples)。
对每一个 positive sample,都会设定一个二值分割 mask,此处共有 S 2 S^2 S2 个 grid,全部每一个图像都会输出 S 2 S^2 S2 个 mask,对每一个 positive sample,其对应的 binary mask 都会被标记。
注意: mask 的维度会影响 mask 预测分支,然而,做者展现了最简单的 row-major order 在本文方法都会有很好的效果。
3.3.2 Loss Function
训练的 loss function, λ = 3 \lambda=3 λ=3:
其中, L c a t e L_{cate} Lcate 是用于分类的 Focal loss, L m a s k L_{mask} Lmask 是用于 mask 预测的 loss:
若是 grid 的索引(类别 label)是从左到右、从上到下排列的,则 i = ⌊ k / S ⌋ i=\lfloor k/S \rfloor i=⌊k/S⌋, j = k % S j=k \% S j=k%S, N p o s N_{pos} Npos 是 positive samples 的个数, p ∗ p^* p∗ 和 m ∗ m^* m∗ 分别是类别和mask。 1 1 1 是指示函数,若是 p i , j ∗ > 0 p_{i,j}^*>0 pi,j∗>0,则为1,不然为0。
d m a s k : d_{mask}: dmask: 本文中,做者对比了三种不一样的 loss函数
- Binary Cross Entropy(BCE)
- Focal loss
- Dice loss
最终, Dice loss 以其高效性和稳定性赢得了做者的青睐
3.4 Inference
- 首先通过 FPN,获得 ( i , j ) (i,j) (i,j) 位置上的类别得分 p i , j p_{i,j} pi,j,和对应的 mask m k m_k mk,其中 k = i ⋅ S + j k=i \cdot S +j k=i⋅S+j。
- 使用阈值 0.1 来过滤掉低的类别得分
- 选择前 500 个得分对应的mask,并进行 NMS。
- 为了将预测的 soft mask 转化成 二值 mask,做者使用 0.5 的阈值将 soft mask 进行二值化。保留前100 个实例来进行评估。
4、实验
8GPU,SGD,batch_size:16,共 36 个epoch,初始 lr=0.01,分别在 27 和 33 个epoch处降低10倍。图像大小:短边随机采样到 640 ~ 800 pixel。
4.1 主要结果
在 MS COCO test-dev上对比:如表1所示
- SOLO 和 ResNet-101 结合,获得 mask AP 37.8%
- SOLO 和 DCN-101 结合,获得 mask AP 40.4%
SOLO 输出如图8所示,在不少不一样的场景均可以得到较好的效果。
4.2 How SOLO works?
S = 12 S=12 S=12 时的网络输出如图4所示,子图 ( i , j ) (i,j) (i,j) 表示由其对应的 mask 分支(通过 sigmoid)预测获得的 soft mask。
不一样的实例是由不一样的 mask 预测分支来响应的,经过在不一样位置来分割实例,SOLO 将实例分割问题转化成了 position-aware 的分类问题。
每一个 grid 仅仅会对一个实例响应,且一个实例可能会被相邻的 channel 都预测,在 inference 阶段,使用 NMS 来抑制多余的 mask。
4.3 Ablation Experiments
Grid number: 本文对比了不一样的 grid number 带来的影响,如表2所示。
特征的生成是经过 merge ResNet(stride=8) 的 C3, C4, C5 的输出获得的。
S=12 时, SOLO 能够在 MS COCO 上获得 27.2 的 AP,当 S=24 时,提升到了 29.0 AP。
上述结果代表,单尺度的 SOLO 能够应用到目标尺寸差别不太多的场景中。
然而,单尺度的模型远远低于金字塔模型。
Multi-level Prediction: 做者使用 5 级 FPN 金字塔,来分割不一样尺度的目标,如表3所示。gt mask 的尺寸被显式的用于分配它们去特定的金字塔 level。
基于上述多尺度方法,做者获得了 35.8 AP,大大的提高了效果。
CoordConv: 另一个重要的组件是 spatially variant convolution(CoordConv)。如表4所示,标准的 conv 已经在必定程度上具备了空间可变性。当使得卷积可以访问本身的坐标时,能够提高3.6个AP。两个或更多的 CoordConv 会带来更多的提高,这说明,CoordConv 可以给预测输出带来空域变化或位置敏感性。
Loss function: 表5展现了不一样的 loss function 给 mask 分支带来的影响,包括 BCE、FL、DL。
- BCE:对 positive samples,设置mask分支的 weight=10,pixel weight=2
- FL:mask 分支 weight=2
FL 损失更优,因为实例 mask 的大部分像素都在背景中, Focal loss 本来就是为了下降分类良好的样本的损失来缓解样本不平衡问题的。
- Dice Loss:在无需人工设定 loss 的权重超参数的状况下,获得了最好的效果。该 loss 函数将 pixels 视为一个 object,能够自动的在背景和前景像素间创建正确的平衡。
Alignment in category branch: 类别预测分支,必须将 H × W H\times W H×W 和 S × S S\times S S×S 的卷积特征进行匹配。做者对比了三个方法:
- interpolationg:直接双线性插值到须要的尺寸
- adaptive-pool:2 维 max-pool,从 H × W H\times W H×W 到 S × S S\times S S×S
- region-grid-interpolation:对每一个网格,使用基于密集采样点的双线性插值,并将结果与均值进行聚合。
从结果来看,这些不一样的方法并无带来很大的性能差别,也就是说对齐的过程较为灵活。
Different head depth: SOLO 中,实例分割是一个 pixel-to-pixel 的任务,做者使用 FCN 来探索 mask 的空间布局。如图5所示,做者对比了不一样的 head 深度带来的影响。将 head 的深度从 4 提高到 7,得到了 1.2 的 AP 提高。当深度超过 7 时,性能趋于稳定。故本文中使用深度为 7。
为何 SOLO 中 head 更深?
以前的工做,如 Mask R-CNN,一般在 head 使用 4 层卷积来进行 mask 的预测,在 SOLO 中,mask 是基于空间位置来调节的,因此做者将坐标附加到 head 开始的地方,mask head 必须由足够的特征表达能力来学习这种平移。对于类别分类分支,计算的开销能够胡烈,由于 S 2 < < H × W S^2 << H \times W S2<<H×W。
4.4 SOLO-512
做者还训练了小的版本,来突破实时语义分割的界限。做者使用的模型的输出具备较小的分辨率,较短的边为 512 而非 800。其余设置和 SOLO 相同。
SOLO 对于密集的、任意的实例预测任务来讲,是一种通用的技术。
5、Decoupled SOLO
假设设定 S = 20 S=20 S=20, SOLO 的输出是 S 2 = 400 S^2=400 S2=400 个通道的 map,然而,这些预测在通常状况下是冗余的,由于目标是稀疏的。因此做者又在本节引入了 Decoupled SOLO,如图7所示。
Decoupled SOLO:
- 原始输出 tensor : M ∈ R H × W × S 2 M \in R^{H \times W \times S^2} M∈RH×W×S2
- 通过解耦以后的输出:分别对应于两个坐标的 tensor, X ∈ R H × W × S X \in R^{H \times W \times S} X∈RH×W×S 和 X ∈ Y H × W × S X \in Y^{H \times W \times S} X∈YH×W×S。
因此,输出空间从 H × W × S 2 H \times W \times S^2 H×W×S2 降到了 H × W × 2 S H \times W \times 2S H×W×2S 。
对于落到网格 ( i , j ) (i,j) (i,j) 中的目标:
- 原始SOLO 在输出 tensor M 的第 k 个通道分割其 mask, k = i ⋅ S + j k=i \cdot S + j k=i⋅S+j
- Decoupled SOLO,该对象的预测 mask 被定义为两个 channel map 的元素级别的相乘:
7、Conclusion
SOLO 是一个端到端的实例分割框架,与 mask r-cnn 相比,达到了竞争性的准确性。