目标跟踪《三》--- SiameseFC论文笔记

目标跟踪《三》--- SiameseFC论文笔记

前言及abstract

之前的目标跟踪器大多利用的是在线学习的方式,这一点也可以理解,因为要跟踪的东西事先并不知道,很难弄一个统一的tracker适合所有的物体的跟踪,但是在线学习的方式限制了学到的模型的丰富性(因为他针对不同的目标,在不停地更新,并不像人一样,即便是没有见过的东西,只要看了之后也能够对其跟踪.(可能人也有更新学习的过程,毕竟见了个新东西,会在大脑中停留一下)),此外不断地更新参数会降低跟踪的速度,所以这篇文章就尝试能不能离线学习好一个tracker,然后tracking的时候不需要更新参数,这样速度上或许就快了些,最终的结果也表明效果也还是很不错的,在多个benchmarks上都达到了最好。

贡献

  • 没有用之前在线学习的方法,而是采用离线学习的方法集中设计一个strong embeddings,

  • 提出了一个fully convolutional Siamese network

  • 为后面类似的网络结构的提出做了基础和借鉴

困难和要改善的地方

  • 如果目标的size(离摄像头的距离远近)发生太大变化的时候效果不太好

  • 如果有太多相似的目标的时候效果不太好(比如一堆鸟中要跟踪其中的一只鸟)

  • 如果blur程度发生了太大的变化的时候不太好,比如上一桢的时候正常,下一桢的时候一束强光打过来了,这时候不太好

  • 目标本身发生了太大的形变的时候,比如上一桢是立身,下一桢是蹲着了,或者背过去了。

其实桢与桢之间的时间是非常短的,不过还是有可能发生上面的情况。

目标跟踪的做法介绍

  • 其于相关滤波做的

KCF等。

paper中把进行不断地更新和fine-tune的办法称为shallow的办法。使用shallow的办法的缺点是

  1. 不能够充分利用end-to-end的优点

  2. 利用比如sgd等优化算法达到好的效果的算法并不能够做到实时

  • 本paper的做法

把跟踪问题作为一个similarity learning problem 进行离线学习,相当于是学到的是找相似的能力,相当于是找与模板之间的相似的东西,而之前了解到的工业缺陷检测中模型学到的是找不同的能力,即与标准的模板之间的不同的地方就认为是缺陷.

  • 这个paper中的大致做法
  1. 找模板图exemplar imgsearch img这个pair

  2. 提base的特征,这里用的比较简单,是alexnet

  3. exemplar提到的特征作为卷积核和search img提到的特征去做卷积

其实这个卷积就像是在之前blog中写的那个互相关的公式,它表达的意思就是这两个东西在不同时间的相似程度,而现在则是在不同的区域的相似程度.

  1. 卷积之后得到的是一个response map,上面的值是0,1,然后去和gt_respons_map去做logistic cross entropy并平均.这个卷积是个普通的运算,是不需要学习的,然后按照paper上公式(2)写的,还要加上一个bias项.面且为了解决类别不平衡的问题,在做loss的时候还加了weights.比如有10个正样本,100个负样本,那么正样本的Loss贡献上有multiply0.1, 而负样本的上面要multiply0.01

avator

整个结构如图所示

avator

其他细节

  • 网络输入的大小

paper上写的输入的z是127, x是255. channels是3.

  • 网络输出的大小

paper上写的输出是z是6,x是22,channels是128. 注意输入和输出都是方形的.输出的response_map的大小是22-6+1=17.

  • 输入是如何制作的
  1. z的制作

将target的bbox进行一个填充和resize,使其面积为127*127其实shape就是127,127,使得target在127,127的中间部分.具体是设原target的bbox的大小是w,h,然后设填充为 p,则利用公式s(w+2p)*s(h+2p)=A,来算出scale量s, 其中的2p = 0.5(w+h), 这样不管原来的target是比127要大还是比127要小,都可以resize到127, 而且target的部分在resize的时候并不会失真(长宽比例发生变化),面且使得target总能在resize之后的中间部分.

看几个样例图

avator

填充的部分是以图像像素的均值填充的,即每个channel上的均值.

需要注意的是这对训练样本可能并不是来自于同一桢,实际上我觉得这正是这个算法能够有效的原因。这一点等会儿再说,目前z的制作基本上结束了.当然还有一些其他的操作,都是比较通常的做法,比如减均值除以标准差.

  1. x的制作.

基本上和z的制作是一样的,有一点不同的是,z的制作的过程中因为要从原图上crop出一部分出来,用的是CenterCrop,即以target的中心作为crop的中心向外进行crop,而x的制作过程为了增加丰富性加了一个中心的随机移动,这也是augment的一种方式,即是在原中心的一个附近随机取了一个点作为crop的中心。

  • gt是如何制作的

刚才看到网络输出响应的大小是17-17,所以gt也是那么大的,gt的制作公式如下

avator

即相当于是离目标中心近的部分的gt是1,远的地方是-1,其中k是网络的stride.所以gt相当于是个mask.

  • 训练的pair的选择

训练的时候,target z是在所有的桢中随机选出来的,比如选的target其桢的id是200,然后,以target的idx 为中心,向上向下各取一个固定数量的桢数,比如100,注意有可能越界,然后,instance的x就是从[min_index, idx-1], [idx+1, max_index]之间随机取出来的. 之所以在target的附近取,估计是因为离的桢数太远的话,差别会有些大,导致gt不太准确.

如何推理的

到了最难的部分了,模型训练好了之后,如何进行推理,即如何从响应的值去推算出目标的位置在哪里。大致的过程是这样的:即根据响应map中分最高的那一个就认为是目标所在的大致区域,根据它相对于target的位移,然后换算到原图上的位置,这样就得到了当前桢的跟踪结果,然后更新target,也就是说当前桢的跟踪结果需要用上一桢的结果来算,实际上网络预测出的部分提供的可以理解成是相对于上一桢跟踪结果的位移.

但是细节有很多,比如说因为目标摄像头的距离可能近可能远,所以在推理的时候用了多个scale,并对这些不同的scale的预测结果给一定的惩罚penalty才得到最终的得分,所谓的penalty就是乘上一个小于等于1的系数,最终要得到在这些不同的scale中分最高的那个位置,并且利用scale的信息将其变换到原图中的位置,scale的信息有两个,一个是这里的scale,另外一个是得到网络输入的时候的那个scale。

在线学习的时候会不断地更新网络参数,而在这里并没有,这里每一次并没有把target给送入网络,target只是在训练的时候进入了网络,在推理的时候,是用当前的桢去得到响应map,但是这中间会不断地更新target的位置和大小(也就是bbox),更新的时候要用到上一桢的跟踪结果.

Thoughts

  • 推理的时候用了多个scale的images,而且每个都要走一遍网络,有些耗时,这方面应该可以改进,后面siameseRPN就对此做了些改进.

  • 人在找目标的时候能够一下子从一张图上快速的发现有没有目标以及确定目标的具体位置,这个网络的输出的response_map就相当于是给了目标位置的大致的search region, 但是这里的输入是在上一桢的跟踪结果附近产生的,或许可以考虑把整张图feed进去,让网络学到从整张图中找出目标的能力.

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦