跟踪器的整体把握
- 之前基本上都是遵循“检测—跟踪”的思路,将检测器的“头部件”与跟踪器相结合,达到良好的跟踪效果。但是,该跟踪器的作者独辟蹊径,认为跟踪器既然使用了检测器的“头部件”能实现良好的跟踪效果,那我何不直接将检测器转换成跟踪器?于是基于这种想法作者创造了该跟踪器。
- 直接将检测器转换为跟踪器,可以在保留最需要的“头部件”的前提下,还能保留基本检测器的总体设计。这样,我们就不用再去创建一个新的跟踪框架,也不必去思考跟踪框架是否与“头部件”兼容的问题。但是,存在一个问题:检测器是对于全局的检测,它并不能始终只检测一个物体。那么,现在问题转换为:如何使得检测器只检测一个物体?
- 要使检测器只检测一个物体,就必须要告诉检测器想要只检测一个物体,这个过程在论文中称为“域自适应(Domain Adaptation)。如下图所示:
可以很清楚的看到,当经过域自适应后,检测器可以很轻松的检测到想要跟踪的物体。
- 由上述看来,“域自适应”是将检测器转换为跟踪器的重要步骤。值得一提的是,该过程应该发生在跟踪器的初始化阶段,即在第一帧选定跟踪对象后。那么结合上图和具体跟踪过程,“域自适应”的实施前提是检测器必须拥有强大的学习能力。
- 在跟踪过程中,要实现“域自适应”有两个阻力:样本少(给予的第一帧样本),时间少(初始化时间不能太长,跟踪追求速度)。换句话说,我们必须在很短的时间、很少的样本的下,实现模型的快速学习,达到“域自适应”的目的。因此检测器必须拥有强大的学习能力。
- 如下图所示,
我们可以清楚的看到MAML在小样本的情况下,只经过3-4次梯度更新,就能快速实现梯度下降,这正是我们所要的!而MAML的目的是训练出优秀的初始化参数。于是,设计该跟踪器的最终思想是:通过MAML训练赋予检测器良好的初始化参数,使其只在一帧信息的情况下,快速学习待跟踪对象的特征,使检测器只检测待跟踪对象,从而实现跟踪。
- 跟踪器的构建步骤:
- 选择任何经过梯度下降训练的检测器
- 使用MAML在大量跟踪序列上训练检测器
- 当给出测试序列的初始帧时,通过几步梯度下降来微调检测器。 在该域适应步骤之后,可以获得体面的跟踪器。
离线预训练
- 离线预训练的目的是获得检测器良好的初始化参数。
- 离线预训练的示意图如下所示:
-
因为可以选择任何经过梯度下降训练的检测器,所以损失函数的形式不固定。下文统一用L(.)表示。
-
离线训练中的优化分为两种优化:外层优化和内层优化(以训练一对图像为例)
- 内层优化,可以理解为在
support set
单纯的梯度下降(SGD优化器),上图中用蓝色的线表示,其中“update”代表一次梯度下降。用公式表示为:
θ k = θ k − 1 − α 1 ∣ D i s ∣ ∑ ( x , y ) ϵ D i s ∇ θ k − 1 L ( h ( x ; θ k − 1 ) , y ) \theta_k=\theta_{k-1}-\alpha\frac{1}{|D_i^s|}\sum_{(x,y)\epsilon D_i^s}\nabla_{\theta_{k-1}}L(h(x;\theta_{k-1}),y) θk=θk−1−α∣Dis∣1(x,y)ϵDis∑∇θk−1L(h(x;θk−1),y)
其中 α \alpha α代表步长, L ( h ( x ; θ k − 1 ) , y ) L(h(x;\theta_{k-1}),y) L(h(x;θk−1),y)代表损失。
- 外层优化,就是将每次梯度更新后的模型带入
target set
,然后按照不同的权重将每次梯度的对应的损失相加,取平均,最后进行一次梯度下降(Adam优化器)。用公式表示为(其中 N N N为视频数):
F ( θ 0 , D i ) = 1 ∣ D i t ∣ ∑ ( x , y ) ϵ D i t ∑ k = 0 K γ k L ( h ( x ; θ k ) , y ) θ ∗ = arg min θ 0 1 N ∑ i N F ( θ 0 , D i ) F(\theta_0,D_i)=\frac{1}{\mid D_i^t\mid}\sum_{(x,y)\epsilon D_i^t}\sum_{k=0}^K\gamma_kL(h(x;\theta_k),y)\\ \theta^{*}=\arg \min_{\theta_0}\frac{1}{N}\sum_i^NF(\theta_0,D_i) F(θ0,Di)=∣Dit∣1(x,y)ϵDit∑k=0∑KγkL(h(x;θk),y)θ∗=argθ0minN1i∑NF(θ0,Di)
- 内层优化,可以理解为在
离线训练流程
- 首先,在相同或者不同的序列中采样 32 × 10000 32\times10000 32×10000对图像,每32对图像形成一个batch,则一共有10000个batch形成一个epoch。
- 按照上图所示,将一对图像输入到训练管中,得到一对图像的 F 1 ( θ 0 , D i ) F_1(\theta_0,D_i) F1(θ0,Di)损失。假设一个视频中采样了k对图像(k<=32),那么这k对图像的平均损失为:
F a v g k = 1 k ∑ i = 1 k F i ( θ 0 , D i ) F_{avg_k}=\frac{1}{k}\sum_{i=1}^k F_i(\theta_0,D_i) Favgk=k1i=1∑kFi(θ0,Di)
- 假设使用了 N N N个视频采样了32对图像,那么我们可以得到这32对图像的平均损失,即一个batch的损失:
F a v g b a t c h = 1 N ∑ i = 1 N F i ( θ 0 , D i ) F_{avg_{batch}}=\frac{1}{N}\sum_{i=1}^NF_i(\theta_0,D_i) Favgbatch=N1i=1∑NFi(θ0,Di)
- 这时对一个batch的损失进行梯度下降,运用的优化器为Adam。也就是论文中的公式:
θ ∗ = arg min θ 0 1 N ∑ i N F ( θ 0 , D i ) \theta^{*}=\arg \min_{\theta_0}\frac{1}{N}\sum_i^NF(\theta_0,D_i) θ∗=argθ0minN1i∑NF(θ0,Di)
- 当我们完成了一个batch后,以当前的 θ ∗ \theta^{*} θ∗为初始参数,再进行训练。
- 我们考虑了10000个批次,也就是梯度下降10000次,权重更新10000次,这仅仅完成了一个epoch。
- 我们选择了20个epoch,也就是对数据集循环使用20次,在如此巨大的训练量下,我们的初始参数当然会获得强大的学习能力。
在线跟踪过程
在线跟踪的算法图如下所示:
-
前期准备:
- 视频序列 ( I i ) i = 1 N (I_i)_{i=1}^N (Ii)i=1N:N帧的视频;
- 检测器模型 h ( . ; θ ) h(.;\theta) h(.;θ):第一个是输入参数,第二个是模型参数;
- 在第一帧选定的框: B 1 B_1 B1
- 在线更新的帧数间隔: u u u
-
进行跟踪
-
根据选定的框 B 1 B_1 B1,制定图片补丁( 263 × 263 263\times 263 263×263). S 1 < − S R ( I 1 , B 1 ) S_1<-SR(I_1,B_1) S1<−SR(I1,B1)
-
初始化
support set
(数据增强). D s < − D^s<- Ds<−{ D a t a A u g ( S 1 ) DataAug(S_1) DataAug(S1)} -
经过5次梯度下降,更新模型参数 θ \theta θ,使得检测器适合检测目标物体。(快速学习)。 θ < − G D 5 ( θ , D s ) \theta<-GD_5(\theta,D^s) θ<−GD5(θ,Ds)
-
for循环:取第2帧到最后一帧
- 在第 i i i帧中按照第 i − 1 i-1 i−1帧框的位置进行截取补丁,之后将补丁输入检测器中,获得M个候选区域的分类置信度和回归偏差坐标。(可以看做检测器是Fast R-CNN,Retina与其相似)
[ B d e t j , c j ] j = 1 M < − h ( S R ( I i , B i − 1 ) ; θ ) [B^j_{det},c_j]_{j=1}^M<-h(SR(I_i,B_{i-1});\theta) [Bdetj,cj]j=1M<−h(SR(Ii,Bi−1);θ)
- 如果M个分类置信度都小于0.1,那么我们将第 i i i帧的跟踪框设为 i − 1 i-1 i−1帧的跟踪框
- 经过余弦惩罚和形状惩罚后选择分数最大的 c ∗ c^{*} c∗,并将其对应的回归偏差坐标转换为回归框 B i B_i Bi
- 线性插值平滑的将跟踪框的形状过渡,不会让两帧之间跟踪框形状变化过于剧烈。
- 更新新的
support set
。即将第 i i i帧的图片替换第 i − 1 i-1 i−1帧图片成为模板图片。
_i$ - 线性插值平滑的将跟踪框的形状过渡,不会让两帧之间跟踪框形状变化过于剧烈。
- 更新新的
support set
。即将第 i i i帧的图片替换第 i − 1 i-1 i−1帧图片成为模板图片。 - 每隔 u u u帧或检测干扰峰时进行模型参数 θ \theta θ更新
-