首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

TLD代码分析全过程 (转)(3)

TLD代码分析全过程 (转)(3)

4.7、meanStdDev(frame1(best_box), mean, stdev);统计best_box的均值和标准差,var =pow(stdev.val[0],2) * 0.5;作为方差分类器的阈值。Var全局变量,为best_box窗口的方差的一半。

4.8、generateNegativeData(frame1);

random_shuffle(bad_boxes.begin(),bad_boxes.end());随机打乱bad­­_boxes其中的数据。

由于TLD仅跟踪一个目标,所以我们确定了目标框了,故除目标框外的其他图像都是负样本,无需仿射变换;具体实现如下:

由于之前重叠度小于0.2的,都归入bad_boxes了,所以数量挺多,把方差大于var*0.5fbad_boxes都加入负样本,同上面一样,需要classifier.getFeatures(patch,grid[idx].sidx, fern);nX.push_back(make_pair(fern,0));得到对应的fern特征和标签的nX负样本(用于集合分类器的负样本)
然后随机在上面的bad_boxes中取bad_patches100个)个box,然后用getPattern函数将frame图像bad_box区域的图像片归一化到15*15大小的patch存在nEx(用于最近邻分类器的负样本)负样本中。
这里可以看出,nEx100个)也和pEx一样为15*15大小的patchnX(方差大于var*0.5f,有很多,个数不确定)和pX一样为二进制转换后的数。

这样nEx和nX都有负样本了;(box的方差通过积分图像计算)

4.9、然后将nEx的一半作为训练集nEx,另一半作为测试集nExT;同样,nX也拆分为训练集nX和测试集nXT;

4.10、将负样本nX和正样本pX合并到ferns_data[]中,用于集合分类器的训练; 4.11、将上面得到的一个正样本pEx和nEx合并到nn_data[]中,用于最近邻分类器的训练; 4.12、用上面的样本训练集训练集合分类器(森林)和 最近邻分类器: classifier.trainF(ferns_data, 2); //bootstrap = 2
对每一个样本ferns_data,如果样本是正样本标签,先用measure_forest函数返回该样本所有树的所有特征值对应的后验概率累加值,该累加值如果小于正样本阈值(0.6*nstructs,这就表示平均值需要大于0.60.6*nstructs / nstructs,0.6是程序初始化时定的集合分类器的阈值,为经验值,后面会用测试集来评估修改,找到最优),也就是输入的是正样本,却被分类成负样本了,出现了分类错误,所以就把该样本添加到正样本库,同时用update函数更新后验概率。对于负样本,同样,如果出现负样本分类错误,就添加到负样本库。
classifier.trainNN(nn_data);

对每一个样本nn_data,如果标签是正样本,通过NNConf(nn_examples,isin, conf, dummy);计算输入图像片与在线模型之间的相关相似度conf如果相关相似度小于0.65,则认为其不含有前景目标,也就是分类错误了;这时候就把它加到正样本库。然后就通过pEx.push_back(nn_examples);将该样本添加到pEx正样本库中;同样,如果出现负样本分类错误,就添加到负样本库。

NNConf函数计算了TLD论文5.2ObjectModel中几个相似度,如相关相似度,保守相似度等。根据相似度来判断正负样本的更改。
4.13、用测试集在上面得到的集合分类器(森林)和 最近邻分类器中分类,评价并修改得到最好的分类器阈值。  classifier.evaluateTh(nXT,nExT);

对集合分类器,对每一个测试集nXT,所有基本分类器的后验概率的平均值如果大于thr_fern0.6),则认为含有前景目标,然后取最大的平均值(大于thr_fern)作为该集合分类器的新的阈值。不然则不变

对最近邻分类器,对每一个测试集nExT,最大相关相似度如果大于nn_fern0.65),则认为含有前景目标,然后取最大的最大相关相似度(大于nn_fern)作为该最近邻分类器的新的阈值。不然则不变

5、进入一个循环:读入新的一帧,然后转换为灰度图像,然后再处理每一帧processFrame;
6、tld.processFrame(last_gray, current_gray, pts1, pts2, pbox, status, tl, bb_file);逐帧读入图片序列,进行算法处理。processFrame共包含四个模块(依次处理):跟踪模块、检测模块、综合模块和学习模块;
6.1、跟踪模块:track(img1,img2, points1, points2);
track函数完成前一帧img1的特征点points1到当前帧img2的特征点points2的跟踪预测;

6.1.1、具体实现过程如下:1)先在lastbox中均匀采样10*10=100个特征点(网格均匀撒点),存于points1
bbPoints(points1,lastbox);//box宽和高均除以10
2)利用金字塔LK光流法跟踪这些特征点,并预测当前帧的特征点(见下面的解释)、计算FBerror和匹配相似度sim,然后筛选出 FB_error <=median(FB_error) sim_error >median(sim_error)的特征点(舍弃跟踪结果不好的特征点),剩下的是不到50%的特征点
tracker.trackf2f(img1, img2, points, points2);
(3)利用剩下的这不到一半的跟踪点输入来预测bounding box在当前帧的位置和大小 tbb:
bbPredict(points,points2, lastbox, tbb);
计算pp2xy方向的偏差,得偏差中值,然后通过公式得到tbb的大小及位置,和光流法有关
4)跟踪失败检测:如果FB error的中值大于10个像素(经验值),或者预测到的当前box的位置移出图像,则认为跟踪错误,此时不返回boundingbox
if(tracker.getFB()>10 || tbb.x>img2.cols ||  tbb.y>img2.rows ||tbb.br().x < 1 || tbb.br().y <1)
5)归一化img2(bb)对应的patchsize(放缩至patch_size= 15*15),存入pattern
getPattern(img2(bb),pattern,mean,stdev);
6)计算图像片pattern到在线模型M的保守相似度:
classifier.NNConf(pattern,isin,dummy,tconf);
7)如果保守相似度大于阈值,则评估本次跟踪有效,否则跟踪无效:
if(tconf>classifier.thr_nn_valid) tvalid =true;
继承事业,薪火相传
返回列表