论文地址 https://arxiv.org/abs/1703.10277v1

总体流程

预训练语义分割模型

增加两个输出head

1st head: 输出每个像素的embedding vector

2nd head: 为以该像素为中心的mask预测一个label 和 以此像素为中心的可信度(class label for the mask centered at each pixel, as well as a confidence score that this pixel would make a good ‘seed’ for creating a mask. )

overview

模型输出feature map -> 两个head:一个做embedding vector, 一个做classification并选择seed -> 获得分割结果。

Embedding Model

$$
\sigma(p, q) = \frac{2}{1 + exp(||e_p -e_q||_2^2)}
$$

$e_p$是p的embedding vector. 这个式子可以用来表示两个像素p,q的相似度(是否属于同一个Instance)

这个式子具有的特点是$\frac{2}{1+e^0} = 1$, $\frac{2}{1+e^\infty} = 0$

在此基础上,可以用下面这个loss函数来训练模型:
$$
L_e = -\frac{1}{|S|}\sum_{p, q \in S} [1_{y_p = y_q} \log (\sigma (p, q)) + 1_{y_p \ne y_q} \log (1- \sigma (p, q))]
$$

$w_{pq}$是与pq所属的instance的size成反相关的一个数值。

S是随机对每个instance选取的K个点组成的集合。

对于在$S^2$中的pq,如果属于同一个个体,目标值为1,不是同一个个体,目标值为0。

训练中也使整个空间中$\sigma(p, q)$与标准值的cross entropy最小。

(类似于N-pairs loss, Improved deep metric learning with multi-class n-pair loss objective)

embedding vector

图为把embedding vector投影到RGB上的直观显示。

Creating Masks

在完成embedding之后,需要生成一些masks。

先选择一个seed作为p,然后对于所有q,只要在在threshold之内,$\sigma(p, q) \ge t$,就认为属于同一个个体,这样就可以生成对应的mask, 记作$m(p, t)$.

这样的话,就需要一个好的办法来选择seed用来生成好的mask。

可以生成一个seed heatmap.

在拥有heatmap之后,不仅要选seediness比较高的seed,还要保证高的取全率,所以要尽量使不同seed之间的距离比较大。

第t步这样选择:

$$p_t = arg \max_{p \notin p_{1:t-1}}[\log S_p + \alpha \log (D(p, p_{1:t-1}))]$$

D代表所有欧氏距离的最小值。

$$D(p, p_{1:t-1}) = \min_{q \in p_{1:t-1}}|| e_p - e_q||^2$$

Classification and seediness model

输入 feature map => 输出 [h, w, C+1] 的heat map

C是种类数,0代表是背景。

如果某个pixel属于一个class,但是并不是一个好的seed,就可能被预测为0值。

例如物体边界的点就不一定是很好的seed。

具体实现来说,对于一个像素点p,如果对于给定的一个threshold t, 产生的mask与真实的mask相比,如果IoU(Intersection of union)到达某个threshold,就认为该点适合做seed,否则标记为背景。

如此对每个像素点计算class之后进行one-hot编码,与真实的mask的map计算softmax cross entropy作为loss函数。
$$
L_{cls} = - \frac{1}{|S|}\sum_{p \in S}\sum_{c=0}^{C}y_{pc} \log C_{pc}
$$
$C_{pc}$是从p生出来的mask属于c的概率。

对于不同大小的物体,需要不同的threshold。可以使T = {0.25, 0.5, 0.75, 0.9}

定义seediness:

$$S_p = \max_{t \in T} \max_{c = 1}^C C_{pc}^t$$

由此可以选出最好的seed,然后根据此seed,又可以得出最好的threshold:
$$
(t_p, c_p) = arg \max_{t \in T, c \in 1:C} C_{pc}^t
$$
效果如下图所示。

seed map

Shared full image convolutional features

ResNet-101 -> DeepLab v2 Model

这个模型可以把 [2h, 2w, 3] image => [h/4, w/4, 2048] feature map

整体的model是DeepLab v2 Model去掉了最后一层,用两个head层来进行输出。

$$ L = L_e + \lambda L_{cls}$$

整体训练的loss为embedding loss 和 classification loss 之和。$\lambda$是用来平衡两种loss。

在实际训练中采取的方式是,先把 $\lambda$设置为0,等embedding学习得差不多的时候就开始逐渐增加$\lambda$, 最终增加到0.2(来自于经验)。