自由Man

TLD源码深度分析:初始化模块(二)

4.       generatePositiveData(frame1,num_warps_init)

输入:

当前帧图像:frame1

图像块变换次数:num_warps_init

最相似边界框:best_box

相似边界框:good_boxes

   输出:

              集成分类器正样本集:pX

              best_box图像块处理结果:pEx

描述:

getPattern(frame(best_box),pEx,mean,stdev):

frame(best_box)为该帧图像中best_box边界框对应图像块;将该图像块resize

15*15的大小;计算该图像的均值、方差,分别存放到meanstdev中;将该

图像块与均值作差的结果存于pEx中。

 

        generator(frame,pt,warped,bbhull.size(),rng)

        ptgood_boxes最大边界框(2中有提到)的中心点;该函数对每个good_box

应图像块仿射变换:±1%范围的偏移,±1%范围的尺度变化,±10%范围的平面

内旋转,并且在每个像素上增加方差为5的高斯噪声(确切的大小是在指定的范

围内随机选择的),共计num_warps_init种。

关于该部分,详情见《关于PatchGenerator类 》 

     对每一仿射图像块计算特征,并存于pX中。

      

        classifier.getFeatures(patch,grid[idx].sidx,fern)

        对尺度grid[idx].sidx下的图像块patch,使用3中定义的位置计算特征,并存于

        fern中。

 

注意:

         C++版本作者此处代码有误。没有用到变换后的图像块。

   (也有朋友说没有错,待验证,但修改的一定是正确的)

修改方法一:

    将generator(frame,pt,warped,bbhull.size(),rng);

    修改成generator(img,pt,img,frame.size(),rng);

修改方法二:

    将整个for循环内容修改为:

    for (int i=0;i<num_warps;i++)

   {

     if(i == 0)

     {

for (int b = 0; b < good_boxes.size(); b ++)

{

   idx=good_boxes[b];

   patch = img(grid[idx]);

   classifier.getFeatures(patch, grid[idx].sidx, fern);

   pX.push_back(make_pair(fern,1));

}

   }

  else

   {

      generator(img,pt,warped,bbhull.size(),rng);

      for (int b = 0; b < good_boxes.size(); b ++)

      {

idx=good_boxes[b];

Rect region(grid[idx].x-bbhull.x, grid[idx].y - bbhull.y, grid[idx].width, grid[idx].height);

patch = warped(region);

classifier.getFeatures(patch, grid[idx].sidx, fern);

pX.push_back(make_pair(fern,1));

     }

  }

}

 

5.       meanStdDev(frame1(best_box),mean,stdev)

输入:

最相似图像块:frame1(best_box)

输出:

图像块均值:mean

图像块标准差:stdev

描述:

计算best_box边界框对应图像块的均值和标准差,并分别存于meanstdev中。

 

6.       integral(frame1,iisum,iisqsum)

输入:

        整帧图像:frame1

输出:

        积分图:iisum

        平方积分图:iisqum

描述:

        对整帧图像计算积分图、图像平方的积分图

 

7.       generateNegativeData(frame1)

输入:

         整帧图像:frame1

              模板个数:bad_patches

        所有不重叠边界框:bad_boxes

        积分图:iisum

        平方积分图:iisqum

输出:

         负样本特征集:nX

         负样本模板集:nEx

描述:

               random_shuffle(bad_boxes.begin(),bad_boxes.end())

       随机打乱bad_boxes的顺序。

 

       取所有bad_boxes边界框中,方差值高于best_box图像块阈值一半的图像块,计算

特征并保存到nX中。(why?:因为检测的时候,方差分类器位于集合分类器的前一

级。也就是说,方差低于0.5best_box图像块方差的部分都被排除,如果在此处

将其作为负样本是没有意义的,甚至会降低集合分类器的检测效果。)

              任取bad_patches个图像块作为负模板。


注意:

      原程序版本有错,对方差分类器方差重复取50%。

      将if (getVar(grid[idx],iisum,iisqsum)<var*0.5f)

      修改成if (getVar(grid[idx],iisum,iisqsum)<var*1.0f)

下一节见《TLD源码深度分析:初始化模块(三)》


注:若存在说法看不明白的,请留言询问!


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.5.2 Zero Theme By 爱墙纸

Copyright ZiYouMan.cn. All Rights Reserved. 蜀ICP备15004526号