单目标跟踪算法:SiamRPN++

原文链接——SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks

写在前面:这篇文章提出的算法可以说是比较经典而且效果比较不错的一种单目标跟踪算法了,在最初的一篇基于孪生网络(Siamese Network)的单目标跟踪算法("Fully-Convolutional Siamese Networks for Object Tracking")的基础之上加入了目标的边框(bounding box)回归。经过我自己的实践,效果可以说是十分优秀,但仅限于短时跟踪,长时跟踪可能还是不太行。

目录

1 摘要

2 严格的不变性?

3 SiamRPN++

3.1 网络的输入 

3.2 网络结构

3.2 网络的输出

3.3 网络的训练

3.4 网络的预测


1 摘要

从题目就可以看出,这篇文章是最初的单目标跟踪论文"Fully-Convolutional Siamese Networks for Object Tracking"的改进版本,主要是因为之前的这篇论文确实效果不咋地,但是它的想法(使用孪生网络)可以说是开创性的。而本片文章的主要贡献可以概括为以下几个方面:

  • 论证了之前的"Fully-Convolutional Siamese Networks for Object Tracking"论文效果不好的具体原因
  • 提出了一种新的跟踪算法SiamRPN++和Depth-wise的卷积模式,可以在不损失精度的前提下节省算力,而且参数量也比较少。在当时该算法拿到了单目标跟踪最好的成绩。

2 严格的不变性?

本文通过实验验证了"Fully-Convolutional Siamese Networks for Object Tracking"这篇(第一个提出)基于孪生网络的单目标跟踪效果不好的原因——严格的不变性。这样说好像很抽象,但是只要稍微看一看"Fully-Convolutional Siamese Networks for Object Tracking"这篇文章在训练之前对数据预处理的部分就可以知道,它会将数据集中的图片进行一个crop操作,使得crop后目标位于图片的正中央(这样做我认为应该是为了方便训练时计算损失函数),如下图。所以,严格的不变性指的就是严格地将目标放在图片正中央去进行训练。

 回到SiamRPN++这篇文章,这篇文章在上面同样的crop基础之上,对图片进行了随机的平移,最后证明了在一定的范围内进行随机移动,可以增强网络跟踪的性能。下图就是本文作者的实验结果,横坐标是随机偏移的范围(以像素为单位),纵坐标是单目标跟踪常用的EAO评价指标(越高越好)。

3 SiamRPN++

diss完了别的算法之后,该提出本文自己的算法了。首先来看看SiamRPN++的网络结构。(后面用结构图指代下面这张图)

3.1 网络的输入 

不要慌,我们一点点来分析。先看上面结构图中的虚线左侧,绿色的正方形Target是指crop之后的目标图片,其大小是127*127*3,它作为输入输入到绿色主干网络中。假如我们要跟踪一只鸟,下面这张图就是一个Target:

 而在训练过程中,Search指的是视频其中一帧的整个画面,它的大小是255*255*3,同时它也作为输入输入到紫色主干网络中,下面这张图就是一个Search:

上面的Target和Search都是经过crop操作的,具体做法和"Fully-Convolutional Siamese Networks for Object Tracking"这篇文章介绍的方法差不多,只是加了随机的偏移。

3.2 网络结构

知道了输入是什么之后,应该不难看出结构图中那么叠起来的多立体方块就是主干网络,上下两个主干网络构成一个孪生网络。该算法在网络某三层的输出中各进行了一次Siamese RPN操作,如下图:

 而Siamese RPN具体的操作就是结构图虚线的右侧:

首先别慌,请接着往下看。绿色的F(Z)和紫色的F(X)分别代表该颜色主干网络某一层的输出(还记得3.2的开头我说了“该算法在网络某三层的输出中各进行了一次Siamese RPN操作”吗?),上图倒数第二行的adj_n指的是一次卷积操作,他的目的是将绿色的F(Z)和紫色的F(X)的通道数压缩到256,然后就是关键也是本文的一大精髓了,DW-Corr(Depth-wise Cross correlation),具体操作见下图:

 看不懂没关系,我来简单解释一下。拿adj_1和adj_2举例,adj_1和adj_2他们两个不是已经把F(Z)和F(X)的通道都压缩到256了吗(假设输出分别为F'(Z)和F'(X)),这时,以F'(Z)的第i个通道为卷积核,对F'(X)的第i个通道进行卷积运算(i=1,2,3,...,256),得到的输出仍然为256个通道。以上我讲的就是对应DW-Corr_n的操作步骤。

最后DW-Corr_n的输出经过Box Head(或者Cls Head)运算(本质上也是卷积操作),得到了B_{l}S_{l},关于他们两个是什么先放一边,一会儿解释。

还记得我说过“该算法在网络某三层的输出中各进行了一次Siamese RPN操作”吗?没错,以上的操作总共进行了三次,每次的输入(绿色的F(Z)和紫色的F(X))都是来自主干网络的不同的层。也就是说,B_{l}S_{l}也一共有三组(B_{1},B_{2},B_{3}S_{1},S_{2},S_{3}),最终的 B由 B_{1},B_{2},B_{3}加权求和得到,同理,SS_{1},S_{2},S_{3}加权求和得到,而且,他们加权求和的系数也是网络可以学习的。

B对应结构图中的BBox Regression,S对应结构图中的CLS。

3.2 网络的输出

这里详细讲一下B_{l}S_{l}是什么。如果网络的输入只有一组图片(也就是batchsize为1),那么B_{l}为25*25*(4*k)的张量(k在作者的代码中取的是5),25*25指的是将原图(Search)分成25*25个小格,然后k指的是每个小格内生成k个锚框,4则指的是锚框的坐标(x_{min},y_{min},x_{max},y_{max})

(这里理解成坐标就好,但实际上应该是锚框坐标的修正量)

讲到这里,应该反应过来了吧,这个和YOLO一模一样。

然后S_{l}为25*25*(2*k)的张量,和上面唯一不同的是“2”。2指的是每个锚框中包含物体的不包含物体的置信度。其实还是和YOLO很类似。

3.3 网络的训练

说实话,有点复杂,感兴趣的看看官方的代码吧:STVIR/pysot: SenseTime Research platform for single object tracking, implementing algorithms like SiamRPN and SiamMask. (github.com)https://github.com/STVIR/pysot

简单来说,就是使用了一个L1损失来计算锚框的偏移量,和一个交叉熵损失来计算置信度的损失。 

3.4 网络的预测

 首先拿到一段视频,需要人工画出第一帧中需要跟踪对象的边框,将边框里的内容进行crop操作,然后作为结构图中的Target,输入到网络中。注意,Target在整个视频的跟踪中是不会改变的。

从第二帧开始,会将上一帧的目标所在位置周围的图像作为结构图中的Search输入到网络中(这里和训练部分是不一样的,训练的时候是将这一帧的整个图片进行crop),然后网络就会输出对应的BS,找到S中包含物体置信度最大的那个边框,作为这一帧预测出来的结果,也就是这一帧目标所在的位置。

然后第三帧重复上面的计算,以此类推,直到遍历完整个视频。

 Over

猜你喜欢

转载自blog.csdn.net/fuss1207/article/details/124217167