Summary - Video Object Segmentation using Space-Time Memory Networks

Seoung Wug Oh, Joon-Young Lee, Ning Xu, Seon Joo Kim

ICCV 2019

[paper] [code]

Summary reference:https://blog.csdn.net/McEason/article/details/104484705

半监督的 VOS:给出视频中第一帧的目标对象的 ground truth mask,要求在其他所有帧中分割出该目标对象。

Motivation

与单张图像分割不同,在视频对象分割中有更多的信息可以利用,如帧与帧之间的时序信息、先前帧(previous frames)已分割好的 object masks 等。但现有模型未能够很好地利用这些信息。在 STM 中,作者使用了记忆网络(memory network)来把这些所有可以利用的相关信息存储到 Space-time Memory Read 模块中,并用于当前帧(query frame)的分割。

关键点:网络要从哪些帧中获到有用的信息

先前的工作:

  1. 从上一帧中获取信息:可以更好地解决物体变化的问题,但对于遮挡、错误偏移的鲁棒性较低
  2. 利用第一帧中的信息,独立地对其他每一帧进行分割:优缺点和 1 相反
  3. 使用上一帧和第一帧的信息:即 1 和 2 的结合,能具有两者的优点。这种方法能得到 SOTA 的表现,并且运行时间快(无需 online learning)

STM:既然利用上一帧和第一帧的信息能有助于视频对象分割,那么可以使用更多帧(甚至所有帧)来提供更多有用的信息。因此,作者使用了 memory network 来自适应的地选择 previous frames 和对应输出的 masks 的有用信息。

Method

模型结构

Summary - Video Object Segmentation using Space-Time Memory Networks

网络包含四个主要的模块,分别为 Query encoder, Memory encoder, Space-time Memory Read 和 Decoder

Query encoder
  • 输入:query frame (3),即当前帧(待分割的帧),括号内数字为特征图 (channel) 数量,下同
  • 输出:2 个 feature maps,分别为 key (128) 和 value (512)

实现方法:

ResNet 网络结构表格

  1. 使用在 ImageNet 上预训练的 ResNet-50,用 query frame (3) 作为输入,第 2, 3, 4 个卷积块的输出分别为 r2 (256), r3 (512), r4 (1024)
  2. r4 (1024) 作为输入,分别通过两个单独的卷积层,分别得到 key (128) 和 value (512)
Memory encoder
  • 输入:memory frame (3) ,即在 query frame 之前的帧,以及他们的 mask (1)
  • 输出:key (128) 和 value (512)

实现方法:结构与 Query encoder 基本相同,只是输入不一样。在第一个卷积层中,让 mask 单独通过一个 7x7 的卷积层,然后和 memory frame 对应层的特征图相加,再进行后续的计算。

在代码里,Memory encoder 还有一个输入 o,由 mask 计算得到,也是单独通过一个 7x7 的卷积层,与 memory frame 对应层的特征图相加。不太清楚为什么要这样做

Space-time Memory Read

Space-time Memory Read 模块结构图:

Summary - Video Object Segmentation using Space-Time Memory Networks

其中,kQ,vQ\textbf{k}^Q, \textbf{v}^Q 分别是 query frame 的 key, value,kM,vM\textbf{k}^M, \textbf{v}^M 分别是前面 TT 帧的 keys, values。

首先计算 query 和 memory 的 key 的相似性,这是通过下面的相似函数计算得到:
f(kiQ,kjM)=exp(kiQkjM) f(\textbf{k}_i^Q, \textbf{k}_j^M)=\rm{exp}(\textbf{k}_i^Q *\textbf{k}_j^M)
并计算得到一个 soft weight 权值:
1Zjf(kiQ,kjM),size=(HWTHW) \frac{1}{Z}\sum _{\forall j} f(\textbf{k}_i^Q, \textbf{k}_j^M),\rm{size=(HW*THW)}
这里的权值相当于是得到了一个 attention,即记忆网络的注意力机制,通过与 vM\textbf{v}^M 相乘来筛选其中的有用的信息。最后和 vQ\textbf{v}^Q concat 一起得到输出:
yi=[viQ,1Zjf(kiQ,kjM)vjM] \textbf{y}_i=[\textbf{v}_i^Q, \frac{1}{Z}\sum _{\forall j} f(\textbf{k}_i^Q, \textbf{k}_j^M) \textbf{v}_j^M]

Decoder

作者在之前的文章中提出了 Refine 模块:Fast Video Object Segmentation by Reference-Guided Mask Propagation

使用了 2 个 Refine 模块来做 decoder:

Summary - Video Object Segmentation using Space-Time Memory Networks

通过这样的模块来逐步上采样,其中虚线输入是 skip connection,实线输入是上一个 Refine 模块的输出。最后通过一个 3x3 卷积层得到通道数为 2 的特征图,再通过 softmax 得到分割图 mask。这里生成的 mask 是输入图片大小的 1/4。再通过 4 倍的双线性插值上采样得到最终的 mask。

训练

分两阶段训练:

  • pre-training:在别的图像上做预训练
  • main training:使用真实的视频数据进行训练

推理

  • 第一帧和先前帧(previous frame)总会保存在 memory中。

  • 对于中间帧,则每 N 帧保存一个新的 memory 帧,这里的 N 是一个超参数,文中设为 5。

Performance

在 Youtube-VOS 和 DAVIS 数据集上进行了实验,其中 Youtube-VOS 数据集比 DAVIS 大得多。由于 DAVIS 数据集比较小,单单在该数据集上进行训练的话会出现严重的过拟合现象。

文中对比了仅 pre-training,仅 main training,以及完整训练,这三种方式对性能的影响,发现了pre-training 可以提升模型的泛化性能和避免过拟合。还进行了 Cross validation (使用 Youtube-VOS 训练,DAVIS 验证,或反过来),发现使用 Youtube-VOS 训练,能提升 DAVIS 验证集性能,但反过来会降低 Youtube-VOS 的验证集性能。

接着,文中通过对比,发现在 memory 里加入中间帧会对困难的帧(difficult cases)分割得更好,如含有遮挡、对象消失或重现的帧。并通过可视化 memory frames,发现 Space-time Memory Read 模块确实能够关注分割对象的有用信息。

总结

对于先验帧,STM 在第一帧和先前帧的基础上加入中间帧,并使用 memory network 的注意力机制来获取有用的信息,无论在准确度或时间上都优于现有的模型。