转自http://johnhany.net/2014/05/tld-the-theory/

Tracking-Learning-Detection(TLD)是Zdenek Kalal提出的一种对视频中单个物体长时间跟踪的算法。我主要会根据他在2010年发表的论文《Tracking-Learning-Detection》来分析TLD算法的原理。该项目的首页中有几段视频展示了TLD实时跟踪的效果和性能,其中的两个视频可以在这里下载:similar objects,human face。作者公布了源代码,不过需要Matlab和Visual Studio交叉编译,在我的机器上没能运行。GitHub上有很多C++版本的TLD,比如arthurv,注释比较详细,但速度很慢。

由于我使用的插件默认对所有图片加水印,所以本文中使用的大多数并不是我绘制的图片也加上了水印,还请谅解。


正如名字所示,TLD算法主要由三个模块构成:追踪器(tracker),检测器(detector)和机器学习(learning)。

对于视频追踪来说,常用的方法有两种,一是使用追踪器根据物体在上一帧的位置预测它在下一帧的位置,但这样会积累误差,而且一旦物体在图像中消失,追踪器就会永久失效,即使物体再出现也无法完成追踪;另一种方法是使用检测器,对每一帧单独处理检测物体的位置,但这又需要提前对检测器离线训练,只能用来追踪事先已知的物体。

TLD是对视频中未知物体的长时间跟踪的算法。“未知物体”指的是任意的物体,在开始追踪之前不知道哪个物体是目标。“长时间跟踪”又意味着需要算法实时计算,在追踪中途物体可能会消失再出现,而且随着光照、背景的变化和由于偶尔的部分遮挡,物体在像素上体现出来的“外观”可能会发生很大的变化。从这几点要求看来,单独使用追踪器或检测器都无法胜任这样的工作。所以作者提出把追踪器和检测器结合使用,同时加入机器学习来提高结果的准确度。

追踪器的作用是跟踪连续帧间的运动,当物体始终可见时跟踪器才会有效。追踪器根据物体在前一帧已知的位置估计在当前帧的位置,这样就会产生一条物体运动的轨迹,从这条轨迹可以为学习模块产生正样本(Tracking->Learning)。

检测器的作用是估计追踪器的误差,如果误差很大就改正追踪器的结果。检测器对每一帧图像都做全面的扫描,找到与目标物体相似的所有外观的位置,从检测产生的结果中产生正样本和负样本,交给学习模块(Detection->Learning)。算法从所有正样本中选出一个最可信的位置作为这一帧TLD的输出结果,然后用这个结果更新追踪器的起始位置(Detection->Tracking)。

学习模块根据追踪器和检测器产生的正负样本,迭代训练分类器,改善检测器的精度(Learning->Detection)。


追踪模块

TLD使用作者自己提出的Median-Flow追踪算法。

作者假设一个“好”的追踪算法应该具有正反向连续性(forward-backward consistency),即无论是按照时间上的正序追踪还是反序追踪,产生的轨迹应该是一样的。作者根据这个性质规定了任意一个追踪器的FB误差(forward-backward error):从时间t的初始位置x(t)开始追踪产生时间t+p的位置x(t+p),再从位置x(t+p)反向追踪产生时间t的预测位置x`(t),初始位置和预测位置之间的欧氏距离就作为追踪器在t时间的FB误差。

Median-Flow追踪算法采用的是Lucas-Kanade追踪器,也就是常说的光流法追踪器。这个追踪器的原理就不在这里解释了。只需要知道给定若干追踪点,追踪器会根据像素的运动情况确定这些追踪点在下一帧的位置。

追踪点的选择

作者给出了一种依据FB误差绘制误差图(Error Map)筛选最佳追踪点的方法,但并不适用于实时追踪任务,就不详细介绍了。这里只介绍在TLD中确定追踪点的方法。

首先在上一帧t的物体包围框里均匀地产生一些点,然后用Lucas-Kanade追踪器正向追踪这些点到t+1帧,再反向追踪到t帧,计算FB误差,筛选出FB误差最小的一半点作为最佳追踪点。最后根据这些点的坐标变化和距离的变化计算t+1帧包围框的位置和大小(平移的尺度取中值,缩放的尺度取中值。取中值的光流法,估计这也是名称Median-Flow的由来吧)。

还可以用NCC(Normalized Cross Correlation,归一化互相关)和SSD(Sum-of-Squared Differences,差值平方和)作为筛选追踪点的衡量标准。作者的代码中是把FB误差和NCC结合起来的,所以筛选出的追踪点比原来一半还要少。

NCC:


学习模块

TLD使用的机器学习方法是作者提出的P-N学习(P-N Learning)。P-N学习是一种半监督的机器学习算法,它针对检测器对样本分类时产生的两种错误提供了两种“专家”进行纠正:

P专家(P-expert):检出漏检(false negative,正样本误分为负样本)的正样本;

N专家(N-expert):改正误检(false positive,负样本误分为正样本)的正样本。

样本的产生

用不同尺寸的扫描窗(scanning grid)对图像进行逐行扫描,每在一个位置就形成一个包围框(bounding box),包围框所确定的图像区域称为一个图像元(patch),图像元进入机器学习的样本集就成为一个样本。扫描产生的样本是未标签样本,需要用分类器来分类,确定它的标签。

如果算法已经确定物体在t+1帧的位置(实际上是确定了相应包围框的位置),从检测器产生的包围框中筛选出10个与它距离最近的包围框(两个包围框的交的面积除以并的面积大于0.7),对每个包围框做微小的仿射变换(平移10%、缩放10%、旋转10°以内),产生20个图像元,这样就产生200个正样本。再选出若干距离较远的包围框(交的面积除以并的面积小于0.2),产生负样本。这样产生的样本是已标签的样本,把这些样本放入训练集,用于更新分类器的参数。下图中的a图展示的是扫描窗的例子。

作者认为,算法的结果应该具有“结构性”:每一帧图像内物体最多只出现在一个位置;相邻帧间物体的运动是连续的,连续帧的位置可以构成一条较平滑的轨迹。比如像上图c图那样每帧只有一个正的结果,而且连续帧的结果构成了一条平滑的轨迹,而不是像b图那样有很多结果而且无法形成轨迹。还应该注意在整个追踪过程中,轨迹可能是分段的,因为物体有可能中途消失,之后再度出现。

P专家的作用是寻找数据在时间上的结构性,它利用追踪器的结果预测物体在t+1帧的位置。如果这个位置(包围框)被检测器分类为负,P专家就把这个位置改为正。也就是说P专家要保证物体在连续帧上出现的位置可以构成连续的轨迹;

N专家的作用是寻找数据在空间上的结构性,它把检测器产生的和P专家产生的所有正样本进行比较,选择出一个最可信的位置,保证物体最多只出现在一个位置上,把这个位置作为TLD算法的追踪结果。同时这个位置也用来重新初始化追踪器。

比如在这个例子中,目标车辆是下面的深色车,每一帧中黑色框是检测器检测到的正样本,黄色框是追踪器产生的正样本,红星标记的是每一帧最后的追踪结果。在第t帧,检测器没有发现深色车,但P专家根据追踪器的结果认为深色车也是正样本,N专家经过比较,认为深色车的样本更可信,所以把浅色车输出为负样本。第t+1帧的过程与之类似。第t+2帧时,P专家产生了错误的结果,但经过N专家的比较,又把这个结果排除了,算法仍然可以追踪到正确的车辆。


检测模块

检测模块使用一个级联分类器,对从包围框获得的样本进行分类。级联分类器包含三个级别:

图像元方差分类器(Patch Variance Classifier)。计算图像元像素灰度值的方差,把方差小于原始图像元方差一半的样本标记为负。论文提到在这一步可以排除掉一半以上的样本。

集成分类器(Ensemble Classifier)。实际上是一个随机蕨分类器(Random Ferns Classifier),类似于随机森林(Random Forest),区别在于随机森林的树中每层节点判断准则不同,而随机蕨的“蕨”中每层只有一种判断准则。

如上图所示,把左面的树每层节点改成相同的判断条件,就变成了右面的蕨。所以蕨也不再是树状结构,而是线性结构。随机蕨分类器根据样本的特征值判断其分类。从图像元中任意选取两点A和B,比较这两点的亮度值,若A的亮度大于B,则特征值为1,否则为0。每选取一对新位置,就是一个新的特征值。蕨的每个节点就是对一对像素点进行比较。

比如取5对点,红色为A,蓝色为B,样本图像经过含有5个节点的蕨,每个节点的结果按顺序排列起来,得到长度为5的二进制序列01011,转化成十进制数字11。这个11就是该样本经过这个蕨得到的结果。

同一类的很多个样本经过同一个蕨,得到了该类结果的分布直方图。高度代表类的先验概率p(F|C),F代表蕨的结果(如果蕨有s个节点,则共有1+2^s种结果)。

不同类的样本经过同一个蕨,得到不同的先验概率分布。

以上过程可以视为对分类器的训练。当有新的未标签样本加入时,假设它经过这个蕨的结果为00011(即3),然后从已知的分布中寻找后验概率最大的一个。由于样本集固定时,右下角公式的分母是相同的,所以只要找在F=3时高度最大的那一类,就是新样本的分类。

只用一个蕨进行分类会有较大的偶然性。另取5个新的特征值就可以构成新的蕨。用很多个蕨对同一样本分类,投票数最大的类就作为新样本的分类,这样在很大程度上提高了分类器的准确度。

最近邻分类器(Nearest Neighbor Classifier)。计算新样本的相对相似度,如大于0.6,则认为是正样本。相似度规定如下:

图像元pi和pj的相似度,公式里的N是规范化的相关系数,所以S的取值范围就在[0,1]之间,

正最近邻相似度,

负最近邻相似度,

相对相似度,取值范围在[0,1]之间,值越大代表相似度越高,


所以,检测器是追踪器的监督者,因为检测器要改正追踪器的错误;而追踪器是训练检测器时的监督者,因为要用追踪器的结果对检测器的分类结果进行监督。用另一段程序对训练过程进行监督,而不是由人来监督,这也是称P-N学习为“半监督”机器学习的原因。

TLD的工作流程如下图所示。首先,检测器由一系列包围框产生样本,经过级联分类器产生正样本,放入样本集;然后使用追踪器估计出物体的新位置,P专家根据这个位置又产生正样本,N专家从这些正样本里选出一个最可信的,同时把其他正样本标记为负;最后用正样本更新检测器的分类器参数,并确定下一帧物体包围框的位置。

Tracking-Learning-Detection原理分析相关推荐

  1. Tracking Learning Detection (TLD)目标跟踪算法原理详解~PPT版

  2. 鱼眼图像自监督深度估计原理分析和Omnidet核心代码解读

    作者丨苹果姐@知乎 来源丨https://zhuanlan.zhihu.com/p/508090405 编辑丨3D视觉工坊 在自动驾驶实际应用中,对相机传感器的要求之一是拥有尽可能大的视野范围,鱼眼相 ...

  3. ORB-SLAM2原理分析

    原理分析 ORB-SLAM2是一种基于单目.双目和RGB-D相机的实时视觉SLAM系统,用于在无GPS信号或有限的传感器信息情况下,构建三维地图并定位相机的位置和姿态.ORB-SLAM2采用了ORB特 ...

  4. 后门BROOTKIT代码学习和原理分析

    周末闲来无事,想找点东西学习一下,随手翻到了之前看到的一篇关于brootkit的文章,知道它是用Bash写的一个后门程序.刚好最近在做Bash相关的工作,就想着学习一下这方面的知识,稍作整理之后就有了 ...

  5. lr分析器的设计与实现_DCGAN原理分析与pytorch实现

    本文介绍的是DCGAN及其pytorch实现.DCGAN论文地址https://arxiv.org/pdf/1511.06434.pdf DCGAN论文全称为"Unsupervised Re ...

  6. 编译原理语义分析代码_Pix2Pix原理分析与代码解读

    原理分析: 图像.视觉中很多问题都涉及到将一副图像转换为另一幅图像(Image-to-Image Translation Problem),这些问题通常都使用特定的方法来解决,不存在一个通用的方法.但 ...

  7. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

  8. OpenCV——角点检测原理分析(Harris,Shi-Tomasi、亚像素级角点检测)

    一.角点(corner) 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法 ...

  9. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  10. 2021SC@SDUSC-PALISADE(三)BGV原理分析与python实现

    2021SC@SDUSC 目录 BGV原理分析 1 符号说明 2 多项式运算 3 Learning With Error 与 Ring Learning With Error 4 构建一个全同态体系 ...

最新文章

  1. 删文97篇!前UCLA教授竟是民科?不看好量子通信被禁言
  2. C++基础11-类和对象之操作符重载1
  3. centos常用网络管理命令
  4. Autolayout的简单介绍和示例代码
  5. C/C++ C# unity经常使用的一些快捷键
  6. (转)走进Smart Beta的世界
  7. 统计素数并求和python_C语言实现的统计素数并求和代码分享
  8. excel表格怎么关闭函数计算机,excel表格的数据如何去掉公式-如何取消Excel表格里面的函数公式...
  9. 计算机术语中的letters表示,letter是什么意思_letter在线翻译_英语_读音_用法_例句_海词词典...
  10. HTML+CSS制作知乎登录页面
  11. ROS 罗技手柄控制机器人(仿真和实体机器人)
  12. 知识、技能的区别与联系
  13. Android截取人物头像,Android 图片截取人物头像(仿逗拍)
  14. python数据库开发 dga_DGA detection based on Deep Learning (CNN and GRU) (基于深度学习的DGA检测)...
  15. Combining Compositional Models and Deep Networks For Robust Object Classification under Occlusion阅读
  16. 产品功能树图_ISO9001:2015标准条款之8.2.2产品和服务要求的确定解析
  17. 专利学习笔记4:权利要求书中的注意事项
  18. BP神经网络(地震数据反推测井曲线)
  19. python中如何进行数据类型转换_python数据类型的强制转换
  20. 前端调用打印机打印条码、二维码(一些坑)

热门文章

  1. 程序员 谨防猝死
  2. ERP与条码系统集成实现精益化可追溯
  3. ai文字渐变_AI制作渐变色立体文字效果
  4. CUDA中的数学函数
  5. 3. 工业大数据的创新价值
  6. 计算机ppt制作教案,《电脑幻灯我来秀—制作个性母版》教学设计
  7. 固态+机械双硬盘的双系统安装
  8. linux下目录压缩,Linux下 目录 压缩 解压缩 打包
  9. 苹果CMS10原生APP修改版 影视APP源码附安装教程
  10. 论文阅读: Inertia Tensor Properties in Robot Dynamics Identification: A Linear Matrix Inequality Approac