OpenTLD源码解析(1)
1.得到img
2.跟踪过程
3.检测过程
4.跟踪结果和检测结果的综合
检测结果可能有多个,需要bb_cluster_confidence对其进行融合,融合的方法聚类平均。
得到cBB和cConf。
初始时,默认使用跟踪的结果
tld.bb(:,I) = tBB;
tld.conf(I) = tConf;
tld.size(I) = 1;
tld.valid(I) = tValid;
如果跟踪的结果和检测的结果overlap的值小余0.5并且检测的conf值也比跟踪的大,则用检测结果初始化跟踪。
这保证了当跟踪丢失时,或者跟踪错误时,可以使用检测代替。
另一种情况,则跟踪有效,将检测结果与跟踪overlap值大于0.7的挑选出来和跟踪结果进行平均,得到最后的结果。
5.学习过程
如果结果valid则学习。
6.关于overlap和conf
这两个值非常重要,相当于一个标准尺子。
当你确定一个bb是对的时,与其overlap值越大,则两个是同类的,否则是不同类
conf是用对检测出的结果,给出一个其正确程度的数字量度。而与其对比的,则为不断
更新的Y样本和N样本。
TLD的学习过程,和这两个参数关系很大。
6.1 overlap
overlap值的意思如下:
交集占其并集的百分比,作者程序中这部分是用c写的:
6.2 conf
6.2.1 从Patch到Pattern
从图像中得到patch
patch = img_patch(img.input,bb(:,i));
标准话15X15
patch = imresize(patch,patchsize); % 'bilinear' is faster
变成向量,然后使其均值为0;
pattern = double(patch(:));
pattern = pattern - mean(pattern);
6.2.2 计算Pattern到正样本和负样本的距离
nccP = distance(x(:,i),tld.pex,1); % measure NCC to positive examples
nccN = distance(x(:,i),tld.nex,1); % measure NCC to negative examples
NCC距离计算方法:
NCC距离表示两个归一化矢量之间的夹角取值在(-1,1)之间
代码如下:
// correlation normalized
double ccorr_normed(double *f1,double *f2,int numDim) {
double corr = 0;
double norm1 = 0;
double norm2 = 0;
for (int i = 0; i<numDim; i++) {
corr += f1[i]*f2[i];
norm1 += f1[i]*f1[i];
norm2 += f2[i]*f2[i];
}
// normalization to <0,1>
return (corr / sqrt(norm1*norm2) + 1) / 2.0;
}
此处定义距离时,因为正负样本有多个,定义距离有两种方法:
dN = 1 - max(nccN);
dP = 1 - max(nccP);
maxP = max(nccP(1:ceil(tld.model.valid*size(tld.pex,2))));
dP = 1 - maxP;
6.2.3 确定Pattern接近正样本的程度
6.2.4 关于isin