[SOT]Siamese Mask论文及代码解析

 2024-02-09 03:02:45  阅读 0

0. 前言

前几期我们阅读了单目标检测(SOT)领域的一些成果的论文并分析了代码,总结如下:

本文将根据代码和论文详细分析Mask,进一步了解SOT中使用的家族重要成员之一,即Mask。

那么我们先放一段官方视频吧。

从视频中可以看出,我们只需要给出视频第一帧中的目标位置即可。 更准确地说,我们使用box来框定目标位置,而不需要手动遮罩。 然后模型(Mask)就可以在后续帧中跟踪被框出的物体,并实时进行。 顺便说一句,它可以提供盒子的实时旋转。

看完上面的视频,我们不禁产生以下疑问:

既然我们已经考虑过了,为什么不看看论文和代码呢? 论文和代码链接如下:

论文:/abs/1812.05050

代码: //

本文将通过以下两个方向来分析论文,即

1. Mask网络结构分析

论文给出了简化版的Mask网络结构图。

怎么复现论文代码_找论文代码_如何获取论文中的代码

总体结构主要由以下几部分组成:

粗略的()流程如下:

(1)改进-50作为特征提取网络

更具体地说,该论文提到

。 对于我们的 ,我们使用 -50 直到第四阶段的最后一层作为我们的 f_{\theta} 。 为了获得高,我们使用 1 到 8。我们使用 字段。 在我们的模型中,我们向 f_{\theta} 添加一个层(1x1 conv with 256 )

可以看到,论文对-50的网络结构进行了一些改进,并将其用作特征提取网络f_{\theta}。 关于使用-50作为特征提取网络导致平移不变性被破坏的问题,我们在RPN++网络的分析中已经解释过了。 如果您有兴趣,可以看一下。

这里简单说一下,论文中提到的:

,我们和。 ,我们(直到 \pm 8 )和(2^{\pm1/8} 和 2^{\pm1/4} 对于 和 )

以上是为了缓解-50等(同)网络造成的平移不变性破坏的问题。

RPN++解析过程中已经给出了改进后的-50代码。 为了不占用太多篇幅,这里就不多说了。 (其实只是代码中没有找到而已)

(2)深度交叉获得的图

这里我们还是借用解析RPN++时使用的Depth-Wise Cross-,如下图c所示。

如何获取论文中的代码_怎么复现论文代码_找论文代码

核心思想是分组卷积,在代码实现时可以使用该参数进行设置。 代码实现如下:

def xcorr_depthwise(x, kernel):
    """depthwise cross correlation
    """
    batch = kernel.size(0)
    channel = kernel.size(1)
    x = x.view(1, batch*channel, x.size(2), x.size(3))
    kernel = kernel.view(batch*channel, 1, kernel.size(2), kernel.size(3))
    out = F.conv2d(x, kernel, groups=batch*channel)
    out = out.view(batch, channel, out.size(2), out.size(3))
    return out

可见代码

out = F.conv2d(x, kernel, groups=batch*channel)

参数用于.

具体参数设置读者可以在CSDN上搜索。 比较简单,不再详细描述。

分组卷积的优点是可以显着减少模型的参数数量,提高模型的运行速度,特别是在计算能力不是很强的移动设备上。

(3) 三分支或二分支头

关于模型的head分支,文中给出了两种类型,即

这里我们只分析三个分支(其实两个分支和三个分支是类似的)。

一般结构已在第一张图中给出。

怎么复现论文代码_找论文代码_如何获取论文中的代码

论文中提到:

在 中,在我们的例子中,通过深度交叉 f_{\theta}(z) 和 f_{\theta}(x) 到 (17x17) RoW 之一。 ,任务的 h_{\phi} 是两个 1x1 ,一个是 256,另一个是 63^{2} (2)。

粗略的意思是,通过上面Depth-Wise Cross得到的 map,我们以此 map作为输入,通过两个1x1的卷积将 map的维度增加到63^{ (h_{\phi}) 2} . 然后我们沿着维度所在的dim将17\\^{2}特征图分成17x17行。

该论文随后提到:

RoW 中的每个像素都在 x 中,因此可以看到其在 x 中的视图,这看起来像(例如最后一行 4),通常为 。

这意味着希望得到的17x17 RoW中会有一个RoW,它包含了mask的所有信息。 然后通过这个RoW中的信息(维度为1\\^{2}),映射回原始图像大小,然后得到物体的mask信息。

然而,这种方法的准确性不是很好。 当我们学习语义分割的一些模型(如FCN、U-Net等)时,我们会考虑不同感受野特征图的融合来提高分割的准确性。 作者的论文中还提到:

为了获得更多掩模,我们使用了[44],其中低和高使用由和跳过组成。

即通过上采样和跳跃来提高分割精度。 文章附录中还给出了结构图。

从结构图可以看出,该方法并没有将得到的map 1x1的维度增加到63^{2},而是直接选择最好的RoW进行直接上采样。 这里选择反卷积进行上采样。 然后与中间层的特征图不断融合,得到高精度的分割模型。

在Mask中,作者使用mask来获取旋转后的box,即先获取mask,然后根据mask选择最小的外部矩阵作为其box。 报纸上是这么说的。 ,

我们从掩码 (3) 中将三个框转换为:(1) axis- (Min-max)、(2) (MBR) 和 (3) 用于 VOT-2016 [26] (Opt) 中的框。

作者提到他考虑了三种方法,结果如下图所示

找论文代码_如何获取论文中的代码_怎么复现论文代码

红框是第一种方法(轴对齐),绿色的是MBR,蓝色的是。 从图片上看,我个人觉得绿色的比较好。

至此,Mask的结构已经分析完毕。

2.屏蔽掉网功能设置

mask网络丢失功能设置也比较简单。 这里我们只分析mask损失函数。

论文中给出了损失函数,如下:

怎么复现论文代码_如何获取论文中的代码_找论文代码

论文中对此进行了解释

找论文代码_怎么复现论文代码_如何获取论文中的代码

即在训练过程中,每个RoW(总共17x17 RoW)被标记为\pm1,即公式中的y_{n}。 这个n是RoW的编号ID。

因为这是一个掩模分割任务,所以掩模的真相是与原始图像大小相同的二值图像(大小为w\times h,每个像素的值为1或-1,用c_{ ij} ),同时模型的mask分支的输出大小也是w\times h,每个像素的值用m_{ij}表示。

然后是损失函数

怎么复现论文代码_如何获取论文中的代码_找论文代码

含义如下:

代码实现为:

loss = F.soft_margin_loss(p_m, mask_uf)

就叫损失吧。

至此,mask loss的解释也结束了。

三、总结

在这篇文章中我们对Mask进行了详细的分析,本文更侧重于论文的解读。 关于代码的分析,我只是扫了一眼,没有仔细看。 下面的论文分析应该更多地侧重于对论文的理解。 代码只是一个辅助工具。 否则,总会有大量的代码复制。 我自己回顾一下会很头疼,哈哈。 至此,我们就解释完了SOT任务中的一些重要网络。 后期我们可能会进入多目标检测领域的MOT研究。

标签: 论文 解析 分支

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码