TLD目标跟踪算法
TLD跟踪算法图文流程

计算与输入的bounding box 的重叠度并且将本位置和本 尺度的扫描窗口存入grid中
(2)计算输入帧的积分图像并且给各个变量分配空间,其中 grid.size()是第一步中产生的所有的扫描窗口的个数。 计算积分图像需要用到iisum.create()与iisqsum.create()两个函数。 (3)初始化样本产生器generator并且通过计算扫描窗口与 bounding box的重叠度得到最初始的分类good boxes与bad boxes。 generator的作用此时被定义为仿射变换,仿射变换即线性变换+平 移。 getOverlappingBoxes函数功能:根据输入的bounding box在整帧图 像中寻找与该box最相似的num_closest_init个扫描窗口,然后把这 些窗口归入good_boxes中,同时把重叠度小于0.2的窗口归入 bad_boxes中。 (4)初始化分类器
按步长移动扫描窗口,进而遍历整个视频帧
bbox.y = y;
bbox.width = width; bbox.height = height; bbox.overlap = bbOverlap(bbox,BoundingBox(box));
bbox.sidx = sc;
grid.push_back(bbox); } } sc++; } }
{ const float SHIFT = 0.1; const float SCALES[] = {0.16151,0.19381,0.23257,0.27908,0.33490,0.40188,0.48225, 0.57870,0.69444,0.83333,1,1.20000,1.44000,1.72800, 2.07360,2.48832,2.98598,3.58318,4.29982,5.15978,6.19174}; int width, height, min_bb_side; BoundingBox bbox; Size scale; int sc=0; for (int s=0;s<21;s++) { width = round(box.width*SCALES[s]); height = round(box.height*SCALES[s]); min_bb_side = min(height,width);
TLD百度百科

∙▪Tracking-Learning-Detection (一种目标跟踪算法...∙▪热释光剂量计∙▪调频液体阻尼器∙▪法国TLD集团收藏10732TLD(Tracking-Learning-Detection (一种目标跟踪算法))TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生ZdenekKalal在其攻读博士学位期间提出的一种新的单目标长时间跟踪(long term tracking)算法。
该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。
同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、可靠。
对于长时间跟踪而言,一个关键的问题是:当目标重新出现在相机视野中时,系统应该能重新检测到它,并开始重新跟踪。
但是,长时间跟踪过程中,被跟踪目标将不可避免的发生形状变化、光照条件变化、尺度变化、遮挡等情况。
传统的跟踪算法,前端需要跟检测模块相互配合,当检测到被跟踪目标之后,就开始进入跟踪模块,而此后,检测模块就不会介入到跟踪过程中。
但这种方法有一个致命的缺陷:即,当被跟踪目标存在形状变化或遮挡时,跟踪就很容易失败;因此,对于长时间跟踪,或者被跟踪目标存在形状变化情况下的跟踪,很多人采用检测的方法来代替跟踪。
该方法虽然在某些情况下可以改进跟踪效果,但它需要一个离线的学习过程。
即:在检测之前,需要挑选大量的被跟踪目标的样本来进行学习和训练。
这也就意味着,训练样本要涵盖被跟踪目标可能发生的各种形变和各种尺度、姿态变化和光照变化的情况。
换言之,利用检测的方法来达到长时间跟踪的目的,对于训练样本的选择至关重要,否则,跟踪的鲁棒性就难以保证。
考虑到单纯的跟踪或者单纯的检测算法都无法在长时间跟踪过程中达到理想的效果,所以,TLD方法就考虑将两者予以结合,并加入一种改进的在线学习机制,从而使得整体的目标跟踪更加稳定、有效。
TLD算法原理及应用实例

2.3 P-N学习
• P-N学习的主要思想就是检测器的错误能够被 两种类型的约束标识出。 • P-expert的作用是发现目标的新的外观(形 变),并以此来增加正样本的数量,从而使得 检测模块更具鲁棒性。 • N-expert的作用是生成负的训练样本。N-expert 的前提假设是:(被跟踪的)前景目标仅可能 出现在视频帧中的一个位置,因此,如果前景 目标的位置时确定的,那么其周围必然是负样 本。
1 TLD概述
TLD可以解决的问题:
极其复杂的视频,比如跟踪失败的情况经常发 生的视频,目标经常丢失的视频 如果前后的视频帧中没有包含很相关的信息, 比如说目标物体发生了严重形变,检测器的效 果也从不会被弱化 实时运作
1 TLD概述
tra jec tor y
学习 (Learning)
2.3 P-N LEARNING
• 这一部分介绍TLD算法的学习模块,学习模块(learning)通过对视频 的在线处理来提升检测器(detector )的性能。在每一帧里,我们希 望评估当前的检测器,发现它产生的错误(identify its errors),不断 更新检测器以避免将来它再次犯错。PN学习的关键思想是检测器产生 的错误结果可以被“P专家”和“N专家”发现和识别。P专家识别假 的负样本,N专家识别假的正样本。当然P专家和N专家本身也会犯错。 然而,P专家和N专家是相互独立的,它们可以相互弥补对方发生的错 误。P专家发生的错误,N专家纠正,反之亦然。
s ion ect det
fra gm ent s
of
n ini tra gd ata
跟踪 (Tracking)
re-initialization
检测 (Detection)
TLD目标跟踪算法

TLD目标跟踪算法TLD(Track Learning Detection)是一种目标跟踪算法,它结合了目标跟踪和目标检测的方法,能够在复杂环境中跟踪目标并检测目标的丢失。
TLD算法的核心思想是结合在线学习和离线学习的方法,通过检测器(detector)来检测目标,并通过跟踪器(tracker)来跟踪目标。
在在线学习阶段,检测器会进行训练,学习目标的外观特征和形状信息。
而在跟踪阶段,跟踪器会根据检测器的输出来进行目标的跟踪,同时根据跟踪结果反馈给检测器,进行修正。
TLD算法的具体步骤如下:1. 首先,通过一个强分类器进行目标检测。
这个强分类器使用了Haar特征和Adaboost算法进行训练,能够在图像中快速定位目标。
2.检测到目标后,根据目标的位置和尺度信息,将目标裁剪出来作为正样本,并提取其外观特征,包括颜色、纹理等。
3.同时,从目标附近随机选择一些负样本,并提取其外观特征。
这些负样本一般是与目标外观相似的背景区域。
4. 然后,使用一个在线集成学习器(Online Ensemble Learning)来学习目标的外观特征。
这个学习器使用了随机决策的方法,通过多个弱分类器的投票来进行目标的分类。
5.在跟踪阶段,通过跟踪器来进行目标的跟踪。
跟踪器使用了一个模板,通过计算目标与模板的相似度来判断目标的位置。
6.如果跟踪器发生目标丢失,即目标与模板的相似度低于一个阈值,那么就需要重新进行目标检测。
7.在进行目标检测时,使用之前训练得到的检测器,来对图像进行目标检测。
同时,根据跟踪器的输出结果,对检测器进行修正,从而提高检测的准确率。
TLD算法的优点是能够在复杂环境中进行目标跟踪,并且能够适应目标的外观变化。
它通过结合目标检测和目标跟踪的方法,能够在目标丢失时及时进行目标检测,从而提高了跟踪的准确率和稳定性。
然而,TLD算法也有一些缺点。
首先,由于在跟踪阶段是基于目标检测结果来进行跟踪的,所以在目标遮挡或者快速移动时容易出现跟踪失败。
《2024年目标跟踪算法综述》范文

《目标跟踪算法综述》篇一一、引言目标跟踪是计算机视觉领域的一个重要研究方向,广泛应用于视频监控、智能驾驶、人机交互等众多领域。
随着深度学习技术的发展,目标跟踪算法取得了显著的进步。
本文旨在全面综述目标跟踪算法的研究现状、主要方法和挑战,以期为相关研究提供参考。
二、目标跟踪算法的研究现状目标跟踪算法的发展历程可以追溯到上世纪中期,经历了从传统方法到深度学习方法的发展。
传统方法主要依赖于特征提取和匹配,而深度学习方法则通过学习大量数据来提高跟踪性能。
近年来,随着深度学习的广泛应用,基于深度学习的目标跟踪算法成为了研究热点。
三、主要目标跟踪算法1. 基于特征的方法基于特征的方法是早期目标跟踪的主要方法。
该方法首先提取目标对象的特征,然后在视频帧中搜索与该特征相似的区域。
常见的特征包括颜色、纹理、边缘等。
然而,这种方法对于复杂场景和动态背景的适应性较差。
2. 基于模型的方法基于模型的方法通过建立目标的模型来进行跟踪。
该方法首先从视频帧中提取目标对象,然后使用模型对目标进行描述和预测。
常见的模型包括模板匹配、支持向量机等。
这种方法对于模型的准确性和泛化能力要求较高。
3. 基于深度学习的方法基于深度学习的方法是近年来目标跟踪算法的研究热点。
该方法通过学习大量数据来提取目标的特征和模型,从而提高跟踪性能。
常见的深度学习方法包括卷积神经网络(CNN)、循环神经网络(RNN)等。
深度学习方法对于复杂场景和动态背景的适应性较强,但需要大量的训练数据和计算资源。
四、主要挑战与解决方法1. 目标形变与遮挡目标形变和遮挡是目标跟踪中的主要挑战之一。
为了解决这一问题,研究者们提出了各种方法,如使用更复杂的模型来描述目标、引入遮挡检测机制等。
此外,基于深度学习的方法也可以通过学习目标的形态变化和遮挡情况来提高跟踪性能。
2. 背景干扰与噪声背景干扰和噪声会影响目标的准确跟踪。
为了解决这一问题,研究者们提出了使用更鲁棒的特征提取方法和背景抑制技术。
《2024年目标跟踪算法综述》范文

《目标跟踪算法综述》篇一一、引言目标跟踪是计算机视觉领域的一个重要研究方向,广泛应用于视频监控、智能驾驶、人机交互等众多领域。
随着深度学习技术的发展,目标跟踪算法取得了显著的进步。
本文旨在全面综述目标跟踪算法的研究现状、主要方法和挑战,以期为相关研究提供参考。
二、目标跟踪算法的研究现状目标跟踪算法的发展历程可以追溯到上世纪中期,经历了从传统方法到深度学习方法的发展。
传统方法主要依赖于特征提取和匹配,而深度学习方法则通过学习大量数据来提高跟踪性能。
近年来,随着深度学习的广泛应用,基于深度学习的目标跟踪算法已成为研究热点。
三、主要目标跟踪算法1. 基于特征的方法基于特征的方法是早期目标跟踪的主要手段,主要包括光流法、模板匹配法等。
这些方法通过提取目标特征,在视频帧之间进行匹配和跟踪。
然而,这些方法对于复杂场景和动态背景的适应性较差。
2. 基于相关滤波的方法相关滤波是一种在频域进行信号处理的方法,也被广泛应用于目标跟踪领域。
该方法通过训练一个相关滤波器来预测目标的运动轨迹。
相关滤波方法具有计算效率高、实时性好的优点,但容易受到目标形变和背景干扰的影响。
3. 基于深度学习的方法基于深度学习的目标跟踪算法是近年来研究的热点。
这些方法通过学习大量数据来提取目标的特征和运动信息,从而实现对目标的准确跟踪。
深度学习方法具有强大的特征提取能力和泛化能力,能够适应复杂场景和动态背景。
四、深度学习在目标跟踪中的应用深度学习在目标跟踪中的应用主要体现在以下几个方面:1. 特征提取:深度神经网络可以自动学习目标的特征表示,提高跟踪的准确性。
2. 上下文信息利用:深度学习方法可以通过学习目标的上下文信息来提高跟踪的鲁棒性。
3. 在线学习与更新:深度学习方法可以在线学习目标的运动信息和外观变化,实现自适应跟踪。
五、挑战与未来研究方向尽管目标跟踪算法已经取得了显著的进步,但仍面临许多挑战和问题。
未来研究方向主要包括:1. 鲁棒性:如何提高算法在复杂场景和动态背景下的鲁棒性是一个重要的问题。
摄像头锁定追踪解读

拓展课题13任务描述:一个具体方案,关于用摄像头捕获移动的物体,比如乒乓球,从视频信息中提取关键信息,数据在计算机中运算,能预算出物体运动轨迹。
时间限制:3天任务分析:1、摄像头捕获移动物体:a)运动是物理位置的移动,反应物体运动的量的是连续、有限变化的。
b)摄像头能够:在x轴、z轴动作,能够调节景深(焦距)。
c)摄像头固定、转动时都能检测出移动的物体,并且算出移动的方向和加速度,这里包含移动物体的轮廓误差设置。
d)聚焦于移动的物体,排除不关注的运动,还要能过滤摄像机本身运动带来的误差。
e)分析形状变化、光照条件变化、尺度变化、遮挡等带来的误差,并正确的跟踪物体的位置。
2、预测物体的运动轨迹:a)相比于人的主观反映快的都算是预测。
b)预测都是基于过去的事实,计算短暂的将来,预测是不准确的。
c)显示运动的轨迹可以帮助人主观反映出未来的轨迹。
3、摄像头在3D空间内移动时a)追踪被锁定的对象以达到去抖动的目的。
4、用户操作a)指定被追踪的对象,控制焦距和对象的显示位置。
b)设定自动追踪的对象轮廓模板。
摄像头采集的数据是连续的流,每秒最少有25帧,每一帧之间都包含大量相同的区域,这种相同的区域也可能改变了位置;同时,还存在变化的区块,它们可能是新进入视野的像素,也可能是由于视野内部物体发生旋转,景深改变,或者物体本身形变。
想法:模式匹配,有一串字符T=”qwertyuiopasdfghjklzxcvbnm”,还有一个子字符串t=”we”,模式匹配的过程就是寻找t在T中首次出现的位置,返回首次出现或者每次出现的位置。
每一个字符信息都包含在24px*24px的矩阵里,T字符串就是一个24px*(24*26)px的矩阵,模式匹配的过程就变成了以24px*24px为单位分割T,形成一组与目标矩阵大小相同的矩阵的集合,然后t依次与集合的元素比较。
但是这并不是解决方案,如果T=“.”,那么上面的过程就无法匹配出结果,因为不能将空间主观的等分,如果要等分的话,就要确定一个矩阵的大小,他不能隐藏特征信息,同时具有等分带来的优点;如果t=”we”是一个移动的“物体”,那么他的移动方向只能是沿着 X轴的,这不符合设想中物体的自由运动;这不包括物体本身改变的情况,比如t=“O”。
目标跟踪算法综述

目标跟踪算法综述大连理工大学卢湖川一、引言目标跟踪是计算机视觉领域的一个重要问题,在运动分析、视频压缩、行为识别、视频监控、智能交通和机器人导航等很多研究方向上都有着广泛的应用。
目标跟踪的主要任务是给定目标物体在第一帧视频图像中的位置,通过外观模型和运动模型估计目标在接下来的视频图像中的状态。
如图1所示。
目标跟踪主要可以分为5部分,分别是运动模型、特征提取、外观模型、目标定位和模型更新。
运动模型可以依据上一帧目标的位置来预测在当前帧目标可能出现的区域,现在大部分算法采用的是粒子滤波或相关滤波的方法来建模目标运动。
随后,提取粒子图像块特征,利用外观模型来验证运动模型预测的区域是被跟踪目标的可能性,进行目标定位。
由于跟踪物体先验信息的缺乏,需要在跟踪过程中实时进行模型更新,使得跟踪器能够适应目标外观和环境的变化。
尽管在线目标跟踪的研究在过去几十年里有很大进展,但是由被跟踪目标外观及周围环境变化带来的困难使得设计一个鲁棒的在线跟踪算法仍然是一个富有挑战性的课题。
本文将对最近几年本领域相关算法进行综述。
二、目标跟踪研究现状1. 基于相关滤波的目标跟踪算法在相关滤波目标跟踪算法出现之前,大部分目标跟踪算法采用粒子滤波框架来进行目标跟踪,粒子数量往往成为限制算法速度的一个重要原因。
相关滤波提出了一种新颖的循环采样方法,并利用循环样本构建循环矩阵。
利用循环矩阵时域频域转换的特殊性质,将运算转换到频域内进行计算,大大加快的分类器的训练。
同时,在目标检测阶段,分类器可以同时得到所有循环样本得分组成的响应图像,根据最大值位置进行目标定位。
相关滤波用于目标跟踪最早是在MOSSE算法[1]中提出的。
发展至今,很多基于相关滤波的改进工作在目标跟踪领域已经取得很多可喜的成果。
1.1. 特征部分改进MOSSE[1] 算法及在此基础上引入循环矩阵快速计算的CSK[2]算法均采用简单灰度特征,这种特征很容易受到外界环境的干扰,导致跟踪不准确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TLD目标跟踪算法一、算法的背景TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek出的一种新的单目标长时间(long term tracking)跟踪算法。
该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。
同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、鲁棒、可靠。
对于长时间跟踪而言,一个关键的问题是:当目标重新出现在相机视野中时,系统应该能重新检测到它,并开始重新跟踪。
但是,长时间跟踪过程中,被跟踪目标将不可避免的发生形状变化、光照条件变化、尺度变化、遮挡等情况。
传统的跟踪算法,前端需要跟检测模块相互配合,当检测到被跟踪目标之后,就开始进入跟踪模块,而此后,检测模块就不会介入到跟踪过程中。
但这种方法有一个致命的缺陷:即,当被跟踪目标存在形状变化或遮挡时,跟踪就很容易失败;因此,对于长时间跟踪,或者被跟踪目标存在形状变化情况下的跟踪,很多人采用检测的方法来代替跟踪。
该方法虽然在某些情况下可以改进跟踪效果,但它需要一个离线的学习过程。
即:在检测之前,需要挑选大量的被跟踪目标的样本来进行学习和训练。
这也就意味着,训练样本要涵盖被跟踪目标可能发生的各种形变和各种尺度、姿态变化和光照变化的情况。
换言之,利用检测的方法来达到长时间跟踪的目的,对于训练样本的选择至关重要,否则,跟踪的鲁棒性就难以保证。
考虑到单纯的跟踪或者单纯的检测算法都无法在长时间跟踪过程中达到理想的效果,所以,TLD方法就考虑将两者予以结合,并加入一种改进的在线学习机制,从而使得整体的目标跟踪更加稳定、有效。
简单来说,TLD算法由三部分组成:跟踪模块、检测模块、学习模块;如下图所示其运行机制为:检测模块和跟踪模块互补干涉的并行进行处理。
首先,跟踪模块假设相邻视频帧之间物体的运动是有限的,且被跟踪目标是可见的,以此来估计目标的运动。
如果目标在相机视野中消失,将造成跟踪失败。
检测模块假设每一个视帧都是彼此独立的,并且根据以往检测和学习到的目标模型,对每一帧图片进行全图搜索以定位目标可能出现的区域。
同其它目标检测方法一样,TLD中的检测模块也有可能出现错误,且错误无非是错误的负样例和错误的正样例这两种情况。
而学习模块则根据跟踪模块的结果对检测模块的这两种错误进行评估,并根据评估结果生成训练样本对检测模块的目标模型进行更新,同时对跟踪模块的“关键特征点”进行更新,以此来避免以后出现类似的错误。
TLD模块的详细;流程框图如下所示:二、具体的算法流程三、在分析代码程序过程遇到的问题OpencvTLD算法代码l流程详解:1、分析程序运行的命令行参数;./run_tld -p ../parameters.yml -s ../datasets/06_car/car.mpg -b ../datasets/06_car/init.txt –r2、读入初始化参数(程序中变量)的文件parameters.yml;3、通过文件或者用户鼠标框选的方式指定要跟踪的目标的Bounding Box;4、用上面得到的包含要跟踪目标的Bounding Box和第一帧图像去初始化TLD系统, tld.init(last_gray, box, bb_file); 初始化包含的工作如下:4.1、buildGrid(frame1, box);检测器采用扫描窗口的策略:扫描窗口步长为宽高的 10%,尺度缩放系数为1.2;此函数构建全部的扫描窗口grid,并计算每一个扫描窗口与输入的目标box的重叠度;重叠度定义为两个box的交集与它们的并集的比;4.2、为各种变量或者容器分配内存空间;4.3、getOverlappingBoxes(box, num_closest_init);此函数根据传入的box(目标边界框),在整帧图像中的全部扫描窗口中(由上面 4.1得到)寻找与该box距离最小(即最相似,重叠度最大)的num_closest_init(10)个窗口,然后把这些窗口归入good_boxes容器。
同时,把重叠度小于0.2的,归入bad_boxes容器;相当于对全部的扫描窗口进行筛选。
并通过BBhull函数得到这些扫描窗口的最大边界。
4.5、classifier.prepare(scales);准备分类器,scales容器里是所有扫描窗口的尺度,由上面的buildGrid()函数初始化;TLD的分类器有三部分:方差分类器模块、集合分类器模块和最近邻分类器模块;这三个分类器是级联的,每一个扫描窗口依次全部通过上面三个分类器,才被认为含有前景目标。
这里prepare这个函数主要是初始化集合分类器模块;集合分类器(随机森林)基于n个基本分类器(共10棵树),每个分类器(树)都是基于一个pixel comparisons(共13个像素比较集)的,也就是说每棵树有13个判断节点(组成一个pixel comparisons),输入的图像片与每一个判断节点(相应像素点)进行比较,产生0或者1,然后将这13个0或者1连成一个13位的二进制码x(有2^13种可能),每一个x对应一个后验概率P(y|x)= #p/(#p+#n) (也有2^13种可能),#p 和#n分别是正和负图像片的数目。
那么整一个集合分类器(共10个基本分类器)就有10个后验概率了,将10个后验概率进行平均,如果大于阈值(一开始设经验值0.65,后面再训练优化)的话,就认为该图像片含有前景目标;后验概率P(y|x)= #p/(#p+#n)的产生方法:初始化时,每个后验概率都得初始化为0;运行时候以下面方式更新:将已知类别标签的样本(训练样本)通过n个分类器进行分类,如果分类结果错误,那么相应的#p和#n就会更新,这样P(y|x)也相应更新了。
pixel comparisons的产生方法:先用一个归一化的patch去离散化像素空间,产生所有可能的垂直和水平的pixel comparisons,然后我们把这些pixel comparisons随机分配给n个分类器,每个分类器得到完全不同的pixel comparisons(特征集合),这样,所有分类器的特征组统一起来就可以覆盖整个patch了。
特征是相对于一种尺度的矩形框而言的,TLD中第s种尺度的第i个特征features[s][i] = Feature(x1, y1, x2, y2);是两个随机分配的像素点坐标(就是由这两个像素点比较得到0或者1的)。
每一种尺度的扫描窗口都含有totalFeatures = nstructs * structSize个特征;nstructs为树木(由一个特征组构建,每组特征代表图像块的不同视图表示)的个数;structSize为每棵树的特征个数,也即每棵树的判断节点个数;树上每一个特征都作为一个决策节点;prepare函数的工作就是先给每一个扫描窗口初始化了对应的pixel comparisons(两个随机分配的像素点坐标);然后初始化后验概率为0;4.6、generatePositiveData(frame1, num_warps_init);此函数通过对第一帧图像的目标框box(用户指定的要跟踪的目标)进行仿射变换来合成训练初始分类器的正样本集。
具体方法如下:先在距离初始的目标框最近的扫描窗口内选择10个bounding box(已经由上面的getOverlappingBoxes函数得到,存于good_boxes里面了,还记得不?),然后在每个bounding box的内部,进行±1%范围的偏移,±1%范围的尺度变化,±10%范围的平面内旋转,并且在每个像素上增加方差为5的高斯噪声(确切的大小是在指定的范围内随机选择的),那么每个box都进行20次这种几何变换,那么10个box将产生200个仿射变换的bounding box,作为正样本。
具体实现如下:getPattern(frame(best_box), pEx, mean, stdev);此函数将frame图像best_box区域的图像片归一化为均值为0的15*15大小的patch,存于pEx(用于最近邻分类器的正样本)正样本中(最近邻的box的Pattern),该正样本只有一个。
generator(frame, pt, warped, bbhull.size(), rng);此函数属于PatchGenerator 类的构造函数,用来对图像区域进行仿射变换,先RNG一个随机因子,再调用()运算符产生一个变换后的正样本。
classifier.getFeatures(patch, grid[idx].sidx, fern);函数得到输入的patch的特征fern(13位的二进制代码);pX.push_back(make_pair(fern, 1)); //positive ferns <features, labels=1>然后标记为正样本,存入pX(用于集合分类器的正样本)正样本库;以上的操作会循环 num_warps * good_boxes.size()即20 * 10 次,这样,pEx就有了一个正样本,而pX有了200个正样本了;4.7、meanStdDev(frame1(best_box), mean, stdev);统计best_box的均值和标准差,var = pow(stdev.val[0],2) * 0.5;作为方差分类器的阈值。
4.8、generateNegativeData(frame1);由于TLD仅跟踪一个目标,所以我们确定了目标框了,故除目标框外的其他图像都是负样本,无需仿射变换;具体实现如下:由于之前重叠度小于0.2的,都归入 bad_boxes了,所以数量挺多,把方差大于var*0.5f的bad_boxes都加入负样本,同上面一样,需要classifier.getFeatures(patch, grid[idx].sidx, fern);和nX.push_back(make_pair(fern, 0));得到对应的fern特征和标签的nX负样本(用于集合分类器的负样本);然后随机在上面的bad_boxes中取bad_patches(100个)个box,然后用getPattern函数将frame图像bad_box区域的图像片归一化到15*15大小的patch,存在nEx(用于最近邻分类器的负样本)负样本中。
这样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[i] ,如果样本是正样本标签,先用measure_forest函数返回该样本所有树的所有特征值对应的后验概率累加值,该累加值如果小于正样本阈值(0.6* nstructs,这就表示平均值需要大于0.6(0.6* nstructs / nstructs),0.6是程序初始化时定的集合分类器的阈值,为经验值,后面会用测试集来评估修改,找到最优),也就是输入的是正样本,却被分类成负样本了,出现了分类错误,所以就把该样本添加到正样本库,同时用update函数更新后验概率。