论文:paper
结合了CN和KCF的多尺度扩展,看文章之前就听说很暴力,看了以后才发现原来这么暴力。
论文的前一半讲KCF,后一半讲做的实验,中间一点点大概半页的内容讲了怎么进行尺度适应。原文的3.3部分
这里有一张图:
SAMF
具体操作就是选择一系列尺度因子,源代码中选择了7个(比DSST中少多了),然后得到一个尺度金字塔,利用双线性插值resize到一个固定尺寸,然后分别送入KCF(结合了Fhog和CN特征),然后得到一个响应图,一共7层,然后找出响应的最大值,最大值属于哪个尺度就说明哪个尺度合适(直观上这样并没有说明道理),不过实验说明这样的效果还是不错的,这个算法取得了14年VOT竞赛的第二名。
可想而知这个速度是比较慢的,每一帧都要比KCF多花6倍的时间,如果加CN的话再多一点。
大神的专栏里比较了一下SAMF和DSST:
1:DSST有33个尺度,而SAMF只有7个尺度(还可以减少,并不存在训练样本减少的问题),所以DSST 比较精细。
2:DSST是位置和尺度分开检测,所以只是 分布最优,并不能保证位置是最优的,而SAMF是位置和尺度 同时(全局)最优,而往往这两个结果是不一样的(全局和分布)。
3:DSST更具有创新性,也更灵活,但需要额外训练一个滤波器,SAMF只需要一个滤波器,但需要计算多次。
并不是DSST的效果一定就比SAMF好。
最后再吐槽一句,真是太暴力了,这种文章真是拼速度发出来的,不过公开源码了也可以说非常良心了。
核心代码截取出来放到这里:
search_size = [1 0.985 0.99 0.995 1.005 1.01 1.015];
for i=1:size(search_size,2)
tmp_sz = floor((target_sz * (1 + padding))*search_size(i));
param0 = [pos(2), pos(1), tmp_sz(2)/window_sz(2), 0,...
tmp_sz(1)/window_sz(2)/(window_sz(1)/window_sz(2)),0];
param0 = affparam2mat(param0);
patch = uint8(warpimg(double(im), param0, window_sz));
zf = fft2(get_features(patch, features, cell_size, cos_window,w2c));
%calculate response of the classifier at all shifts
switch kernel.type
case 'gaussian',
kzf = gaussian_correlation(zf, model_xf, kernel.sigma);
case 'polynomial',
kzf = polynomial_correlation(zf, model_xf, kernel.poly_a, kernel.poly_b);
case 'linear',
kzf = linear_correlation(zf, model_xf);
end
response(:,:,i) = real(ifft2(model_alphaf .* kzf)); %equation for fast detection
end
%target location is at the maximum response. we must take into
%account the fact that, if the target doesn't move, the peak
%will appear at the top-left corner, not at the center (this is
%discussed in the paper). the responses wrap around cyclically.
[vert_delta,tmp, horiz_delta] = find(response == max(response(:)), 1);