SAMF

时间:2022-06-09
本文章向大家介绍SAMF,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

论文: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);