代码关键点记录:成功不远了!O(∩_∩)O 哈哈~
1. Input : load_video_info.m 读入视频文件groundtruth_rect.txt(里面是4个一组的点,x,y, width ,height ?),得到有用的参数:
target_sz = [ground_truth(1,4), ground_truth(1,3)]; 得到的是目标的尺寸(这里好像是第一张的,也就是一样大)
这个值会用来计算空间带宽的值。通常一个m*n的目标,它的空间带宽为 sqrt(m*n)/16. 也就是后面的:
output_sigma
= sqrt(prod(target_sz)) * output_sigma_factor;
这个参数后面再看
sz = floor(target_sz * (1 + padding));
实际计算的时候将目标放大为两倍来计算。
得到sz以后有一部非常重要的操作:
[rs, cs] = ndgrid((1:sz(1)) - floor(sz(1)/2), (1:sz(2)) - floor(sz(2)/2));
y = exp(-0.5 / output_sigma^2 * (rs.^2 + cs.^2));
yf = fft2(y);
首先将范围变成以target中心为原点的分布,然后表示出目标中心可能出现的概率分布;接下来变换到频域里面去。
由此可以看出公式中的y不是我们平时使用的1或者是-1,而是一个可能出现的概率标签。
pos = [ground_truth(1,2), ground_truth(1,1)] + floor(target_sz/2);
pos代表的是目标中心的位置。
cos_window = hann(sz(1)) * hann(sz(2))为了消除边缘的效应和强调中心,使用一个窗口。若是Opencv里面没有我们可以自己写:
一个维度上的表示是这样的: w(n)=0.5(1?cos2π n/N
) ,0≤n≤N。(当然好像也有一个函数叫做createHanningWindow,具体的也需要查一下。)
2.读入图片序列,进行操作
对于每一张进来的图片,先转化为灰度图。
然后代码中相当冗长繁琐让人费解的一段代码取出了
Target中的x 和Y的坐标(当然有一些的边界的处理),接下来将这个区域内的
灰度值归一化到
-0.5 到 0.5(out = double(out) / 255 - 0.5;). 接下来通过hanning 窗口使得数据没有边缘效应(out= hann(sz(1)) *
hann(sz(2))*
out)。
记得这个时候输出的是经过归一化,hanning窗
处理的目标的灰度值。
3.
求高斯核
主要就是参照公式(16):
求出高斯核。也就是代码中的:k
= exp(-1 / sigma^2 * max(0, (xx + yy - 2 * xy) / numel(x)));
同时还需要解释的一个函数是: circshift,循坏位移函数。例如: circshift(a,[1,2])表示的是将a 行向下移动一行,再向右移动两列。
而当这个数是负数就是向相反的方向!
例如:
a
=
1 2 3
4 5 6
7 8 9
0 0 0
>> circshift(a,[-1])
ans =
4 5 6
7 8 9
0 0 0
1 2 3
>> circshift(a,[1 2])
ans =
0 0 0
2 3 1
5 6 4
8 9 7
高斯核的求取过程中,用到了两个区域的傅里叶变换,再在频域内点积,而后又用到了循坏移位!这里的意义是我现在还不能理解的。。
再一次的看到这里我才明白这篇论文的优点是用了非常多的样本来训练分类器,而不是用一般的方法:从附近取几个作为正样本,远一点取几个作为负样本,作者取了2倍size范围内的这些样本都用来训练分类器。
接下来我还有一点的疑惑是:检测的过程中不同位置的样本体现在哪里!!!
敬请期待!
iker Cross
2014. 12. 16