参考代码:STM
1. 概述
导读:在视频分割任务中网络从视频帧中获取到的目标信息会随着分割的进行逐渐丰富起来,现有的一些分割方法确实或多或少地采用了之前帧的分割结果,但是并没有将当前帧之前的所有帧得到的信息进行融合,帮助当前帧进行分割,因而这篇文章就是从这角度出发,构建一个大的memory池子从而提出了一种半监督的视频分割方法STM(Spatial-Time Memory Network ),将当前帧的信息与之前帧的所有信息在空间与时序维度上进行特征匹配,从而得到超过之前方法的性能表现,由于采用了之前帧的所有信息自然其对遮挡和目标外表变化的鲁棒性能更加出色。文章的这个方法在DAVIS与Youtube-VOS数据集上性能表现都是很强的。不过要是部署到端上还是一个坑啊-_-||,不过还是很有借鉴参考价值的。
文章中对现有的一些视频分割方法进行了分析,将其划分为了下图中的集中类型:
- a)只通过给定当前帧的输出,作为当前帧的分割信息辅助输入,这样的放啊就是结构简单,但是分割的性能就比较差了;
- b)这个方法是在a的基础上进行改进,保留第一帧目标的信息,希望增加随着帧数增加的鲁棒性和分割性能;
- c)这个方法就是在b的基础上进行改进而来,增加了前一帧的输入作为cues,从而进一步提升分割的性能;
- d)那么从上面的几个方法中寻找规律得到:那么要是加入的额外cues信息越多那么带来的分割效果也就越好呢?因而这篇文章就将当前帧之前的所有数据给加到memory里面了,辅助当前帧的分割。那么存在的问题就是 如何高效地使用这些之前帧的信息呢? 这篇文章中在memory network的基础上为当前需要分割的视频帧计算多帧空间时序维度上的attention特征,从而帮助进行分割。文章中对于所使用的帧数上没有限制,在拥有了这些信息之后可以极大增加网络的鲁棒性,并且这些在这些帧之上做了attention就使得网络具有了non-local的空间像素匹配机制;
PS:将当前帧之前的所有帧及其mask都保存到Memory里面是很低效的,文章中默认保存前一桢与首帧,其它的帧则是间隔 N = 5 N=5 N=5进行采样。
2. 方法设计
2.1 网络结构
文章的方法流程可以划分为Memory和Query部分,前一个部分是对过去帧的图像和mask进行编码,另外一个部分是当前帧的图像编码,并使用Memory听过read模块输出的信息进行分割mask的decoder,其流程见下图所示:
从上面的图中可以看到无论是之前的帧和当前帧都会将数据编码成为键值对的形式(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两个特征(下采样的比例分别为 1 8 \frac{1}{8} 81和 1 2 \frac{1}{2} 21),即是特征图: k Q ∈ R H ∗ W ∗ 1 8 k^Q\in R^{H*W*\frac{1}{8}} kQ∈RH