这篇文章是北航大四学生写吧,好像,先膜为敬。
每每到此安慰一下自己,自己年轻,正是好好学习,轻轻松松发文章的好时候(雾。。。)
不过看了这篇文章还是有很多感想倒是真的
以及以后应该刚开始看论文的时候就开始写博客,感觉自己好多想法都没能记下来
其实说实话这个论文上了CVPR,虽然性能吊打在座所有,但是才得了个spot-light
主要是因为这个Siamese-RPN没有什么很大的、根本上的创新点
1.We propose the Siamese region proposal network(Siamese-RPN) which is end-to-end trained off-line with large-scale image pairs for the tracking task
2.During online tracking ,the proposed framework is formulated as a one-shot detection task, which can refine the proposal to discard the expensive multi-scale test.
3.It achieves leading performance in VOT2015, VOT2016 and VOT2017 real-time challenges with the speed of 160 FPS, which proves its advantages in both accuracy and efficiency.
简单翻译一下就是,我们拼出来了个新网络。然后我们把tracking问题当成一个单样本检测任务。最后我们拼出来的网络吊打各位。
1.其实我觉得把tracking问题当成单样本检测问题,这个做法确实是很取巧的。并且这个和作者把RPN网络引入有直接关系。但是这两个东西还是有区别的,我觉得这个设定(tracking当单样本检测),既是Siamese-RPN的创新也是局限。
2.还有一个点勉勉强强算是创新,就是他能用上一个贼大的数据集。一般DeepLearning的tracking方法都很难用上大型数据集,大部分都是边追踪边学(这很大程度上是追踪原理引起的)
3.另外论文中介绍相关工作的时候提及了元学习的相关理论(好像只要是可用学习样本较少的方法都会使用元学习的理论,通过学习如何学习,来提高学习效率弥补样本不足)。但是同时指出元学习现在一般都应用在二分类问题上,用在tracking上面的比较少,并且效果一般。Siamese-RPN的网络架构里面也没有体现他们应用元学习的地方,可能以后继续研究的时候会考虑加上元学习吧
首先就人的视觉跟踪而言,人眼去跟踪一个目标,往往是目不转睛,精力集中到局部,有的时候甚至到了其他区域发生了什么都不知道的地步。但是单样本检测任务,说白了就是我给你一张图片,然后让你在这个图里面给我找出来我要的东西。
一般情况下这两个任务差别不大,但是当检测画面中有很多个相似物体的时候麻烦就比较大了,追踪任务应该是能够跟着选定的目标一直走的,但是单样本检测任务只会把所有的匹配结果都列出来(或者列出最相似的那一个),而且我看Siamese-RPN论文中没有对这种情况做特别的说明,所以我估计要是遇到这种情况,Siamese-RPN估计就只能靠那个模板产生的256维的feature map中仅含的一点背景信息做判断,准确率应该很低。
这个问题应该不只是Siamese-RPN有,凡是寻找的时候用到全图的滑动窗口的,应该或多或少都会出现这个问题。主要是Siamese-RPN把这个想法当创新点提出来了,就应该切实的考虑一下这个问题。
然后我说一个想法1
有些追踪方法总是在学习Ground truth,但是实际上Ground Truth在视频中变化不大的话,其实没有那么多好学的,说实话要是学多了还可能过拟合。Siamese-RPN就没有从这个角度想问题,他其实学习的是如何通过和背景与前景相关的特征判断两个物体是否是同一种物体,而不是学习单个物体,他学习的是一种方法。只要能够跳出学习单个物体的tracking方法应该都是可以使用体量大的数据集上训练的
当然这个其实也反映了像Siamese-RPN这种方法的短板,就是因为他就把第一帧拿过来做模板,没有模型更新的部分,因此很可能缺乏对模型的学习。要是跟踪的对象发生了大幅度变化的话(即使这个过程是逐渐的,就是模型是慢慢发生大幅度变化),我觉得Siamese-RPN应该就反应不过来。
我也有点想法,参考想法2
元学习这块我也没怎么做功课,大致看了两个科普博客。我也不是很懂,但是我个人觉得在tracking里面运用元学习够呛,因为要是运用元学习来学习Ground Truth,不同追踪任务的Ground Truth差别那么大,权值预测的不好还可能会添乱。学习匹配方法的话,上面又提出来了可以在大型数据集上训练了,又显得有点鸡肋。
整个网络结构分成两个部分
一个是Siamese网络,主要用来进行图片的基础特征提取
一个是RPN网络,主要用前面提取出来的特征,进一步分析前景背景相关的特征,还进行了一些很像detection的任务
这里作者在论文原文中说他们用的是AlexNet,把AlexNet里面从conv2到conv4的部分都丢掉了,并且为了保证对任意尺寸的图片都能处理,修改了stride,并且没用padding。
然后我查了下AlexNet的结构:
conv1阶段
输入数据:227×227×3
卷积核:11×11×3;步长:4;数量(也就是输出个数):96
卷积后数据:55×55×96 (原图N×N,卷积核大小n×n,卷积步长大于1为k,输出维度是(N-n)/k+1)
relu1后的数据:55×55×96
Max pool1的核:3×3,步长:2
Max pool1后的数据:27×27×96
norm1:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)(这个我也没做功课)
最后的输出:27×27×96
AlexNet另一个创新是LRN(Local Response Normalization) 局部响应归一化,LRN模拟神经生物学上一个叫做 侧抑制(lateral inhibitio)的功能,侧抑制指的是被激活的神经元会抑制相邻的神经元。LRN局部响应归一化借鉴侧抑制的思想实现局部抑制,使得响应比较大的值相对更大,提高了模型的泛化能力。
LRN只对数据相邻区域做归一化处理,不改变数据的大小和维度。
LRN概念是在AlexNet模型中首次提出,在GoogLenet中也有应用,但是LRN的实际作用存在争议,如在2015年Very Deep Convolutional Networks for Large-Scale Image Recognition 论文中指出LRN基本没什么用。
AlexNet还应用了Overlapping(重叠池化),重叠池化就是池化操作在部分像素上有重合。池化核大小是n×n,步长是k,如果k=n,则是正常池化,如果 kconv2阶段
输入数据:27×27×96
卷积核:5×5;步长:1;数量(也就是输出个数):256
卷积后数据:27×27×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu2后的数据:27×27×256
Max pool2的核:3×3,步长:2
Max pool2后的数据:13×13×256 ((27-3)/2+1=13 )
norm2:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
最后的输出:13×13×256
在AlexNet的conv2中使用了same padding,保持了卷积后图像的宽高不缩小。
conv3阶段
输入数据:13×13×256
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu3后的数据:13×13×384
最后的输出:13×13×384
conv3层没有Max pool层和norm层
conv4阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu4后的数据:13×13×384
最后的输出:13×13×384
conv5阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):256
卷积后数据:13×13×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu5后的数据:13×13×256
Max pool5的核:3×3,步长:2
Max pool2后的数据:6×6×256 ((13-3)/2+1=6 )
最后的输出:6×6×256
conv5层有Max pool,没有norm层
然后后面就是全连接层了,所以AlexNet也就剩个第一层和第五层,中间还连不起来。不知道他具体是怎么改的。
有的博客说跟Siamese-fc用的特征提取是一样的,我又去看了下Siamese-fc的特征提取网络
前面的Siamese网络就没什么好说的了,毕竟作用就是个特征提取
首先说明一下RPN网络最开始是用在detection领域中的一个网络。至于说它为什么能用在Tracking领域中,就跟Siamese-RPN中Tracking等价于单样本检测的设定有关,既然是单样本检测,那就是detection,那当然就能用RPN网络啦。
前面的这两个东西分别是模板帧和检测帧提取出来的feature map
这里这样理解feature map,前面的6x6和22x22表示把原图分成了6x6和22x22个区域(有可能有重叠),然后每个区域都就256中不同的指标提取了特征。
然后我们先看RPN网络对模板帧是怎么处理的,因为Siamese-RPN对模板的处理最接近原始的RPN网络
首先看到它把6x6x256的feature map卷了一下,就变成一个4x4x(2kx256)的feature map了
首先根据前面对6x6x256 feature map 的定义,6x6个区域,每个区域256个特征
这个卷积是一次性分析3x3区域内每个区域内的256维特征(卷积核3x3x256),然后是从背景前景的角度从256个不同的指标产生一个feature map(一共有256个不同的卷积核)
简单来说就是用256个3x3x256的卷积核去卷积6x6x256的feature map,最后就得到了4x4x256的包含前景背景相关特征的feature map。
然后注意图里面还有一个2k。这个2k就是RPN的特点了,我仔细的查了RPN网络的博客(没看论文)
这篇讲RPN网络的博客非常的详细,https://blog.csdn.net/lanran2/article/details/54376126#comments 作者:懒人元
图里面虽然写的是4x4x(2kx256),但是应该不是4x4x2kx256的意思,应该是有4x4x256和4x4x2k的意思,前面的4x4x256是4个区域上每个区域跟前景背景相关的256种特征,后面的4x4x2k则是在这4x4个区域的中心点预测了k个框,每个框是前景可能性和背景可能性的评分。
最开始我理解的RPN应用于tracking,我以为是在检测帧上用RPN来产生proposal。但是实际上,Siamese-RPN对模板帧"抛锚",实际上是为了进一步细化Ground Truth,把Ground Truth修的特别精准(上下左右框都能贴着要跟踪的物体).然后每个区域的中心点都画了k个框,每个框都有前景分和背景分。而且这k个框后面卷积了之后还能用于给检测区划分区域。
这样就完成了对模板帧的处理,然后再看看RPN对检测帧干了什么。
其实Siamese-RPN里面RPN也是Siamese的,也就是说前面我们怎么对模板帧的feature map卷积的,这里还怎么卷,参数啥的都是共享的。唯一不一样的地方就在于,我们不再对检测帧“抛锚了”。
这样我们就得到了一个20x20x256的、检测帧的、跟模板帧使用同一个前景背景评价特征的一个feature map。
至于说为什么不对检测帧抛锚:
首先,如果你每一帧检测帧都丢到RPN里面抛锚画框的话,速度肯定就降下去了
其次,这样做的意义并不是很大,与其把检测帧里面的object全部都detect出来,然后再跟模板进行判断,还不如直接就用模板的feature map去卷积原图的feature map(你多detect出来的东西又用不上)
然后就不难发现这里其实跟Siamese-fc很像,Siamese-fc直接就使用的特征提取产生的feature map卷积了,但是Siamese-RPN用低级特征提取出了了更加高级的特征,再卷积。所以Siamese-RPN比Siamese-fc鲁棒。(至于为什么,参考想法3)
后面两个一卷积,卷完之后就的到了2k张score map,在响应程度、前背景分数(实际上就用了前景分数)三者之间取某种权重,选择17x17x2k中的一个框映射回去,框的中心点就是object大致位置。(这里之所以说是大致位置,是因为后面还要靠regression分支的结果来修正)
上面那个classification branch搞懂了之后,regression branch就没什么难的了。
一样是先对模板帧“抛锚”
卷积啥的跟上面是一样的,不过这里用的卷积核提取出来的特征可能意义还是有点不一样(毕竟用途不一样,这里是为了得到偏移量和预测框的规格)
简要说明一下这里的得到的这个4x4x(4kx256)是什么含义
首先是4x4x256,这就是提取出来的和用于regression判断的特征
然后是4x4x4k,这表示4x4个区域上的k个框的4个修正值(分别为dx,dy:中心的横纵偏移量和dw,dh:预测框的宽高偏移量)。
处理完了模板帧之后就是检测帧
检测帧的处理跟前面classification branch对检测帧的处理一模一样,也没有对RPN“抛锚”,只是简单地提取高级特征
然后一样是用模板帧的feature map去卷积检测帧的feature map,得到最终的score map
等模板帧和检测帧从网络里输出之后,我们得到了两张score map
一张是由classification branch产生的,17x17x2k
一张是由regression branch产生的,17x17x4k
前面已经提到,预测框的大致位置是由classification branch产生的,所以首先我们是根据classification branch产生的17x17x2k的score map的响应大小以及前景分数,确定我们选择了17x17中的哪个区域,以及选择了那个区域的哪一个框。
然后需要修正,修正就不用再判断了(判断是classification branch的活),直接去找regression branch产生的那个17x17x4k score map对应的那个区域的4个偏移量就能算出最终的预测框了。
上面Siamese-RPN产生结果的流程一说完,应该就可以发现,其实模板帧好像就算了一次,后面其实一直都在算检测帧,所以网络结构可以简化成这个样子
这个流程图比较接近实际实现。
基于Siamese-RPN的假设(追踪就是单样本检测),提高单样本检测鲁棒性的一个重要方法就是元学习(权值预测)
这里作者提了一个比较有意思的预测权值的方法
首先对于一般的问题而言
我们学习的目标是找到使loss函数值最小的一组权值w
单样本权值预测是什么意思呢,就是在我只给了你一个训练样本的情况下,你能给我整个权值出来
里面的w(z;W)函数就是权值预测的函数
然后我们把单样本权值预测应用到Siamese-RPN网络上来,就得到下面的函数
里面的蛇函数就是Siamese-RPN中RPN部分产生的proposal的误差,给RPN的两个参数就是Siamese网络在预测权值下产生的feature map。
这样就可以在大样本下训练网络对模板帧的处理过程(产生卷积kernel的过程),使得这个权值预测能预测模板帧的种类信息,进而弥补Siamese-RPN对Ground Truth学习过少的问题(只取了第一帧作为模板帧)
其实说实话我不是很懂这个策略为什么work
作者的意思就是,一开始选框的时候总是从17x17x2k的score map中选框,但是追踪的目标在相邻帧中差的总是不太远,所以就取中心区域比如中间的7x7x2k里面选框就行了(目标在相邻帧中差的不远没问题,但是问题是视频又不是正对着目标拍的,目标也有可能渐渐运动到画面边缘啊)。这段有点迷,我暂时没弄懂。(但是减少区域我是能理解的,因为你换个起点无非就是修正大点嘛,在中心区域选框我也能理解,起点在中心的话,修正总是或多或少会少点嘛。不明白的地方就是,怎么目标相邻帧中运动不大就能推出只在中心区域选框了呢?)
在中心化选取之后,他对所有proposal的评分是用的cosine 窗口和尺度变化连续性来评估的
首先用余弦窗口来进行尺度抑制,然后尺度评估比较有意思
因为相邻帧的预测框的尺度大小变化应该不大(一个是长宽比,一个是大小)
然后他选用了这样一个量来衡量变化
里面r是ratio,s是size
ratio就是长宽比
size使用这个来衡量的
p是padding,就是宽高平均值
最后根据上面两个指标(余弦窗口和尺度连续),使用NMS(Non-maximum-suppression)方法来选择最后的预测框。
作者证明了Siamese-RPN的效果跟数据集的体量是成正比的,给的数据集越多,效果越鲁棒
我想大致有两个原因
1.因为Siamese-RPN的跟踪原理是利用前景背景特征相似性,数据集越大,提取出来的前景背景特征应该就更加高效,所以效果鲁棒
2.可能跟那个元学习有关吧,也许在大量数据集上训练之后,元学习确实能让Siamese-RPN通过一个模板掌握模板所代表的类的信息
并且作者还证明了那个抛锚数量的多少跟学习效果是有关系的,少了可能没学会,多了可能就过拟合了
然后就是中心区域到底得多大,作者的数据表示在大数据集上的时候,中心区域还是大点好,训练出来的整体效果好,数据集比较小的时候,中心区域还是小点比较好,多了反而精度下降
科研真的是时间的无底洞
可能有些是不切实际的
1.tracking问题的原型是:在视频的第一帧框一个Bounding Box,要求在后面的过程中始终跟踪这个目标
那可以直接在第一帧拿到Bounding Box之后,就先给第一帧扫一遍,把所有响应比较高的地区都记下来,然后把位置记一记,然后再把Bounding Box框出来的特别标记一下。之后每个检测帧都更新一下这个位置图,可以采用某种策略:
比如要是有一个位置响应高了一下,后面响应就一直很低,我就有理由怀疑这个位置应该是误检了,我就把这个位置删了,或者有个位置持续的响应很高,我就确定那个地方应该有一个跟我的Ground Truth一样的物体,标记一下,不要跟我的Ground Truth搞混了
然后我更新我的Predict Position的时候总是从离上次Predict最近的地方开始(抑或者我对我的ground truth的运动轨迹进行预测,根据和预测路径的差距改变权值)(或者选择的权重高一些,可以在匹配度和位置远近之间取一个权衡)。
这样应该能够满足我提出来的问题。当然也有涵盖不了的情况,就是大量相似物体加上跟踪目标快速移动:
比如一个羽毛球被打进一堆羽毛球里面
2.像有些tracking算法,始终都是在学习Bounding Box,又有些算法,始终都是在学习匹配方法。所以两个就都有缺点:
第一种:老是学习Bounding Box可能会过拟合,而且算法效率低,难训练(没有啥能提前学好的参数)
第二种:老是学习匹配方法,没有模型更新,对Bounding Box所知甚少
要想达到一个理想的结果,我觉得总是需要在这两个极端之间求得一个平衡的
就Siamese-RPN来说,整个网络中其实有一个分支(就是Ground Truth那个分支)其实就刚拿到模板帧的时候跑了一次。后面都是不停地在把检测帧往里面送,用模板帧的结果不停地卷。
我想能不能这样改进一下:
建一个模板库,里面专门用来存模板。
最开始的时候模板库里面只有Ground Truth一个模板。它的可信度置为1,然后后面每一帧追踪得到结果映射回去就是检测帧上面的一块区域。然后把这个区域和Ground Truth丢到另外一个简单的Siamese网络里面,通过feature map的卷积判定二者的相似程度,如果相似程度比较高,就增加模板库中模板的置信概率(上限为1)。如果相似程度不高(这里有可能是跟丢了,也有可能是追踪目标发生了较大变化,跟丢了我也没办法,所以我就当追踪目标产生了变化处理)我就把这个追踪结果当成模板放进模板库,给它一个初始的置信概率,后面继续追踪,得到的结果继续跟模板库中的模板比…
至于在计算检测帧的预测结果的时候到底是用哪个模板,我觉得可以和模板库中所有的模板都比一下,根据相似程度和置信概率确定最终的预测框
3.Siamese-RPN之所以会比Siamese-fc鲁棒,我觉得原因主要在特征提取
相比于Siamese-fc,他提取出来,用于卷积判断中心位置的特征要比Siamese-fc的特征具体也抽象
具体就具体在,他就是从前景背景的角度去提取特征
抽象就抽想在,他不是直接用简单的图像特征去比对
所以他能在大型数据集上训练它的网络,让提取出来的特征更加有效
并且能避免欠拟合的情况(就算两个图片样子长得不是很像,但是他们的抽象特征非常像)(同样的两个物体在Siamese-fc里面就算匹配可能得分也不高,但是在Siamese-RPN里面得分就高)