文章目录
解决什么问题
VOS
本文创新点\贡献
- 作者的网络生成尖锐的mask,并且不需要花时间做后处理。
- 使用两阶段的方法,在人工生成的数据上做预训练,然后微调,能解决缺少大量训练数据的问题
前人方法
基于传递:
利用物体移动的时间连贯性,做mask传递,但依赖像素之间的时空联系,遇到那种漂移、消失的情况就不行了,只能是外观和移动平滑的情况下使用
基于检测:
不依赖时空信息,主要是逐像素检测,这样不怕运动的不连贯,但是怕外形改变和相似物体误检
方法
关键就是利用带有注释信息的参考帧还有带有前面mask的当前帧,然后网络通过匹配参考帧的外观来检测target物体,通过参考之前的target mask来在当前帧进行追踪
Siamese encoder
输入:
两个输入,一个是带有真实mask的第一帧,另一个是带有前一帧的mask的当前帧(都是四通道),分别对应target流和参考流,两个流的卷积的权重是共享的
网络:
backbone是ResNet50,第一个卷积层改动了让可以输入四通道,然后权重来自ImageNe的预训练,新加入的卷积随机初始化
Global convolution block
输入是两个encoder的输出叠放在一起的特征图,这个模块用来做参考和target流之间的全局特征匹配,来定位target物体。这是一种全局卷积的操作,说是能克服卷积的局限性,还扩大了感受野,后面加了残差连接,没有使用BN
Decoder
执行refinement模块,来有效合并特征,用softmax来生成最后的object mask,大小只有原输入的四分之一
这个mask分辨率不算高吧
训练
两阶段训练方法,先使用静态图像数据集对模拟样本进行训练,然后对视频分割数据进行微调。
Pre-training on simulated samples
自动生成方法:
-
对带有object mask的图进行随机变换,来生成一对图像
-
混合前景和背景,位置随机
-
对target的mask做一些随机扭曲,模拟前后mask的不重叠效果,而且还随机裁剪一部分
Fine-tuning on video data
目的:
使网络学会适应长期的外观改变(参考和target帧之间)和短期的移动(target帧和前一帧的mask)
操作:
在时间的尺度上循环连接模型,然后把前一帧的softmax输出作为当前帧的指导,而不是使用二值化,这样能将估计的不确定性考虑进去,还能做BPTT,训练的时候随机从时间序列里挑N段连续的target帧
二值化太死板了
前一阵生成mask的时候本来就是用softmax然后argmax,这样直接使用softmax,能更好的利用细腻些
要一直用第一帧的信息吗,那岂不是误差越来越大?
这样看还是嵌入向量更好
推理
将未二值化前一帧的输出概率图作为的目标帧的引导mask,推理的时候只对参考帧做一次encoder,而且这样效果不错,为了捕捉不同尺寸,对图像做了缩放(0.5,0.75,1),然后取平均值。
Multiple Objects
在推理的时候有两种方法:
- 简单的方法是每个物体独立处理,分配可能性最大的label
- 另一种方法,赢者通吃,利用实例的不连贯约束,每个像素不可能同时属于多种实例,所以在估计中,将不是最大的实例可能性设为0.
是指的检测框吗,那不就是直接取最大吗,不连贯约束是什么,是指前后?还是说左右?
左右发生冲突的时候?
还是说这个框有了最大的之后,其他的框的这种可能性都设为0了?
这样一种label只会存在一个,A框的a类0.95分,B框的a类0.8分,b类0.7分,这时候A分为a类,B分为b类
不是,人家是像素,像素之间怎么搞,置为0了又怎么样?那跟直接选最大的有区别吗
第二种比第一种好,但是也丢失了一部分信息,所以对此使用了softmax:
其中 和 logit 代表softmax和logit函数, 是实例 在像素位置 的可能性, 表示背景, 是实例的数量
实验结果
总结
这篇文章算是比较早了,现在使用第一帧和前一帧算是基本操作了,就是使用方法不同,这篇文章的使用比较简单,只是提取了特征融合在一起,没有更精细的使用,所以速度会较快,越到后面的帧和第一帧的差距越大,可能这种方法的精准度就不行了,而且前一阵的mask误差也会逐渐累积,越往后越不好,这么比起来STM的memory机制较为理想的方法了