SOLOv2: Dynamic and Fast Instance Segmentation
论文链接: https://arxiv.org/abs/2003.10152
一、 Problem Statement
SOLO v1 有三个bottlenecks限制了其性能:
- inefficient mask representation and learning。
- not high enough resolution for finer mask prediction。
- slow mask NMS。
详细的SOLO v1 笔记可以查看这篇博客:https://blog.csdn.net/wuchaohuo724/article/details/119188353。
二、 Direction
- 把mask learning 分成了两个部分:convolution kernel learning 和 feature learning。
- 构建一个unified 和 high-resolution的mask feature representation。
- 提出了matrix NMS。
最后达到的性能如图所示:
三、 Method
先来回顾以下SOLO v1,它有两个分支,一个是概率分支,一个是mask generation分支。我们来看一下mask generation 分支。一张图片会被分割成 S × S S \times S S×S个网格,每个网格代表一个实例。所以图像经过卷积等操作之后,最后会生成一个 S 2 S^2 S2通道数的feature map。作者认为,并不是所有网格中,都是存在目标实例的,而这个 S 2 S^2 S2计算量太大且冗余,因此在这方面进行了优化。提出的想法是:是否我们可以分别学习特征图 F F F和convolution kernel G G G,且最后的mask可以通过这两个来生成。
1. Dynamic Instance Segmentation
(1) convolution kernel learning
通过backbone和FPN之后,在每个FPN level上预测mask kernel G G G。 首先会把输入的特征图 F I ∈ R H I × W I × C F_I \in \R^{H_I\times W_I \times C} FI∈RHI×WI×C 变成 F I ∈ R S × S × C F_I \in \R^{S\times S \times C} FI∈RS×S×C,然后通过4个卷积操作和一个 3 × 3 × D 3 \times 3 \times D 3×3×D的卷积,生成kernel G G G。需要添加spatial functionality 到 F I F_I FI中。Weights for the head are shared across different feature map levels。
对于每个grid,kernel branch的输出维度是D-dimensional,来表明预测的convolution kernel weights,D是卷积参数的数量。所以,为了生成1x1卷积(输入维度为E)的权重, D = E D=E D=E;如果为了生成3x3卷积, D = 9 E D=9E D=9E。
(2) mask feature learning
有两个方式构建mask feature,一个是对每个FPN level预测mask features;一个是对所有FPN level预测一个统一的mask feature。通过对比,作者使用了后者。
使用feature pyramid fusion。通过多个 3x3 conv,group norm,ReLU和2x bilinear upsampling操作,FPN的P2到P5特征融合成一个1/4大小的输出。
在FPN Level最深处(在1/32大小那里),添加spatial functionality(在卷积操作和bilinear upsamplings操作之前),也就是使用coordconv 操作。
最后,通过element-wise summation,1x1卷积,group norm和ReLU生成最后的特征图 F F F。
2. Matrix NMS
受到了soft-NMS的启发,作者提出了matrix-NMS。具体的soft-NMS分析,可以查看这篇博客。
作者认为,对于一个 mask m j m_j mj,它的衰减因子会被两个因素影响:
- 每一个预测在mask m j m_j mj 上的 mask m i m_i mi ( s i > s j ) (s_i \gt s_j) (si>sj)的惩罚(penalty), s i s_i si和 s j s_j sj是confidence scores。
- mask m i m_i mi被抑制的概率。
对于第一个来说,通过计算
f
(
i
o
u
i
,
j
)
f(iou_{i,j})
f(ioui,j)来获得penalty。对于第二个来说,
m
i
m_i
mi被抑制的概率不是那么容易算得。但是,这个概率通常与IoUs是正相关的。因此,作者直接把这个概率近似成在
m
i
m_i
mi上的重叠预测:
f
(
i
o
u
⋅
,
i
)
=
min
∀
s
k
>
s
i
f
(
i
o
u
k
,
i
)
f(iou_{\cdot,i}) = \min_{\forall s_k \gt s_i} f(iou_{k,i})
f(iou⋅,i)=∀sk>siminf(iouk,i)
所以最后的衰减因子就变成了:
d
e
c
a
y
j
=
min
∀
s
i
>
s
j
f
(
i
o
u
i
,
j
)
f
(
i
o
u
⋅
,
i
)
decay_j = \min_{\forall s_i \gt s_j} \frac{f(iou_{i,j})}{f(iou_{\cdot,i})}
decayj=∀si>sjminf(iou⋅,i)f(ioui,j)
所以updated score就通过 s j = s j ⋅ d e c a y j s_j = s_j \cdot decay_j sj=sj⋅decayj计算。 f ( i o u i , j ) = 1 − i o u i , j f(iou_{i,j}) = 1- iou_{i,j} f(ioui,j)=1−ioui,j 或者 G a u s s i a n f ( i o u i , j ) = e x p ( − i o u i , j 2 σ ) Gaussian f(iou_{i,j}) = exp(-\frac{iou^2_{i,j}}{\sigma}) Gaussianf(ioui,j)=exp(−σioui,j2)
下面是matrix-NMS的伪代码:
3. Loss function
整体的Loss function:
L
=
L
c
a
t
e
+
λ
L
m
a
s
k
L= L_{cate} + \lambda L_{mask}
L=Lcate+λLmask
其中 L c a t e L_{cate} Lcate是Focal Loss, L m a s k L_{mask} Lmask是Dice Loss。
四、 Conclusion
提升了SOLO v1的性能,提出了matrix-NMS。学习kernel权重的想法与Dynamic Filter Networks 想法相似。