《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记

参考代码:STM

1. 概述

导读:在视频分割任务中网络从视频帧中获取到的目标信息会随着分割的进行逐渐丰富起来,现有的一些分割方法确实或多或少地采用了之前帧的分割结果,但是并没有将当前帧之前的所有帧得到的信息进行融合,帮助当前帧进行分割,因而这篇文章就是从这角度出发,构建一个大的memory池子从而提出了一种半监督的视频分割方法STM(Spatial-Time Memory Network ),将当前帧的信息与之前帧的所有信息在空间与时序维度上进行特征匹配,从而得到超过之前方法的性能表现,由于采用了之前帧的所有信息自然其对遮挡和目标外表变化的鲁棒性能更加出色。文章的这个方法在DAVIS与Youtube-VOS数据集上性能表现都是很强的。不过要是部署到端上还是一个坑啊-_-||,不过还是很有借鉴参考价值的。

文章中对现有的一些视频分割方法进行了分析,将其划分为了下图中的集中类型:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记

  • a)只通过给定当前帧的输出,作为当前帧的分割信息辅助输入,这样的放啊就是结构简单,但是分割的性能就比较差了;
  • b)这个方法是在a的基础上进行改进,保留第一帧目标的信息,希望增加随着帧数增加的鲁棒性和分割性能;
  • c)这个方法就是在b的基础上进行改进而来,增加了前一帧的输入作为cues,从而进一步提升分割的性能;
  • d)那么从上面的几个方法中寻找规律得到:那么要是加入的额外cues信息越多那么带来的分割效果也就越好呢?因而这篇文章就将当前帧之前的所有数据给加到memory里面了,辅助当前帧的分割。那么存在的问题就是 如何高效地使用这些之前帧的信息呢? 这篇文章中在memory network的基础上为当前需要分割的视频帧计算多帧空间时序维度上的attention特征,从而帮助进行分割。文章中对于所使用的帧数上没有限制,在拥有了这些信息之后可以极大增加网络的鲁棒性,并且这些在这些帧之上做了attention就使得网络具有了non-local的空间像素匹配机制;

PS:将当前帧之前的所有帧及其mask都保存到Memory里面是很低效的,文章中默认保存前一桢与首帧,其它的帧则是间隔N=5N=5进行采样。

2. 方法设计

2.1 网络结构

文章的方法流程可以划分为Memory和Query部分,前一个部分是对过去帧的图像和mask进行编码,另外一个部分是当前帧的图像编码,并使用Memory听过read模块输出的信息进行分割mask的decoder,其流程见下图所示:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记
从上面的图中可以看到无论是之前的帧和当前帧都会将数据编码成为键值对的形式(Key和Value):

  • 1)Key:它被用于评估当前帧和之前帧的相似性,用以判断memory中那些特征应该被采样出来,因而其编码了视觉语义用以实现对目标外表变化的鲁棒;
  • 2)Value:相比key中保存的信息,Value中保存的信息则更加的细致,它是用来生成最后mask精细结果的。这里Value在Memory和Query中是由些许不同的:在Query中value包含详细的当前帧的外表信息从而用于解码生成细致的mask;而Memory中的value则包含了详细的目标外表信息与区分前景背景mask信息。这是由于他们进行编码的对象不一样导致的;

2.2 网络的编码器

这篇文章的算法使用的是ResNet-50作为其backbone,其在解码的时候由于Memory与Query的差异导致输入的数据并不相同,因而文章将这部分的编码器划分为了两个:

  • 1)Query编码器:这里在backbone的基础上使用两个并行的卷积对backbone的输出特征进行channel维度的下采样得到key和value两个特征(下采样的比例分别为18\frac{1}{8}12\frac{1}{2}),即是特征图:kQRHW18k^Q\in R^{H*W*\frac{1}{8}}vQRHW12v^Q\in R^{H*W*\frac{1}{2}}
  • 2)Memory编码器:这里的不同是增加了mask的概率图输入(它是0到1的概率值),因而第一个卷积的权重需要做对应的调整,对于新增加出来的权重做随机初始化。其得到key和value两个特征图的方式也是类似的,因而其特征图为:kMRHW18k^M\in R^{H*W*\frac{1}{8}}vMRHW12v^M\in R^{H*W*\frac{1}{2}}

2.3 STM的read模块

在得到两个部分的编码之后的键值对之后就需要将当前帧与之前的帧进行关联,也就是在之前的帧(Memory)中检索寻找与当前帧相似的帧,并计算他们的相似度。这部分的工作是有key完成的,对于两个key的相似度计算可以描述为:
f(kiQ,kjM)=exp(kiQKjM)f(k_i^Q,k_j^M)=exp(k_i^Q\cdot K_j^M)
这里使用的是矩阵运算的形式进行的,得到当前帧ii与之前帧jj之后就需要read出当前帧与之前帧的联合特征图了,其是使用Concat的形式进行组合的:
yi=[viQ,1Zjf(kiQ,kjM)vjM]y_i=[v_i^Q,\frac{1}{Z}\sum_{\forall j}f(k_i^Q,k_j^M)v_j^M]
其中,归一化参数为:Z=jf(kiQ,kjM)Z=\sum_{\forall j}f(k_i^Q,k_j^M)
其具体的计算过程可以描述为下图中的形式:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记
分割解码器部分:
这里将read模块输出的特征图进行压缩到256,之后在以factir为2的形式逐渐结合backbone的特征图优化分割结果,迭代到特征图尺寸为原始输入尺寸的14\frac{1}{4}为止。

2.4 训练方法

这篇文章的训练方法与作者之前的文章RGMP具有相似的地方,都是使用两阶段进行训练的。
第一阶段训练:
这里对图像数据进行随机的仿射变换从而得到不同的数据,并将这些数据使用起来进行第一阶段的训练工作。

第二阶段训练:
这部分的训练是在一阶段模型的基础上使用视频数据训练得到的,其在视频数据集上进行采样得到sample,这里会对此采样的间隔进行变化,文章中说的是0~25之间间隔采样。

不同阶段的训练给性能带来的影响:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记

3. 实验结果

分割性能:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记
在文章方法的前提下Memory构建方式对性能的影响:
《STM:Video Object Segmentation using Space-Time Memory Networks》论文笔记