上一讲我提到对于算法的初始化工作主要是在tldInit这个函数里实现的。主要分为如下几大步骤,1)初始化Detector。2)初始化Trajectory。3)训练Detector
1)初始化Detector
其中bb_scan为扫描grid区域,该函数输入为boundingBox,输出为一系列的RectBox,是根据boundingBox的大小参数对待搜素区域选择一系列的box作为备选的跟踪区域,box的位置和尺度都有变化,和RectBox相应的尺度。但RectBox有6个参数,前4个分别为Rect的左上角坐标(x1,y1)和右下角坐标(x2,y2)。后两个参数求大神解释(PS:后来在fern函数里找到了解释,分别为指向对应尺度特征的指针位置、一串box的数量——用在搜索邻近box)!对于这个函数内部我还有一个疑惑,就是对ntuples函数功能的使用,哎,怎奈Matlab语法都不熟悉,只能慢慢啃了,感觉作者这里就是把RectBox的左上角的所有可能的坐标值传入该函数,得到左上角坐标位置的全部组合(不知道理解对了没)。
接下来的工作时特征的初始化,是在tldGenerateFeature函数里实现的。这个函数相对独立,作者这里为了产生效果较好的随机特征真是煞费苦心,输入的参数有两个,一个是nTREE = 10,一个是nFEATURE = 13。输出为nTREE组特征,每组特征为nFEATURE个点对,每一个点对有4个参数,分别两点坐标(x1,y1),(x2,y2),取值范围为(0~1)其中第一个点的分辨率为0.1,还不太明白这样设计的原因,待进一步分析代码,有高人指点一下更好。值得注意的是产生的点对不是横坐标相同x1
= x2,就是纵坐标相同y1 = y2。这里用图片显示一组特征,线段的两个端点
下一步工作为初始化detector。这个功能是用强大的fern函数写的,该函数有多个功能,根据传入参数的标志分别可以实现clear操作、init操作、update操作、evaluate操作、detect操作、get pattern操作。fern函数是用c写的,混合编程没有弄的太明白,还没能调试一下看看,只能看代码猜。在初始化detector的工作里,用到的是init操作。
2)初始化Trajectory
这部分没有什么要说明的,都是些零碎的初始化工作,matlab里面对一些必要的变量开辟一些空间和定义一些变量的值。具体分析Trajectory的工作的时候可以具体再分析
3)训练Detector
首先得到Target,作者注释说该Target只是用来显示,有待我后续验证。得到Target要调用函数img_patch,img_patch函数是获得一幅图像中目标区域box的像素信息patch。
接下来产生正样本数据集,调用tldGeneratePositiveData。其中第二个参数为RectBox和box的重复区域比例信息,保存在overlap参数中,由函数bb_overlap得到。tldGeneratePositiveData函数首先根据overlap的比例信息选出重复区域比例大于60%并且前num_closet = 10个的最接近box的RectBox,相当于对RectBox进行筛选。并通过bb_hull函数得到这些RectBox的最大边界。接下来的工作比较重要,要得到Pattern,调用的函数为tldGetPattern。初始化的工作就是对最接近box的RectBox区域得到其patch,然后调用tldPatch2Pattern将像素信息转换为Pattern,具体的说就是归一化RectBox对应的patch的size(放缩至patch_size
= 15*15),将2维的矩阵变成一维的向量信息,然后将向量信息均值设为0,调整为zero mean and unit variance(ZMUV),这个过程调用函数tldPatch2Pattern实现。接下来处理RectBox最大边界的模糊信息,再次用到img_patch函数,但这次调用的函数有很大的不同,还没太理解作者要做什么啊,怎么感觉还有平移旋转矩阵都出来了,晕啦(求高人指点)。该函数最后返回3个参数,pX为处理后的RectBox最大边界处理后的像素信息,pEx最近邻的RectBox的Pattern,bbP0为最近邻的RectBox。
然后再产生负样本数据tldGenerateNegativeData。得到远离box(重复区域比例小于20%)的num_patches = 100个Pattern保存到nX中,随机选中num_patches = 100个RectBox得到对应的patch保存到nEx中。这里调用了fern(5),即该函数的get pattern操作。
接下来对负样本进行分类,分类到训练集Training Set和验证集Validation Set中去。
接下来使用Training Set进行训练,先调用fern(2),更新,然后调用tldTrainNN最近邻训练数据。
接下来评估验证集Validation Set的阈值。调用tldNN验证。
至此,初始化的工作基本完成,限于本人水平有限,只能先对函数有个大概的认识,深深觉得先要静下心来把训练的算法搞清楚,再回过头来再看一编代码。
分享到:
相关推荐
提供了TLD算法的c++版本的所有代码,较为实用,方便使用
TLD目标跟踪算法
kalal大神的TLD目标跟踪算法源码,是matlab版本的,功能很好很强大,可以
TLD目标跟踪算法(PPT34页).ppt
针对传统跟踪—学习—检测(tracking-learning-detecting,TLD)目标跟踪算法由于检测模块扫描大量子窗口而导致检测时间过长,并且在跟踪过程中当目标发生严重遮挡、形变时,TLD算法会出现跟踪失败的问题进行了研究...
TLD跟踪算法(纯C++版本) 某大牛重新编写的C++版本,脱离MATLAB,CSDN上有人有详细的代码注释
TLD 图像识别算法,OpenTLD 源码,用来做图像识别,识别效果很好。
TLD跟踪算法中的类成员函数的分析,有利于理解TLD跟踪算法
TLD跟踪算法源代码下载,根据opentld-matlab版改编。(纯C++,WINDOWS版本),可运行。
tld跟踪算法代码c++更改版本,外加注释
TLD视频跟踪算法我就不多介绍了,pami上的经典。 TLD算法版本很多,有matlab +c混编的 有c++的,但是基本上都是linux下版本 但是对于广大中国学生来说,windows才是王道,但是linux下的代码直接移植到windows下有很...
用KCF的追踪过程代替TLD的追踪过程,保留了TLD的检测和学习过程,但是没有加入旋转的特征学习,对于旋转的处理还是不行,有空自己慢慢写咯,要是tld的代码都运行不来的话建议先看看如何加载tld的配置文件,要是...
TLD算法,涉及到NP学习分类算法,一边学习一边跟踪。
本资源是TLD算法的最初版本,用的是matlab和vs混编实现
Matlab版本的TLD跟踪算法,一款经典的长时跟踪算法,做长时跟踪的朋友们可以借鉴一下
TLD目标跟踪算法.pptx
TLD算法的程序分析,通过对C++代码分析,说明每段代码的意义,对深入理解TLD很有帮助
基于FAST特征点改进的TLD目标跟踪算法
Shift算法替换计算量较大的光流法进行跟踪,以通过目标模型和候选目标模型之间的巴氏系数与阈值的比较来判定跟踪失败的自检测,并通过计算Mean-Shift跟踪返回的目标框和上一帧TLD返回的目标框之间的相似度来进一步...
包含TLD实现的详细C++代码,与之对应的文献,软件实现的具体流程!