1. 论文信息
- 论文题目:End-to-end representation learning for Correlation Filter based tracking
- 论文出处:CVPR 2017
- 论文作者:Jack Valmadre,Luca Bertinetto等人
- 论文主页:http://www.robots.ox.ac.uk/~luca/cfnet.html
- 在线阅读:http://openaccess.thecvf.com/content_cvpr_2017/papers/Valmadre_End-To-End_Representation_Learning_CVPR_2017_paper.pdf
- 源码链接:https://github.com/bertinetto/cfnet
2. 网络结构设计及实现
根据官方实际代码,更加详细一点的网络结构如下图所示,可以看出,与SiamFC的网络结构类似,CFNet也包含两个分支——z和x,其中z分支对应目标物体模板,可以理解为目标在第 帧之内所有帧的模板数据加权融合(利用学习率来进行,与KCF算法类似),x分支对应目标物体搜索图像,它是目标周围的一大片区域,用于在区域内利用滑动窗口进行搜索,从而确定目标的真正位置。
3. join_cf_window层的实现
论文定义的join_cf_window层,其主要作用是对模板图像进行加窗,抑制边缘部分从而尽量减轻因样本循环移位带来的边缘失真(边界效应),join_cf_window层的定义位于make_net.m源码中:
join = dagnn.DagNN();
% Apply window before correlation filter.
join.addLayer('cf_window', MulConst(), ...
{'in1'}, {'cf_example'}, {'window'});
p = join.getParamIndex('window');
join.params(p).value = single(make_window(in_sz, join_opts.window));
join.params(p).learningRate = join_opts.window_lr;
其中MulConst是作者自己定义的计算函数,其具体定义位于src/util目录下的MulConst.m和mul_const.m文件中。
3.1 join_cf_window层的前向传播
在mul_const.m文件中,关于前向传播时,其实现细节为:
y = bsxfun(@times, x, h);
varargout = {y};
其中,x表示join_cf_window层的输入数据,h表示窗,可以看出加窗的过程实质是矩阵元素级乘法,这一点与KCF算法相同。
这里需要注意的是:窗口h的定义位于src/training目录下的make_window.m源码文件中,如下所示:
function h = make_window(sz, type)
% sz = [m1, m2]
switch type
case ''
h = ones(sz(1:2));
case 'cos'
h = bsxfun(@times, reshape(hann(sz(1)), [sz(1), 1]), ...
reshape(hann(sz(2)), [1, sz(2)]));
otherwise
error(sprintf('unknown window: ''%s''', type));
end
end
3.2 join_cf_window层的反向传播
在mul_const.m文件中,利用join_cf_window层进行反向传播时,其实现细节为:
der_x = bsxfun(@times, der_y, h);
der_h = sum(sum(der_y .* x, 3), 4);
varargout = {der_x, der_h};
这里面有一个细节需要注意:作者在设计该层的方向传播时,用的也是矩阵元素级乘法,与正向传播的计算模式相同,并没有求偏导的过程。个人推测这里面的原因是:join_cf_window层的计算任务是对数据进行加窗,这样的任务对正向和反向传播是对等的,因此反向传播计算方式与正向传播类似。
4. join_cf层的实现
join_cf层是论文中非常关键的一层,文章的核心内容几乎全体现在这一层里面了。该层的定义位于make_net.m源码中:
join.addLayer('cf', ...
CorrFilter('lambda', join_opts.lambda, 'bias', join_opts.bias), ...
{'cf_example'}, cf_outputs, {'cf_target'});
其中CorrFilter是作者自己定义的函数,它的具体定义位于src/util目录下的CorrFilter.m和corr_filter.m文件中,两者的关系是:<