目标跟踪算法

在本节中,我们将挖掘一些不同的跟踪算法。我们的目标不是对每一个跟踪器有深刻的理论理解,而是从实践的角度来理解它们。

让我们首先先解释一下跟踪的一些基本原理。在跟踪中,我们的目标是在当前帧中找到一个对象,此对象已经在所有(或几乎所有)先前帧中成功被跟踪到了。

由于我们已经跟踪对象直到当前帧,我们知道它是如何移动的。 换句话说,我们知道运动模型的参数。 运动模型指你知道的对象在之前的帧中的位置和速度(速度+运动方向)。 如果你对对象没有其他了解,你可以根据当前的运动模型预测新位置,并且你的预测将非常接近对象的新位置。

但是一般我们有更多关于对象运动的信息。 我们知道对象在每个先前帧中长什么样。 换句话说,我们可以构建一个外观模型来编码对象的外观。 该外观模型可以用于在由运动模型预测的位置的小邻域中搜索,以更精确地预测对象的位置。

“运动模型预测对象的大致位置。 外观模型微调这个估计以基于外观提供更准确的估计。”

如果对象很简单,在整个跟踪过程中并没有改变它的外观很多,我们可以使用一个简单的模板作为外观模型,并寻找那个模板(opencv有个模板匹配) ,然而,现实生活通常不是那么简单(复杂目标跟踪哈哈哈哈)。 对象的外观可能会发生巨大变化。 为了解决这个问题,在许多跟踪器中,该外观模型是以在线方式训练的分类器。

分类器的工作是将图像的矩形区域分类为对象或背景。 分类器接受图像块(patch)作为输入,并返回0和1之间的分数,以指示图像块包含对象的概率。当绝对确定图像块是背景时,分数为0,当绝对确定图像块是对象时,分数为1。

在机器学习中,我们使用“在线”这个词来指代在运行时在运行中训练的算法。 离线分类器可能需要数千个示例来训练分类器,但是在运行时通常使用非常少的示例训练在线分类器。

分类器通过馈送正(对象)和负(背景)样本来训练。 如果你想创建一个分类器来检测猫,你需要训练一个包含成千上万包含猫的图像和数千不包含猫的图像的分类器。 这样分类器学习区分什么是猫和什么不是猫。 你可以在这里https://www.learnopencv.com/image-recognition-and-object-detection-part1了解有关图像分类的更多信息。 在建立在线分类器时,我们没有成千上万的正和负的例子。

让我们来看看不同的跟踪算法如何处理这个在线训练问题。

BOOSTING跟踪器

此跟踪器基于AdaBoost的在线版本 - 基于HAAR级联的人脸检测器算法。 这个分类器需要在运行时用目标的正和负例子训练。 由用户提供的初始边界框(或由另一个对象检测算法)作为目标的正例,并且边界框外部的许多图像块被当作背景。给一新帧,对先前位置的邻域中的每个像素运行分类器,并记录分类器的得分。 目标的新位置是得分最大的位置。 所以现在我们分类器有不止一个正样本随着更多的帧的到来,分类器用该附加数据更新。

优点:无。 这个算法是十年前并且可以运用,但我找不到一个很好的理由使用它,特别是当其他高级跟踪器(MIL,KCF)基于类似的原理可用。

缺点:跟踪性能平庸。

MIL跟踪器

此跟踪器在概念上类似于上述的BOOSTING跟踪器。 最大的区别在于,不仅考虑对象的当前位置作为正样本,它在当前位置周围的小邻域中生成若干潜在的正样本。 你可能认为这是一个坏主意,因为在大多数这些周围的正样本中,对象不是中心。

 在MIL(多样例学习)中,你没有指定正和负样本,但是有正和负“包”。正包中的图像集合并不都是正样本。 相反,只有一个图像在积极的包里需要一个正样本。在我们的示例中,正包包含以对象的当前位置为中心的图像块,以及在其周围的小邻域中的图像块。 即使被跟踪目标的当前位置不准确,当来自当前位置的邻域的样本被放入正包中时,很有可能这个包包含至少一个图像,其中目标被良好地置于居中。MIL主页:http://vision.ucsd.edu/~bbabenko/new/project_miltrack.shtml

优点:性能相当不错。 它不像BOOSTING跟踪器那样漂移,它在部分遮挡下也合理地工作。如果你使用OpenCV 3.0,这可能是你可用的最好的跟踪。 但是如果你使用更高版本,考虑KCF。

缺点:跟踪失败不能被可靠地报告。不能从完全闭塞恢复。

KCF跟踪器

KFC代表(kernelized CorrelationFilter)内核化相关滤波器。 这个跟踪器的灵感来源于前两个跟踪器提出的想法。 该跟踪器利用了这样的事实,即在MIL跟踪器中使用的多个正样本具有大的重叠区域。 这种重叠的数据导致一些良好的数学特性,利用这个跟踪器,使跟踪更快,同时更准确。

优点:准确度和速度都比MIL更好,它报告跟踪失败比BOOSTING和MIL更好。 如果您使用OpenCV 3.1和更高版本,我建议对于大多数应用程序使用这个。

缺点:不能从完全闭塞恢复。 未在OpenCV3.0中实现。

Bug警告:在OpenCV 3.1(仅限Python)中有一个错误,因为返回了不正确的边界框。 参见错误报告。

TLD跟踪器

(广告一下,大家可以参考我之前的TLD的博文哈哈哈)

TLD代表跟踪,学习和检测。顾名思义,该跟踪器将长期跟踪任务分解为三个组件 - (短期)跟踪,学习和检测。从作者的论文,“跟踪器跟踪对象从一帧到帧。 检测器定位到目前为止观察到的所有外观,并在必要时校正跟踪器。 学习估计检测器的错误并更新它以避免未来的这些错误。“这个跟踪器的输出往往会跳一下。 例如,如果你正在跟踪行人,并且场景中还有其他行人,则该跟踪器有时可以临时跟踪与您要跟踪的行人不同的行人。更积极的一面,这条轨道似乎在更大的规模,运动和遮挡下跟踪物体。 如果你有一个视频序列,其中的目标隐藏在另一个对象后面,这个跟踪器可能是一个不错的选择。

优点:在多个帧的遮挡下工作最好。 此外,对于目标的尺度变化跟踪最佳。

缺点:很多false postives,使它几乎不可用。(个人觉得这个有点夸张,用的挺好的呀,而且人家作者都开公司了,做出成熟的产品了)

MEDIANFLOW跟踪器

在内部,该跟踪器在时间上向前和向后方向上跟踪对象,并且测量这两个轨迹之间的差异(此思想TLD也有,而且opencv中也实现了,用的LK跟踪) 最小化。该Forward-Backward错误使它们能够可靠地检测跟踪失败并在视频序列中选择可靠的轨迹。

在我的测试中,我发现这个跟踪器在运动是可预测和小规模的时候效果最好。 与其他跟踪器不同,即使跟踪明显失败,该跟踪器知道跟踪失败的时间。

优点:优秀的跟踪失败报告。 当运动是可预测的并且没有遮挡时工作得很好。

缺点:在大规模运动下失败。

GOTURN跟踪器

在跟踪器类中的所有跟踪算法中,这是基于卷积神经网络(CNN)的唯一一种。 它也是唯一一个使用离线训练模型,因此它比其他跟踪器更快。 从OpenCV文档,我们知道它“对视角变化,照明变化和变形是强大的”。 但它不能很好地处理遮挡。

哈哈哈哈,打完收工~回家看孩子去!!!