当前位置: 代码迷 >> 综合 >> Fast Video Object Segmentation by Reference-Guided Mask Propagation论文解读
  详细解决方案

Fast Video Object Segmentation by Reference-Guided Mask Propagation论文解读

热度:78   发布时间:2023-10-20 18:59:42.0

今天带了一篇视频目标分割具有里程碑意义的文章,为啥说它有里程碑意义,因为这篇论文相较于之前的VOS方法,不需要微调或者数据增强和online adaptation,以及多数据多流然后特征融合,具有非常快的速度的同时,还具有state of the art的精度。放在2018年(应该是2017年就出来了),是strongly novel的。

CVPR2018,论文地址
官方源码

Idea

作者提出了一种基于孪生的编码解码网络,通过在合成数据(synthetic)和真实数据上做两个阶段的训练,在没有任何后处理的情况下,精度达到了state of the art,同时速度是近乎10FPS。第一个编码解码结构合理的运用了mask;引入合成数据集又让网络训练的更好。

在之前的VOS方法中,主要有两种方式,一种利用mask propagation,即MaskTrack的思路,把mask concat到输入上。这种方法依赖于mask的准确性,如果mask不够准确,那么就会有严重的误差漂移问题。另一种是基于检测(论文为啥说是基于检测,我觉得是基于形象更合适)的方法,如OSVOS,给定第一帧的GT,用一些数据增强的方法,对测试视频进行finetuning,以希望网络记住目标的形象,然后在后续帧中找到这个目标。这种方法的弊端是如果目标发生了大的形变,和第一帧的目标形象差的很远,网络将不会有效的分割出目标像素,因此很难处理long range的视频序列。
还有,以上两种方法都需要数据增强和finetining,因此耗费时间巨大。

Method

overview

Fast Video Object Segmentation by Reference-Guided Mask Propagation论文解读
给定一个参考帧和参考帧的GT,作为其中一个输入,对应的是左下角的位置。target frame代表当前帧,target frame上红色的mask是上一帧预测的mask,这个mask需要concat到当前帧,和同样用参考帧的mask concat到参考帧一起,送到一个孪生的编码解码结构。注意,既然是孪生,所以这两个分支是参数共享的。
这个方法的主要思想是,告诉网络,我们想获得哪个目标的分割(由参考帧指定),然后希望网络学习通过匹配和参考帧中指定目标检测到最相似的目标,也就是学习相似性度量。(事实上,后面的基于快速VOS的方法几乎都是在寻求更好的学习与第一帧目标的相似性)。

两张输入图像和它们各自的mask送到编码网络中,得到的特征图concat在一起,送到global convolution block中做特征融合,然后不断送到上采样模块中。上采样是解码器,用到了来自编码器的信息。最后输出通道为2的概率置信图。

网络结构

编码解码孪生网络具有以下特点:

  • 两个分支结构相同,参数共享
  • 输入通道是4,所以第一层的卷积核都需要加一个通道。
  • mask是concat到输入图像的。参考帧往往是第一帧,那么参考帧的mask来自GT;当前帧的mask来自上一帧的预测结果。
  • backbone作者选择的是resNet50,第一层的多出来的通道,使用随机初始化(未指定具体初始化),其他的权重来自于预训练模型。

Global convolution block

这个block结构示意图看overview中的总框架。非常简单。有以下要点:

  • 两个encoder的分支的输出concat到一起作为block的输入。
  • 对特征图进行1k和k1的卷积来增大感受野
  • residual block中移除了batch norm(为啥),也就是说除了backbone,没有其他地方有batch norm了。
  • 所有特征图的通道都是256

Decoder

由三个refineModule组成,每一个都是两倍上采样,最终输出mask是原图的1/4。其结构也是很简单的。不再多言。

两阶段训练

考虑到DaVIS2017只有60个序列作为训练集,即便用预训练的pretrained model初始化模型,也不够训练出一个好的模型。这是因为模型使用上一帧的预测结果作为当前帧的mask输入,但是训练集mask都是很标准的,即当前帧的mask标签完美覆盖目标,但在测试的时候可能会遇到很差的mask,为了能让模型在测试的时候对不同质量的mask更加鲁棒,需要模拟在test阶段生成的mask。为了解决这个问题,作者使用两阶段训练。

  • 第一阶段使用假数据(合成的数据)训练。这一阶段是不考虑时序关系的,即所有帧视作静态图像。那么就涉及到了如何生成合成(simulated)数据
  • 在VOS数据集上fintuning

合成数据

注意模型有四个输入,所有对于一个sample,我们需要提供当前帧和参考帧以及各自的mask,如何从训练集中去组合得到合适的sample呢。
从语义分割数据集和实例分割数据集,作者可以获得大量关于目标和对应的mask作为源图像。

  • 把源图像和对应的mask应用随机transformation(缩放,旋转,平移,颜色摄动(应该是改变contrast那些东西))。这样我们就得到了一个pair,包含原来的图像以及标准的mask,和处理过的图像和mask。
  • 基于显著性检测的数据集,我们获得前景图像,用Pascal VOC的数据集作为background,把前景图像移到background上,前景图像也是经过transformation才移到背景图像上的。这样就又得到了一对pair。

所有处理过的mask都加上了mask的仿射变换。(affine transformation)

Fast Video Object Segmentation by Reference-Guided Mask Propagation论文解读
上图就是两种生成pair的方法对应的结果。下面一行会作为参考帧输入,上面作为当前帧,可以发现,当前帧的mask都不是准确的。

作者认为,strategy1模拟了在同一场景下,由目标运动,摄像头移动等导致目标形态位置的变化。strategy2模拟了更复杂的情况,因为显著性包含了更多的目标类别。虽然strategy2生成的样本看上去不真,但实验证明确实有效。

Fine tuning

用以上合成的数据训练网络之后,用VOS数据集做finetuing。作者认为,在用真实的VOS数据集训练之后,网络既能对long range的视频序列表现良好(target frame和reference frame之间),又对short motion表现良好(之前帧的mask和当前帧的图像之间)
在训练的时候,随机挑target frame和reference frame。如果在视频中多目标的mask,就挑出其中的一个。

注意,以上的训练方法还不足以让模型学习到更精确的分割。因为训练集中mask总是准确的,而实际情况,我们上一帧的mask去concat当前帧,maks可能有误差的漂移。为了能让模型对误差有一定的鲁棒能力,作者finetune的方式比较有意思,用到了递归的方式。见下图
Fast Video Object Segmentation by Reference-Guided Mask Propagation论文解读
reference frame从一个视频序列中随机选出,同时还有他的mask。
随机选出一帧作为target frame,我们记作t,选出t-1帧的mask,concat到输入上,送到模型中得到了第t帧的预测结果。然后第t帧的预测结果和第t帧的标签做loss。
按照一般的方式,这个sample就算训练完了,下一个sample还是随机挑选出两帧,再去训练。
但是作者的做法是,第t帧的预测结果不仅去做loss,还去作为下一帧t+1帧的输入mask,而不是用第t帧的mask的真实标签。
换句话说,模型使用它自己对预测做finetuing。

inference

  • 传到下一帧的是上一帧的输出概率图,而非二值化的结果,就是softmax之后不需要threshold。
  • 用了rescale到不同的比例,然和求平均,以此得到捕捉多尺度的目标的预测结果。(后来的一些方法没有用这个技巧来评估自己的方法)
  相关解决方案