Summary - Video Object Segmentation using Space-Time Memory Networks
Seoung Wug Oh, Joon-Young Lee, Ning Xu, Seon Joo Kim
ICCV 2019
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 相反
- 使用上一帧和第一帧的信息:即 1 和 2 的结合,能具有两者的优点。这种方法能得到 SOTA 的表现,并且运行时间快(无需 online learning)
STM:既然利用上一帧和第一帧的信息能有助于视频对象分割,那么可以使用更多帧(甚至所有帧)来提供更多有用的信息。因此,作者使用了 memory network 来自适应的地选择 previous frames 和对应输出的 masks 的有用信息。
Method
模型结构
网络包含四个主要的模块,分别为 Query encoder, Memory encoder, Space-time Memory Read 和 Decoder
Query encoder
- 输入:query frame (3),即当前帧(待分割的帧),括号内数字为特征图 (channel) 数量,下同
- 输出:2 个 feature maps,分别为 key (128) 和 value (512)
实现方法:
- 使用在 ImageNet 上预训练的 ResNet-50,用 query frame (3) 作为输入,第 2, 3, 4 个卷积块的输出分别为 r2 (256), r3 (512), r4 (1024)
- 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 模块结构图:
其中, 分别是 query frame 的 key, value, 分别是前面 帧的 keys, values。
首先计算 query 和 memory 的 key 的相似性,这是通过下面的相似函数计算得到:
并计算得到一个 soft weight 权值:
这里的权值相当于是得到了一个 attention,即记忆网络的注意力机制,通过与 相乘来筛选其中的有用的信息。最后和 concat 一起得到输出:
Decoder
作者在之前的文章中提出了 Refine 模块:Fast Video Object Segmentation by Reference-Guided Mask Propagation
使用了 2 个 Refine 模块来做 decoder:
通过这样的模块来逐步上采样,其中虚线输入是 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 的注意力机制来获取有用的信息,无论在准确度或时间上都优于现有的模型。