CREST代码阅读

CREST代码阅读


在成功运行CREST后说一下自己对代码的有关理解。

特征提取网络
代码首先是利用VGG16构建一个特征提取网络,其中构建特征提取网络文件是initVGG16Net.m,可以看到作者在VGG16中取了conv1_1至conv4_3,可能考虑到太多的pooling会丢失过多结构信息,导致跟踪效果变差,所以去掉了conv4_3中的pooling层和conv3_3的pooling层,因此在该特征提取网络中共计2个pooling层。

在进行取跟踪目标patch块,减均值等操作后将patch块送入VGG中进行提取特征,并将conv4_3经过relu后的特征作为在线跟踪网络的输入。其中patch块如下图所示。


CREST代码阅读

经过PCA降维减少通道数,能够给快收敛。根据跟踪目标位置形成一个高斯形label,用在训练在线跟踪网络的label。其中高斯label如下所示。


CREST代码阅读

在线跟踪网络
构建的在线跟踪网络主要文件是initNet.m。对应论文中的图4.
CREST代码阅读
分为三部分,第一部分对应论文中的base网络,是用于模拟DCF操作,输入是当前预测帧的conv4_3特征图,其网络结构是一个和目标尺寸一样大的卷积核,使用这个大卷积核得到一个响应图。其核心代码是

rw=ceil(target_sz1(2)/2);
rh=ceil(target_sz1(1)/2);
fw=2*rw+1;
fh=2*rh+1;
net_online.addLayer('conv11', dagnn.Conv('size', [fw,fh,channel,1],...
    'hasBias', true, 'pad',...
[rh,rh,rw,rw], 'stride', [1,1]), 'input1', 'conv_11', {'conv11_f', 'conv11_b'});

第二部分是构建一个空域残差网络,对应论文Spatial residual,输入是当前预测帧的conv4_3特征图,网络结构是3个1×1卷积核构成的,经过三个1×1卷积后生成一个响应图,核心代码是

net_online.addLayer('conv21', dagnn.Conv('size', [1,1,channel,channel],...
    'hasBias', true, 'pad',...
[0,0,0,0], 'stride', [1,1]), 'input1', 'conv_21', {'conv21_f', 'conv21_b'});
net_online.addLayer('conv22', dagnn.Conv('size', [1,1,channel,channel],...
    'hasBias', true, 'pad',...
[0,0,0,0], 'stride', [1,1]), 'relu_1', 'conv_22', {'conv22_f', 'conv22_b'});
net_online.addLayer('conv23', dagnn.Conv('size', [1,1,channel,1],...
    'hasBias', true, 'pad',...
[0,0,0,0], 'stride', [1,1]), 'relu_2', 'conv_23', {'conv23_f', 'conv23_b'});

第三部分是构建一个空域残差网络,对应论文Temporal residual,输入是第一帧的conv4_3特征图,网络结构是1个1×1卷积核,经过该层后,输出得到一个响应图,核心代码是

net_online.addLayer('conv23', dagnn.Conv('size', [1,1,channel,1],...
    'hasBias', true, 'pad',...
[0,0,0,0], 'stride', [1,1]), 'relu_2', 'conv_23', {'conv23_f', 'conv23_b'});

在得到三个不同的响应图后进行合并得到最终响应,核心代码是

net_online.addLayer('sum1',dagnn.Sum(),{'conv_23','conv_11','conv_31'},'sum_1');

在训练过程中的loss函数表达式是
CREST代码阅读
核心代码是

function Y = L2normLoss(X, C, dzdy)
assert(numel(X) == numel(C));
n = size(X,1) * size(X,2);
if nargin <= 2     
	  diff=X(:)-C(:);
	  idx=find(abs(diff)<0.1);
	  X(idx)=C(idx);    
	  Y = sum((exp(C(:)).*(X(:)-C(:))).^2) ;  
else
	  assert(numel(dzdy) == 1);    
	  diff=X(:)-C(:);
	  idx=find(abs(diff)<0.1);
	  X(idx)=C(idx);    
	  Y = reshape((dzdy / n) * 2*(exp(C(:)).*(X(:)-C(:))), size(X));  
end
end

尺度估计
尺度估计在scale_estimation.m中进行,分别在1、0.95、1.05三个尺度计算响应图最大响应,得到效果最好的尺度,并更新目标尺寸,更新目标尺寸代码为。

target_szU=0.4target_sz+0.6round(target_sz*scale(id));

在线更新

在线更新阶段主要每隔2帧进行一次模型更新,每次更新训练2个epoch,其核心代码所在函数是cnn_train_dag_update.m。