《RGMP:Fast Video Object Segmentation by Reference-Guided Mask Propagation》论文笔记
参考代码:RGMP
1. 概述
导读:这篇文章在Siamese编解码网络结构的基础上,将视频分割网络中的mask传导与目标检测思想(数据增广的时候)相结合,克服彼此存在的问题,从而构建除了一个新的视频分割的网络,并且其速度还挺快,能跑到大概10FPS(ResNet-50的backbone,并不需要任何在线学习与后处理)。并且文章的方法能够实现单目标与多目标分割,在对应的数据集上分割性能与运算速率较好的分割结果。
在视频分割领域中一般的方法主要分为两个流派,一个是基于帧间mask传递与基于检测的,他们有各自的特点与不足:
- 1)基于帧间mask传导:这种方法利用了目标在时序上的相关性,从给定的第一帧图像数据标注开始进行mask传导。这些方法是依赖于像素间的时序关系,因而可以使用复杂的目标形变以及目标的移动,只要满足在视野中出现且平滑移动。但是对应的缺点是不能处理遮挡与快速的目标移动,并且存在累计误差的问题;
- 2)基于检测的方法:基于检测的方法是在每帧上预测目标的位置,其结果并不依赖于帧间的时序信息,因而对于遮挡与漂移有较好的鲁棒性能。但是这些方法存在对目标的外表比较敏感,并且无法分离具有相似外表的目标;
正是基于上面提到的不同视频分割基底的方法优缺点,文章将这两种类型的方法进行整合,从而得到文章的方法,将文章的方法与一些视频分割算法进行对比,其结果见下图1所示:
2. 方法设计
2.1 网络结构
这篇文章的网络结构是一个编解码结构的网络,其在输入端采纳了参考帧与其标注信息以及前一桢分割结果当前帧的信息,从而去预估当前帧的结果。文章是采用ImageNet上预训练的ResNet-50网络作为backbone,被设计成为一个全卷积的网络结构,因而可以适应不同尺寸图像的输入。因而文章的网络结构为:
2.1 Siamese encoder
编码器部分的输入是4通道的,采用的是一个Siamese的结构。由于输入是4通道的,因而文章对这个多出来的通道在backbone的第一个卷积上增加了一个filter(使用的是随机初始化)。
Global convolution block
这一部分首先是将编码器输出的两组数据流进行concat,之后就经过这个模块了。为了克服卷积操作自身带有的局部特性,文章将卷积核进行设计,即是采用 1 ∗ k + k ∗ 1 1*k+k*1 1∗k+k∗1与 k ∗ 1 + 1 ∗ k k*1+1*k k∗1+1∗k的组合,其中 k = 7 k=7 k=7,之后经过一个残差模块输出,这里卷积的channel数目都为256。
Decoder
这里的decoder采用的是逐stage进行特征优化的策略,左后输出的分割结果是原始输入图像的 1 4 \frac{1}{4} 41,这里对应的卷积核channel也是256。
2.2 两阶段训练模式
为了缓解分割数据的不足,文章使用数据增广的形式,扩充训练数据集,其扩充的策略可以归纳为:
- 1)对于一对图像及其mask,这里使用诸如旋转/缩放/颜色变换等进行增广;
- 2)对于一对前景背景组合,通过将前景在背景下进行变换进行数据增广;
文章提出的两种数据增广策略见下图3所示:
完成在合成数据集上的训练之后,文章将其迁移到真实的视频数据上进行finetune。为了模拟实际测试场景中的累计误差,并尽量将其克服,文章将Back-Propagation-Thoutgh-Time(BPTT)引入到训练中,从一个视频序列中随机抽取连续的N帧送入网络,从而有了新的训练策略,见下图4所示(文章所用的BPTT,与RNN中的BPTT算法并不一致,具体请参考给出的参考代码):
其核心的代码如下,就是累加求和满足对应的step进行反传更新:
for f in range(0, num_bptt - 1):
# 使用前一桢的mask与前一桢的feature预测当前帧,返回当前帧mask与feature
output, ms = Propagate_MS(ms, all_F[:,:,f+1], all_E[:,0,f])
all_E[:,0,f+1] = output.detach() # 累加mask
loss = loss + criterion(output.permute(1,2,0), all_M[:,0,f+1].float()) # 计算损失
counter += 1 # 损失累加,用于计算平均梯度
if (f+1) % args.bptt_step == 0: # bptt结算step,每隔step次结算一次
optimizer.zero_grad()
loss.backward(retain_graph=True)
optimizer.step()
output.detach()
if f < num_bptt - 2: # 还能迭代的话清零
loss = 0
counter = 0
if loss > 0: # 结算余下的损失并反传
optimizer.zero_grad()
loss.backward()
optimizer.step()
2.3 Inference
在使用文章的方法进行多目标预测有两种思路:
- 1)对于视频中的目标分别进行一次分割,之后再将这些分割组合起来,对于分割的每个像素点位置按照输出的最大概率选择标签;
- 2)使用winner-take-all方法,它是探索使得分割实例不相交的约束,在每次预估的时候将非极大实例区域的概率设置为0,这样将不可避免丢弃很多有用信息;
文章基于上面提到的两点,提出了softmax aggregation的方法,最后每个像素点的概率被归一化为:
p i , m = σ ( l o g i t ( p i , m ^ ) ) = p i , m ^ / ( 1 − p i , m ^ ) ∑ j = 0 M p i , j ^ / ( 1 − p i , j ^ ) p_{i,m}=\sigma(logit(\hat{p_{i,m}}))=\frac{\hat{p_{i,m}}/(1-\hat{p_{i,m}})}{\sum_{j=0}^M\hat{p_{i,j}}/(1-\hat{p_{i,j}})} pi,m=σ(logit(pi,m^))=∑j=0Mpi,j^/(1−pi,j^)pi,m^/(1−pi,m^)
其中, σ , l o g i t \sigma,logit σ,logit代表softmax与logit函数, p i , j ^ \hat{p_{i,j}} pi,j^代表分割目标的输出概率, m = 0 m=0 m=0代表背景,背景区域的概率是1减去融合分割前景的概率。
3. 实验结果
DAVIS-2016:
DAVIS-2017:
还没有评论,来说两句吧...