Video Object Segmentation using Space-Time Memory Networks论文理解

创新点

计算视频的多帧的每个像素的关于query图像的每个像素的空间注意力,以此来决定像素是否属于前景物体不用限制帧的数量,还能简单的将他们加到memory中,探索丰富的参考信息

这个参考信息来自哪呢?是之前的memory吗?
attention中的Q K就是对输入的卷积,V就是输入本身


方法

在这里插入图片描述

先用编码器编码前面的带有mask的帧,


Memory Network

输入
前面的带有mask的帧

输出
记忆的信息嵌入到key(输入)和value(输出)特征向量

作用
将要被分割的帧作为query,memory随着新预测的mask动态更新,这对于解决外观更改,遮挡很有好处,每个在query中的帧都需要访问memory帧中不同时空位置的信息,所以做成了4D。
做预测的时候使用时空memory 读取操作来定位并阅读4Dmemory中的相关信息,算是一个时空注意力算法,对每个query像素计算when and where来决定像素是否属于前景物体。

4D能解决吗?跟时空有什么关系呢?时间通道、位置通道?
为什么能计算看下面STM


Space-Time Memory Networks

关注一下如何做到时间上的attention,之前non-local在空间和通道上做的attention

扫描二维码关注公众号,回复: 9513483 查看本文章

首先,memory和query帧都会经过编码器,来生成key和value,key的作用是“寻址”,即找对应的value,计算query和memory帧的key特征之间的相似度,就能找到决定when and where恢复的相关memory value来自哪里。

key、value功能

  • key用来学习视觉的语义,来匹配外观的多样性
  • value用来储存生成mask估计的细节

query和memory的value的功能

  • query的value储存用来解码mask的详细的外表信息
  • memory的value用来编码视觉的语义,还有每个特征属于前景or背景的mask信息

然后将key和value都放入读取模块,这样,两个key特征在时空间上稠密匹配,得到相关的匹配分数,然后这个匹配分数用来寻址memory帧中的value特征图,并且和找到的value特征下相结合,得到读取模块的输出,在进入解码器,就能得到最终的mask

匹配应该就是计算的distance,根据得分判断是不是都来自同个物体,然后分数再对value起作用

所有的memory帧都会独立嵌入到key和value中,然后沿着时间差的维度堆叠到一起, T T 表示帧数

这样会有更多的参考信息,确实好一些


Space-time Memory Read

在这里插入图片描述
通过执行non-local操作来比较query和memory的key特征的相似性,然后让memory的value与soft的相似性加权求和,求完之后再和query的value结合

感觉跟non-local就是一样的,就是多了个时间维度,也就是始终的 T T
相似性就是一个query的key对应 T T 个memory的key,这样的话就是多对应的attention,每个memory的帧都计算了,就是感知相似度,对,然后softmax就可以取value中对应的特征,作者的说法value中是视觉的语义编码,决定特征的前后景,如此说,就是一些能判定mask的信息,而这些又经过softmax结合被挑选,和query的value中的外表信息结合的话,就能确定哪些外表可以被分为前景

y i = [ v i Q , 1 Z j f ( k i Q , k j M ) v j M ] y_i = [v^Q_i,\frac{1}{Z}\sum_{\forall j}f(k^Q_i,k^M_j)v^M_j]
Z = j f ( k i Q , k j M ) Z = \sum_{\forall j}f(k^Q_i,k^M_j)
f ( k i Q , k j M ) = e x p ( k i Q × k j M ) f(k^Q_i,k^M_j) = exp(k^Q_i \times k^M_j)

作者也说可以看成是non-local的拓展,但是作者的使用动机不同,non-local是自注意力,而这个是query和memory,不同的特征之间的关联

我没有考虑到使用的对象不同


Decoder

用了自己之前的文章中的微调模块来做Decoder:
在这里插入图片描述
通过若干个这样的模块来逐步上采样,残差块的输入一直是query的encoder生成的特征图,不过要调整到相应的大小,另一端的输入是上一个微调模块的输出,最终的mask是通过最后一个卷积层加softmax生成的(就是个分类咯),过滤器都是 3 × 3 3\times 3 ,除了最后一次是2通道,其他的都是256通道,最后生成的mask是输入图片大小的1/4。


训练

用ResNet50做backbone,使用res作为基础特征来计算key和value特征图

Two-stage Training

  • 在别的图像数据集上做了同样的预训练
  • 相同的数据增强
  • 训练的时候取多个帧,还从中切掉了一些,用循环学习的方法能从0个切到25个

    循环学习就是同样的数据,每次输入切到一部分帧,重复输入多次吧,应该是这样

推理

N N 帧保存一个新的memory帧,N设为5

这样的话也会越存越多吧,最后就变满了,有没有什么方法能砍掉不重要的memory帧?
虽然参考变多了,能一定程度解决误差累积,但是速度会越来越慢吧
看图又像是共5帧

在这里插入图片描述


实验结果

在这里插入图片描述
D A V I S 2017 DAVIS-2017

在这里插入图片描述
D A V I S 2016 DAVIS-2016

在这里插入图片描述
D A V I S 2017     + Y V y o u t u b e v o s DAVIS-2017\ \ \ +YV表示在youtube vos上做了预训练

在这里插入图片描述
效果图,这些帧都是有遮挡或是消失又重现的情况
在这里插入图片描述
对比情况

总结

STM是个较理想的模型,比起之前的使用前一帧更好,利用了更多的信息,最重要的还是第一帧的先验,但是通过memory将这个优势放大了,就能更精准

发布了63 篇原创文章 · 获赞 2 · 访问量 8010

猜你喜欢

转载自blog.csdn.net/McEason/article/details/104484705
今日推荐