(本文应该是全网第一篇介绍FEELVOS的博客了,建议精读,我讲解的很细致,请觉得不错的同学点赞或留言O(∩_∩)O,转载请注明出处)
本篇是CVPR2019中用于视频目标分割的新方法,该方法注重快速和简单,因此有以下几个特点:
- 简单,单网络,single pass
- 迅速,不需要使用第一帧做微调
- 端到端,用于多目标分割,还能支持端到端的训练
- 鲁棒性,在DAVIS2017的验证集上,J&F有65%
这篇论文可以视作为其他方法的馈赠,很多思路都来源于之前的工作,不过对比不需要微调的方法,效果确实不错。同时也是作者和谷歌合作的论文,使用到同一家的论文mobilenet中提到的深度分离卷积。更值得称赞的是,开源了TensorFlow代码。
论文地址:FEELVOS
TF开源代码:here
论文的亮点
- 是第一篇解决视频多目标分割同时还是端到端学习的网络。
- 提出一种学习embedding向量的方法,使用global matching和local matching,使得学习embedding向量的方法是端到端的。
方法
总览
- 先用DeepLabv3+(去除最后的输出层)获得特征信息,在最顶层加上一个embeeding层用来提取embedding 向量。
- 根据embedding向量,通过global matching和 local matching得到两个distance map。
- 将两个distance map,DeepLabv3+提出的特征,前一帧的预测结果一共四个成分当做输入,送入到一个dynamic segmentation head中,这个头网络本质是4个深度分离卷积的stack。然后得到预测结果。
- 以上过程对帧中的每一个实例都进行一次,所以所用时间是随着实例的数目线性增加的。
接下来的内容就按照上面提到的每个过程,分成4个部分。
提出特征
论文的一大亮点是embedding向量。该向量是通过在DeepLabv3+(移除输出层)上再加了一个embedding层得到的。
这个层的向量用来描述像素的类别向量。
- 如果两个像素是同一类的,那么这两个像素对应的embedding向量之间的距离会很接近。
- 如果两个像素不属于同一类,那么这两个像素对应的embedding向量的距离很远。
所以不难猜测,这个embedding特征图的形式就是个“大面包”。见下图。embedding向量是切出来的条。
黄色块就是点(i,j)处的embedding向量。
接下来定义两个embedding向量间的距离。
d(p,q)=1?21+exp(∣∣ep?eq∣∣2)d(p,q)=1-\frac{2}{1+exp(||e_p-e_q||^2)}d(p,q)=1?1+exp(∣∣ep??eq?∣∣2)2?
epe_pep?是对应于像素p的embedding向量,d(p,q)d(p,q)d(p,q)就是像素p到q在embedding空间的距离。距离越小,说明p和q是属于一类,反之亦然。
对于相同类别的像素,我们可以很轻松的求出d的值应该很接近0或者为0;对弈不同类别的像素,d接近1或者为1。数值计算可以见原文如下:
上面是embedding layer的细节,就是一个深度分离卷积。
值得注意的是,这里p和q来自不同的输入。其中一个像素,我们假设为p,p可能来自第一帧的embedding 像素,也可能来自前一帧的embedding像素;而另一个q,则是来自当前帧的embedding像素。根据p的不同,计算两种distance map:Global distance map和 Local distance map,分别用到global matching和local matching。
Global matching
第一帧送进网络仅仅是为了获得它的embedding向量,作为reference map,我们并不需要对第一帧做预测,因为第一帧的结果是已知的。(这是VOS任务的基本要求,我重复一下,以免不了解VOS的同学看不懂)。
当前帧送进deeplabv3+得到embedding向量。我们先约定符号:
- PtP_tPt?记作第t帧的所有像素集合。
- Pt,o?PtP_{t,o} \subseteq P_tPt,o??Pt?记作,第t帧中属于类别O的像素集合。
- p∈Ptp\in P_tp∈Pt?记作当前帧中的一个像素。(和我上一部分的标记是反的,这个标记遵照原文)
- Gt,o(p)G_{t,o}(p)Gt,o?(p)记作p这个像素对应的global matching distance map的值
有
Gt,o(p)=G_{t,o}(p)=Gt,o?(p)=
所以想要得到完整的global matching distance map,需要把当前帧所有的像素点的embedding向量,都和第一帧中属于同一类的embedding向量用之前定义的向量距离公式计算,然后取最小的距离值。
这个过程其实相当费时间。论文中网络输入大小为465x465,即便经过deeplabv3+得到减少4倍的特征图,计算量仍然很大,虽然最终能跑0.5秒一帧。
Local previous Frame Matching
现在p属于前一帧的像素。计算公式仍然和全局匹配距离图的方法很相似。
注意到前一帧可能没有目标的,所以有个otherwise选项。如果前一帧没有目标,那么得到的map都是1。
但是前一帧和当前帧中目标的移动一般是很小的,没有必要还去用当前embedding feature的一个向量对所有的第一帧的embedding向量计算距离。受到Flownet的启发,仅仅在一个k邻域的大小中计算距离。也就是用一个2*k+1的窗口约束q的位置。所以实际上使用的是下面的公式:
N§是在p的x和y方向上至多k个像素距离的像素集合。注意这里的p其实是q,论文中解释这个p是一般性符号,不代表从哪一帧来。q则是前一帧的像素。
Dynamic 分割头网络(head)
(我发现近年来论文常常用backbone和head这两个词汇)
网络输入有四样:两个distance map,前一帧的预测结果,当前帧的deeplabv3+的输出特征图(不含embedding layer)
这个头网络结构简单,有四个深度分离卷积组成,产生一个一维的feature map用来预测类别,注意这个map仅仅为一个目标预测类别logits,我之前也提了,所有实例目标都要经过这样的网络流程。所以每个实例都会得到一个一维的feature map,将它们stack一起,使用softmax,用一个交叉熵和label训练。
整个网络结果如上图所示。
作者认为,即便对于每一个目标都需要经过分割网络,但真正花时间的地方在于backbone的提取特征。这一部分是共享的,只需一次。
下面是分割头网络的具体细节。
实现细节
之前提到了global matching中当前帧中每个像素都要和第一帧的像素的embedding vector计算距离,费事费力。实际做法是为每一个目标重采样至多1024个像素点。
loss使用 bootstrapped cross entropy。
local matching中k为15
实验
作者训练了两个模型,分别为FEELVOS(ours),FEELVOS(ours,youtobe-vos),区别仅仅在于训练数据集。第一个模型仅使用DAVIS2017 trainset。第二个模型既使用DAVIS2017 trainset,也使用youtobe-vos dataset。
消融实验
分割头网络有四个输入,作者分别disable其中一些输入,做了6个实验。证明了local matching和global matching很重要。丢弃它们会导致性能的大幅下降。
生成质量
我们只关注最后一行。第三列中猫的背部没有标记出来,是因为第一帧猫的形态没有背部。但网络能从分割错误中恢复过来。这一点maskTrack就做不到。原因就是global matching使得当前帧存在和第一帧的联系,而不仅仅和相邻帧。
主要结果
实验有很多,具体实验结果只能细看论文原文,博客里更多介绍方法。可以看出FEELVOS兼顾速度和精度。
总结
FEELVOS考虑了时序信息,所以数据集不用使用一般的分割数据集,也就是不像masktrack等将帧视为静态图。
虽然FEELVOS对global matching做了优化,也提到了仅为一个目标采用1024个像素点实际和全部计算没有大的性能降低,但有没有更好的办法提到global matching,毕竟仍然费时间。
未理解的地方
embedding layer的输出和最终的输出大小是原图的1/4倍,那么在global matching和local matching中如何知道特征图的map中每个embedding向量属于哪个类的呢?这些需要看源码才能得知。