DaSiamRPN、SiamRPN++论文阅读

文章目录

  • 前言
  • 1、DaSiamRPN
  • 2、SiamRPN++


前言

  本文分析下近几年比较火的几篇基于anchor的目标跟踪论文:Siam系列,其中包括SiamRPN、DaSiamRPN、SiamRPN++,SiamRPN分析请翻看我之间的文章有详解,后面的分析仅代表个人理解。
  SiamRPN论文链接
  DaSiamRPN论文链接
  SiamRPN++论文链接


1、DaSiamRPN

  在这之前孪生网络跟踪算法的问题有如下

  1. 特征提取网络提取的特征只能区分前景和非语意背景,这里解释下非语义背景,可以理解为不含有用信息的背景,比如一张图像上有二人个(A、B)和一辆汽车C,跟踪的对象是A,前景就是A,B和C就是包含具体语义背景。当图像存在类间干扰B时跟踪器很容易发生偏移。
  2. 训练数据集的物体类别较少,不足以训练具有泛化能力的特征表达,SiamRPN使用vid(20 classes)和ytbb(30 classes)两个训练集,极端情况下,跟踪器漂移到汽车C处。
  3. 大部分跟踪器都是短期跟踪,短期跟踪从另一种角度讲是跟踪过程中,目标总是出现。

  针对这三个问题,一一来看下DaSiamRPN是如何解决的

  1. 提取的特征只能区分前景和非语言背景的原因是:训练时语义背景和非语义背景样本极度不平衡,大多数anchor是非语义的,如下图所示,图像中红色是非语义背景,绿色是语义背景,可以看到样本多不平衡增加具有语义背景的训练样本。DaSiamRPN、SiamRPN++论文阅读_第1张图片所以,DaSiamRPN在训练过程中增加含有语义背景的训练样本,增加的训练样本有两类,类间语义背景和异类语义背景,如论文Fig.2。DaSiamRPN、SiamRPN++论文阅读_第2张图片

  2. 为了解决训练数据集类别少的问题,DaSiamRPN引入了两个新的数据集,coco和det,极大地扩展了正样本对的类别,如下图,这些类别在实际应用中,几乎不现实,但使用它们来训练网络可以有效增强特征表达的泛化能力。并且通过对数据集增强技术(平移、旋转、运动模糊等),可以使用检测数据集静止的图像生成跟踪领域动态的图像。DaSiamRPN、SiamRPN++论文阅读_第3张图片通过1、2两部的训练策略,模型的泛化能力已经够好了,能够排除一定的类间干扰,但是对一些及其相似的物体(类似下图情况),仍然很难区分。DaSiamRPN、SiamRPN++论文阅读_第4张图片所以DaSiamRPN提出了一种感知干扰物增量学习(Distractor-aware Incremental Learning),可以有效地将泛化的特征表示转移到某特征视频领域,而不仅仅使用以往Siam跟踪器的度量方式。先回顾下以往的度量方式,表达式如下,简单使用互相关来度量相似度,顺便再贴张SiamRPN的图方便分析。在这里插入图片描述DaSiamRPN、SiamRPN++论文阅读_第5张图片如论文所述,先使用NMS策略得到一些不重叠的proposals(proposals必定也存在待跟踪目标),当图像中出现相似物体时,这些proposals必定存在干扰物体,然后选择n个大于给定阈值的干扰proposals,这个阈值是根据相关值得来的在这里插入图片描述函数f(z,di)表示z与di的互相关,zt是第t帧选择的目标,第1帧的话它就是groundtruth,最后,得到了n个proposals。
      接着使用distractor-aware objective function对这k个相似性最大的proposals重新排序在这里插入图片描述
    最终选择的对象标记为q,这个公式可以看出,当它取最大值时,也就是目标与某个proposal的相似值减去某个proposal与干扰物的相似值的值最大,即前者尽可能大,后者尽可能小。
      但是上式的计算复杂度和内存使用量增加了n倍,由于互相关是线性因子,所以作者使用结合律减小计算量
    在这里插入图片描述
    有了这种策略,就可以在每一帧跟踪时学习一个增量,下一帧跟踪时就可以利用前一帧的增量信息来找到准确目标,如下式,同时考虑了T帧的增量信息,类似于常用的模板更新策略。在这里插入图片描述

  3. DaSiamRPN提出了一种长期跟踪策略,这种策略比较简单,但也是得益于DaSiamRPN才能实现,当跟踪失败时,加大搜索图像区域即可。重点在于,如何判断失败,我们人当然肉眼可见,但跟踪器如何得知呢?SiamRPN就无法使用该策略,因为在跟踪过程中,一直选择相似值最大的proposal作为跟踪,即使在视野消失的情况下,这个值仍然会很高,也就是说,SiamRPN的特征表示不具有指向性,简而言之,就是跟踪器在跟踪某物体时并不知道它是什么。而DaSiamRPN由于训练和测试的一系列优化,提取的特征具有指向性,比如要跟踪的目标是人,那么他就不会漂移到其他类别位置上去。

2、SiamRPN++

  SiamRPN++的分析流程是提出问题——>解决
问题
  之前Siamese跟踪器都是利用AlexNet等较为浅层的网络来提取特征,在使用深层网络,如resnet等时,性能反而下降。论文给出了造成性能下降的原因是深层网络不具备空间平移不变性,而且跟踪任务不同于分类,浅层特征有助于目标的精确定位而不仅仅使用深层语义特征取识别。
  造成深层网络平移不变性的主要因素是卷积过程中padding的影响,平移不变性可以这么理解: 原 始 图 像 中 目 标 相 对 于 图 像 中 心 的 位 移 ∗ 网 络 步 距 = 特 征 图 中 目 标 相 对 于 特 征 图 中 心 的 位 置 原始图像中目标相对于图像中心的位移*网络步距=特征图中目标相对于特征图中心的位置 =而包含padding操作的卷积+池化下采样的组合会破坏这种性质,padding会在特征图上引入其他信息(0填充引入的值为0),当这些信息大于附近的像素时,那么最大池化下采样之后的网络传播将会使用padding的信息,而不是原图有用的信息,这样就会造成最终得到的特征图边缘可能出现大量0的值。论文对该问题基于了证明,证明结果如下所示:DaSiamRPN、SiamRPN++论文阅读_第6张图片直接看左侧图就行,可以看到左侧很大一部分的信息都是填充的无用信息。
解决

  1. 提出了一个简单而有效的采样方式,打破了深度网络深层的空间限制。如上图所示,只是在训练过程中简单对目标进行随机的位移,达到收敛后,测试出来的效果就很好。中间图的随机位移范围(Rand Shift Range)是-64~16,右侧图是-32 ~32,可以从图中直观看到这种方式的有效性,那么理论上该如何解释呢?SiamRPN++在训练过程中使用这些策略,使得目标的位置不在图像中心,那么达到收敛后模型就会对padding具有很大的鲁棒性,因为从本质上讲,padding操作也会使目标发生位移。在进行了一系列范围取值后在VOT2018数据集上实验,如下,最终SiamRPN++选择的shift范围是(-64,64)DaSiamRPN、SiamRPN++论文阅读_第7张图片

  2. 有了上述简单而有效的策略,就可以使用resnet50等深层网络结构作为特征提取了,并且在从基础上,SiamRPN++提出了一种特征整合结构给互相关操作,这样可以丰富相似度度量的特征使用量,而且在理论上,resnet50使用这种整合策略比浅层网络更有效,因为resnet50整合的不同层信息的感受野差变化很大,换句话讲,不同层的特征信息差异更大、更丰富。接下来结合论文给的框架图和代码进行分析DaSiamRPN、SiamRPN++论文阅读_第8张图片从图中,可以看出融合了3层的特征,具体输出形式如代码中注释

        def forward(self, template, detection):
            zf = self.features(template)  #[8,512,15,15] [8,1024,15,15] [8,2048,15,15]
            xf = self.features(detection) #[8,512,31,31] [8,1024,31,31] [8,2048,31,31]
            zf = self.neck(zf) #3个[8,256,7,7]
            xf = self.neck(xf) #3个[8,256,31,31]
            cls, loc = self.head(zf, xf) #[8,10,25,25]   [8,20,25,25]
    

    这里仅看self.features即可,可以看到输出了3个大小相同的feature map,然后将它们融合,具体的融合公式如下:DaSiamRPN、SiamRPN++论文阅读_第9张图片其中 β \beta β α \alpha α是融合权重,个数图融合层数一致,为3,直接嵌入网络中在训练时学习。S和B是分类回归和边界框回归,即DaSiamRPN、SiamRPN++论文阅读_第10张图片而不是feature map,融合的对象是不同层feature map得到的B和S。

  3. SiamRPN++还提出了Depth-Wise的分组相关操作,该相关操作提出的原因在于SiamRPN上下通道的参数不平衡,上通道参数太多导致训练学习困难,论文给出了SiamRPN参数量上下通道的参数量DaSiamRPN、SiamRPN++论文阅读_第11张图片为了克服这个缺陷,Depth-Wise分组相关操作由此提出。下面以代码的形式讲解SiamFC、SiamRPN、SiamRPN++所使用的互相关。

    #  from pysot : https://github.com/STVIR/pysot
    def xcorr_fast_siamfc(x, kernel):
    #x.shape=(8,256,22,22) kernel.shape=(8,256,6,6)
        """group conv2d to calculate cross correlation, fast version
        """
        batch = kernel.size()[0] #6
        pk = kernel.view(-1, x.size()[1], kernel.size()[2], kernel.size()[3]) #(8,256,6,6)
        px = x.view(1, -1, x.size()[2], x.size()[3]) #(1,256*8,22,22)
        po = F.conv2d(px, pk, groups=batch) #(1,8,17,17)
        po = po.view(batch, -1, po.size()[2], po.size()[3]) #(8,1,17,17)
        return po
    def xcorr_fast_siamrpn(x, kernel):
    #x.shape=(8,256,20,20) kernel.shape=(8,256*2k,4,4) 对应*4k回归类似分析
        """group conv2d to calculate cross correlation, fast version
        """
        batch = kernel.size()[0] #8
        pk = kernel.view(-1, x.size()[1], kernel.size()[2], kernel.size()[3]) #(8*2k,256,4,4)
        px = x.view(1, -1, x.size()[2], x.size()[3]) #(1,256*8,20,20)
        po = F.conv2d(px, pk, groups=batch) #(1,8*2k,17,17)
        po = po.view(batch, -1, po.size()[2], po.size()[3]) #(8,2k,17,17)
        return po
    def xcorr_depthwise(x, kernel):
    #x.shape=(8,256,31,31) kernel.shape=(8,256,7,7)
        """depthwise cross correlation
        """
        batch = kernel.size(0) #8
        channel = kernel.size(1) #256
        x = x.view(1, batch*channel, x.size(2), x.size(3)) #(1,8*256,31,31)
        kernel = kernel.view(batch*channel, 1, kernel.size(2), kernel.size(3)) #(8*256,1,7,7)
        out = F.conv2d(x, kernel, groups=batch*channel) #(1,8*256,25,25)
        out = out.view(batch, channel, out.size(2), out.size(3)) #(8,256,25,25)
        return out
    

    SiamRPN与SiamFC的相关操作其实是一样的,只不过SiamRPN相关kernel的通道数更多,代码假设进入相关之前就已经增加了通道数,注释中给出了明确的推导过程,depthwise最后的结果是(8,256,25,25),然后在经过网络层的调整之后变为(8,10,25,25),就是论文所要得到的分类feature map。最后,对两者作一个直观的对比验证。

    if __name__ == '__main__':
        z = torch.randn([8,256,6,6])
        x = torch.randn([8,256,22,22])
        out = xcorr_fast(x,z) #(8,1,17,17)
        out_depthwise = xcorr_depthwise(x,z) #(8,256,17,17)
    

  最后,再来看一下SiamRPN++的实验结果分析DaSiamRPN、SiamRPN++论文阅读_第12张图片  Finetune表示是否采用离线训练的方法,采用DepthWise性能提升有:VOT2018 0.414-0.390=2.4% ;OTB2015 0.696-0.684=0.8%。

你可能感兴趣的:(object,tracking,目标跟踪)