Spatial Embeddings
代码地址:SpatialEmbeddings
论文地址:Instance Segmentation by Jointly Optimizing Spatial Embeddings and Clustering Bandwidth
摘要(Abstract)
本文实现了在高准确度下的实时实例分割
批判:
- Proposal-based的方法具有高准确度但速度慢,在固定和低分辨率(Mask R-CNN的14×14)下生成mask。
- Proposal-free的方法速度快但精度低.
创新点:
- 提出了一种新的聚类损失函数,用于无 proposal 实例分割。该损失函数拉进属于同一实例的空间嵌入像素。
- 共同学习实例特定的聚类带宽,最大化生成实例 mask 的 IoU。
逻辑链路
首先给大家介绍几张自己画的丑图:
x i x_i xi | C k C_k Ck | o ^ i \hat{o}_i o^i |
---|
x
i
x_i
xi表示的是每个像素的对应坐标位置,那么要如何区分实例呢?其实很简单就是对应相同时里,获取同样的值,这个值很显然可以是实例中心坐标
C
k
C_k
Ck,那么其实就是对于每个实例的像素点学习一个距离中心的偏移量,也就得到了
o
^
i
\hat{o}_i
o^i。
先前的方法通过回归方法直接学习
o
i
o_i
oi,
L
r
e
g
r
=
∑
i
n
∥
o
i
−
o
^
i
∥
\mathcal{L}_{regr} = \sum_{i}^{n} \parallel o_i -\hat{o}_i\parallel
Lregr=∑in∥oi−o^i∥。然而这在inference的时候会有两个问题。一个是必须先确定实例中心点,二是对于每个像素需要知道属于哪个实例。之前的方法一般是通过基于密度的聚类方法获得实例的中心点,然后按照距离中心最小原则来分配像素。由于此后处理步骤没有集成在损失函数中,因此无法对网络进行端到端的优化,从而导致效果不佳。
对于以上问题,其实
C
k
C_k
Ck已经得到了解决方案,就是每个实例用相同的中心点位置信息来表示.那么预测的目标
o
i
o_i
oi就通过嵌入位置信息
x
i
x_i
xi得到了空间嵌入
e
i
=
x
i
+
o
i
e_i = x_i + o_i
ei=xi+oi.作者采用铰链loss迫使同实例像素去贴近中心点的值的某个固定邻域
δ
\delta
δ内,为什么要这样设置呢?因为所有像素值只要贴近中心点都是可以被接受的,比如图二中的(3,5),选择周围的(3,6),(3,4),(2,5),(4,5)都是可以被接受的,不必要限制中心到像素级.因此,铰链损失(hinge loss)如下:
L
h
i
n
g
e
=
∑
k
=
1
K
∑
e
i
∈
S
k
max
(
∥
e
i
−
C
k
∥
−
δ
,
0
)
\mathcal{L}_{hinge} = \sum_{k=1}^K\sum_{e_i\in S_k}\max(\Vert {e_i - C_k}\Vert -\delta, 0)
Lhinge=k=1∑Kei∈Sk∑max(∥ei−Ck∥−δ,0)
但是,由于
δ
\delta
δ使用同一的值,因此只能取决于最小的实例中心,这对大物体十分不太友好,因为大物体会产生大量偏离中心邻域的像素点,从而导致loss增大.最直观的想法就是对于每个实例产生一个特定的
δ
\delta
δ值.既然一是需要满足
δ
\delta
δ随着实例越大而越大,而是需要越偏离中心越loss越大. 那么很直观的想法就是生成一个以实例中心为原点的高斯概率图,概率值越高表示像素越靠近中心.
ϕ
k
=
exp
(
−
∥
e
i
−
C
k
∥
2
2
σ
k
2
)
\phi_k=\exp\left(-\frac{\Vert e_i-C_k\Vert ^2}{2\sigma_k^2}\right)
ϕk=exp(−2σk2∥ei−Ck∥2)
假设认为概率
ϕ
k
(
e
i
)
>
0.5
\phi_k(e_i)>0.5
ϕk(ei)>0.5时,
x
i
x_i
xi位置的像素将会被分配给实例
k
k
k.那么就可以计算出每个实例的margin:
m
a
r
g
i
n
=
−
2
σ
k
2
ln
0.5
margin=\sqrt{-2\sigma^2_k\ln 0.5}
margin=−2σk2ln0.5
此时sigma(
σ
\sigma
σ)值越大,这个margin也就越大.这也要求网络对于每个实例学习一个适合的sigma值,很自然的,根据实例像素的数量可以大概推测sigma值的大小,因此,此处定义
σ
k
=
1
∣
S
k
∣
∑
σ
i
∈
S
k
σ
i
\sigma_k = \frac{1}{\vert S_k\vert}\sum_{\sigma_i\in S_k}\sigma_i
σk=∣Sk∣1σi∈Sk∑σi
作者选择使用Lovasz-hinge损失来优化实例图和GT。由于这个损失函数是Jaccard损失的(片状线性)凸代替,它直接优化了每个实例的IoU。因此不需要考虑前景和背景之间的类不平衡。
值得注意的是,作者并不直接监督偏移量
o
i
o_i
oi和
σ
\sigma
σ,而通过Lovasz-hinge loss和高斯函数的梯度后向传播最大化实例的IoU来优化.
为了进一步优化网络,作者还提出了椭圆margin,就是对x,y方向维度预测不同的
σ
\sigma
σ值,使得高斯函数呈现椭圆状:
ϕ
k
(
e
i
)
=
exp
(
−
∥
e
i
x
−
C
k
x
∥
2
σ
k
x
2
−
∥
e
i
y
−
C
k
y
∥
2
σ
k
y
2
)
\phi_k(e_i)=\exp\left(-\frac{\Vert e_{ix}-C_{kx}\Vert}{2\sigma_{kx}^2}-\frac{\Vert e_{iy}-C_{ky}\Vert}{2\sigma_{ky}^2}\right)
ϕk(ei)=exp(−2σkx2∥eix−Ckx∥−2σky2∥eiy−Cky∥)
此外还有就是让网络自己学习实例的中心,而不是先验的像素坐标中心.
ϕ
k
=
exp
(
−
∥
e
i
−
1
∣
S
k
∣
∑
e
i
∈
S
k
e
i
∥
2
σ
k
2
)
\phi_k=\exp\left(-\frac{\Vert e_i-\frac{1}{\vert S_k\vert}\sum_{e_i\in S_k}e_i\Vert}{2\sigma_k^2}\right)
ϕk=exp(−2σk2∥ei−∣Sk∣1∑ei∈Skei∥)
最后一点,在inference时,需要围绕每个实例中心进行聚类。因此需要一个种子图来确定实例中心,那我们可以直接选择
ϕ
k
\phi_k
ϕk的最高值作为实例的中心点.所以,用回归损失函数来训练种子图。背景像素回归到零,前景像素回归到高斯的输出。作者为每个语义类训练一个种子图:
L
s
e
e
d
=
1
N
∑
i
N
1
{
s
i
∈
S
k
}
∥
s
i
−
ϕ
k
(
e
i
)
∥
2
+
1
{
s
i
∈
b
g
}
∥
s
i
−
0
∥
2
\mathcal{L}_{seed} = \frac{1}{N}\sum_i^N\mathbb{1}_{\{s_i\in S_k\}}\Vert s_i - \phi _k (e_i)\Vert ^2 + \mathbb{1}_{\{s_i\in bg\}}\Vert s_i - 0\Vert ^2
Lseed=N1i∑N1{si∈Sk}∥si−ϕk(ei)∥2+1{si∈bg}∥si−0∥2
具体而言,在推理过程中,对种子值最高的嵌入物进行采样,并将该位置作为实例中心
C
k
^
\hat{C_k}
Ck^ 。在同一位置,还取了sigma值,
σ
^
k
\hat{\sigma}_k
σ^k 。通过使用这个中心和伴随的sigma值,将像素嵌入聚类到实例中:
e
i
∈
S
k
⇔
exp
(
−
∥
e
i
−
C
k
∥
2
2
σ
^
k
2
)
>
0.5
e_i \in S_k \Leftrightarrow \exp \left(-\frac{\Vert e_i-C_k\Vert ^2}{2\hat{\sigma}_k^2} \right) > 0.5
ei∈Sk⇔exp(−2σ^k2∥ei−Ck∥2)>0.5
接下来,mask out 种子图中的所有聚类像素,并继续采样,直到所有的种子都被mask。最后对所有类重复这个过程。
为了确保在采样期间
σ
^
k
≈
σ
k
=
1
∣
S
k
∣
∑
σ
i
∈
S
k
σ
i
\hat{\sigma}_k\approx\sigma_k = \frac{1}{\vert S_k\vert}\sum_{\sigma_i\in S_k}\sigma_i
σ^k≈σk=∣Sk∣1∑σi∈Skσi,作者添加了一个平滑项:
L
s
m
o
o
t
h
=
1
∣
S
k
∣
∑
σ
i
∈
S
k
∥
σ
i
−
σ
k
∥
2
\mathcal{L}_{smooth} = \frac{1}{\vert S_k\vert}\sum_{\sigma_i\in S_k}\Vert\sigma_i-\sigma_k\Vert ^2
Lsmooth=∣Sk∣1σi∈Sk∑∥σi−σk∥2
网络
![](https://i-blog.csdnimg.cn/blog_migrate/61320f790c2f00c6526a5ce90dd12261.png#pic_center)
总结一下,整体的框架如上图所示,其实是一个很简单的语义分割 Encoder-Decoder 结构。输入为一张
3
×
H
×
W
3\times H\times W
3×H×W图像,输出包含三个部分的,
a
)
σ
a)\ \sigma
a) σ图(
1
×
H
×
W
1\times H\times W
1×H×W)
b
)
b)
b) 像素偏移向量(
2
×
H
×
W
2\times H\times W
2×H×W)
c
)
c)
c) 类别特定的种子图 (
C
×
H
×
W
C\times H\times W
C×H×W)
网络的核心是为了学习像素的偏移,即
o
i
o_i
oi,这个偏移量是通过最大化IoU得Lovasz-hinge来优化的.但在inference过程中仍无法确定实例中心,因此网络通过每一类学习一个种子图,来确定中心点和
σ
\sigma
σ值, 为了平滑
σ
\sigma
σ值和实例大小的关系,网络预测
σ
\sigma
σ图.最后在inference的时候,结合种子图和sigma图的值得到高斯分布配合像素嵌入得到实例分割结果.
具体的细节可以参考原文,持续更新中