OpenCV上的8种目标检测算法,优势和局限性,如何使用?

目标跟踪作为机器学习的一个重要分支,因其在日常生活和军事行动中的广泛应用而备受关注。在AI趋势下,大家想必都接触过深度学习和目标跟踪:通过大量的数据集在GPU上训练出想要使用的垂直场景,然后在实际场景中使用。但问题是,大多数人都有 CPU。有没有办法在他们的计算机上使用 CPU 来实现自己的目标跟踪能力。OpenCV 的跟踪 API 给出了答案:我可以。

在本文中,我们将介绍 OpenCV 上的 8 种目标检测算法,它们的优点和局限性,然后给出代码示例,如何使用它。我们的目标不是对每个tracker有深入的理论理解,而是从实际使用的角度去理解它们。

目标跟踪基础

视频对象跟踪的期望是在当前帧中正确地找到被跟踪的对象,因为我们已经成功地跟踪了所有(或几乎所有)先前帧中的对象,所以我们知道对象是如何移动的。换句话说,我们知道运动模型的参数。运动模型只是一种奇特的说法,即物体的位置和速度(速度+运动方向)在前一帧中是已知的。而如果你对物体一无所知,你可以根据当前的运动模型来预测新的位置,这与物体的新位置非常接近。

我们还可以建立一个外观模型来编码对象的外观。外观模型可用于在运动模型预测的位置的邻域内进行搜索,以便更准确地预测对象的位置。

对象跟踪可以描述为:运动模型预测对象的大致位置。外观模型微调此估计,以根据外观提供更准确的估计。

如果对象非常简单并且外观没有变化,我们可以使用一个简单的模板作为外观模型并寻找该模板。然而,现实生活并非如此简单。物体的外观可能会发生显着变化。为了解决这个问题,在许多现代跟踪器中,这个外观模型是一个在线训练的分类器。

分类器的任务是将图像的一个矩形区域分类为物体或背景。分类器接受一个图像区域作为输入,并返回一个介于 0 和 1 之间的分数,表示图像区域包含对象的概率。如果图像区域被确定为背景,则得分为0;如果该区域被确定为对象,则得分为 1。

在机器学习中opencv中识别行人的脚,我们使用“在线”一词来指代在运行时动态训练的算法。离线分类器可能需要数千个示例来训练分类器,但在线分类器通常在运行时使用很少的示例进行训练。

分类器通过提供正面(对象)和负面(背景)示例进行训练。如果你想建立一个检测猫的分类器,你可以用数千张有猫和没有猫的图像来训练它。通过这种方式,分类器学会区分什么是猫,什么不是。

OpenCV 中的八种目标跟踪算法

1、GOTURN 追踪器

Goturn 是一种基于深度学习的目标跟踪算法。最初的实现是在 Caffe 中,现在已被移植到 OpenCV 跟踪 API。

Goturn 是一种基于深度学习的跟踪算法,是 General Object Tracking for Regression Networks 的简称。大多数跟踪算法都是在线训练的。换句话说,跟踪算法在运行时学习被跟踪对象的外观。

因此,许多实时跟踪器依赖于在线学习算法,这些算法通常比基于深度学习的解决方案快得多。

Goturn 改变了我们将深度学习应用于跟踪问题的方式,离线学习对象的运动。Goturn 模型在数千个视频序列上进行训练,不需要在运行时执行任何学习。

Goturn 是如何工作的?

Goturn 由 David Holded、Sebastian Thrun 和 Silvio Savarese 在题为“Learning 100 fps Tracking with Deep Regression Networks”的论文中介绍。

图1 GoTurn示意图

如图 1 所示,Goturn 使用一对来自数千个视频的裁剪帧进行训练。

在第一帧(也称为前一帧)中,对象的位置是已知的,帧被裁剪为对象周围边界框大小的两倍。第一个裁剪框中的对象始终居中。

需要预测对象在第二帧(也称为当前帧)中的位置。用于裁剪第一帧的边界框也用于裁剪第二帧。因为对象可能已经移动,所以在第二帧中对象可能不在中心是一个高概率事件。

训练卷积神经网络 (CNN) 以预测第二帧中边界框的位置。

Goturn架构

在 Goturn 的工作原理中,我们看到了一个黑盒子,而 Goturn 架构让我们能够了解盒子里隐藏着什么。

图 2 Goturn 架构

图 2 展示了 Goturn 的架构。如前所述,它需要两个裁剪的帧作为输入。

注意:在图2中,上一帧显示在底部并居中,我们的目标是找到当前帧的边界框,显示在顶部。

两帧都经过一组卷积层。这些层只是 caffenet 架构的前五个卷积层。这些卷积层的输出(即 pool5 特征)被连接成一个长度为 4096 的向量。这个向量被馈送到 3 个全连接层。最后一个全连接层最终连接到包含 4 个节点的输出层,这些节点代表边界框的顶部和底部点。

(每当我们看到一组卷积层并对它们的含义感到困惑时,将它们视为改变原始图像的过滤器,以便保留图像中的重要信息并丢弃图像中的不重要信息。

通过简单地展开张量,将卷积滤波器结束时获得的多维图像(张量)转换为长数值向量。这个向量被用作几个全连接层的输入,最后是输出层。全连接层可以看作是一种学习算法,它利用卷积层从图像中提取的有用信息来解决现有的分类或回归问题。)

与其他基于深度学习的跟踪器相比,Goturn 更快。它在 caffe 的 gpu 上以 100fps 的速度运行,在 opencv cpu 上以 20fps 的速度运行。尽管跟踪器是通用的,但理论上可以通过使用特定类型的对象偏移传输集来在特定对象(例如行人)上获得更好的结果。

局限性:神经网络体现的优势往往是它们的劣势。神经网络依赖于训练集中的样本可以表示的场景种类,不存在的场景就会出现问题。在实际使用中,如果你想追踪你的手掌,当你将手掌移到你的脸上时,追踪器会锁定在你的脸上,而不是在你的手掌上。在跟踪人脸并用手遮住人脸的同时,跟踪器可以跟踪通过遮挡的人脸,这说明在训练集中存在大量手掌遮住人脸的场景。

2、提升追踪器

该跟踪器基于在线版本的 ADaboost,该算法内部用于基于 HAAR 级联的人脸检测器。这个分类器需要在运行时使用对象的正面和负面示例进行训练。以用户(或其他物体检测算法)提供的初始边界框作为物体的正例,以边界框外的许多图像部分作为背景。给定一个新帧,分类器在前一个位置附近的每个像素上运行,并记录分类器的分数。对象的新位置是得分最高的位置。

缺点:速度慢,性能差,跟踪失败后无法及时呈现错误报告。

3、MIL 跟踪器

这个跟踪器的概念类似于上面描述的 BOOSTING Tracker。最大的区别在于,它不仅仅将对象的当前位置视为正例,而是在当前位置周围的一个小邻域中查找,以生成几个潜在的正例。您可能认为这是一个坏主意,因为在这些“正面”示例中,大多数对象都没有居中。

这就是多实例学习 (mil) 派上用场的地方。在 mil 中,您不指定正面和负面示例,而是指定正面和负面“袋子”。正面图像集合并不都是正面的例子。前袋包含一个以对象当前位置为中心的区域,以及它周围的一个小邻域。即使跟踪对象的当前位置不准确,当将来自当前位置附近的样本放入正包中时,该包很有可能包含至少一张图像并且对象很好地居中。

优点:性能好。它不像增强跟踪器那样漂移,并且在部分遮挡中工作正常。

缺点:故障率高。

4、KCF 追踪器

KCF 代表核化相关滤波器。该跟踪器建立在前两个跟踪器中提出的想法之上。该跟踪器利用了 MIL 跟踪器中使用的多个正样本具有较大重叠区域的事实。这种重叠数据导致了一些很好的数学特性,跟踪器利用这些特性使跟踪更快、更准确。

优点:比 MIL 跟踪器更好的准确性和速度,它比 BOOSTING 和 MIL 跟踪算法更好地报告跟踪失败。

缺点:无法从完全遮挡中恢复。

5、TLD 追踪器

TLD 代表跟踪、学习和检测。顾名思义opencv中识别行人的脚,这个跟踪器将长期跟踪任务分解为三个组件(短期)跟踪、学习和检测。在作者的论文中,“跟踪器从一帧到另一帧跟踪对象。检测器定位到目前为止观察到的所有外观,并在必要时纠正跟踪器。学习估计检测器的错误并更新它以避免将来出现这些错误。 ” 这个跟踪器的输出有点跳跃。例如,如果您正在跟踪行人并且场景中有其他行人,则此跟踪器有时可以临时跟踪与您正在跟踪的行人不同的行人。从积极的方面来说,这条轨迹似乎以更大的比例、运动和遮挡来跟踪对象。

优点:在多帧遮挡下效果最佳。此外,跟踪最佳的超大规模变化。

缺点:很多误报使它几乎无法使用。

6、媒体流量追踪器

在内部,跟踪器实时跟踪对象的前后方向并测量两个轨迹之间的差异。最小化这种前后误差使他们能够可靠地检测跟踪失败并在视频序列中选择可靠的轨迹。

在测试中,发现该跟踪器最适合可预测的运动和小物体。与其他跟踪者不同,跟踪者知道跟踪者何时失败,即使跟踪者明显失败。

优点:出色的跟踪失败报告。当运动是可预测的并且没有遮挡时,它的效果非常好。

缺点:大规模运动跟踪,模型会失败。

7、苔藓追踪器

最小二乘误差输出和 (mosse) 使用自适应相关进行对象跟踪,当用单帧初始化时,会产生稳定的相关滤波器。Mosse 跟踪器对光照、比例、姿势和非刚性变形的变化具有鲁棒性。对于遮挡,跟踪器能够在对象重新出现时暂停并从中断处恢复。

优点:速度快。

缺点:准确率不如CSRT和KCF高。

8、CSRT 追踪器

在具有通道和空间可靠性的判别相关滤波器 (DCF-CSR) 中,我们使用空间可靠性图来调整从帧到选定区域的一部分以进行跟踪的滤波器支持。这确保了选定区域的放大和定位,并改进了对非矩形区域或对象的跟踪。它只使用两个标准函数(HoGs 和 Colornames)。它还可以在相对较低的 fps (25 fps) 下工作,但提供更高的目标跟踪精度。

优点:精度比KCR高。

缺点:速度较慢。

使用代码实现的OpenCV跟踪算法(C)

1、创建跟踪算法

2、初始化跟踪算法

3、跟踪监控刷新,获取下一帧跟踪目标的坐标(x,y,width,height)

4、使用坐标进行跟踪所需的操作,比如图片框等。

实际测试结果对比

图 1 初始跟踪;图 2 运动后跟踪

如上面的跟踪算法所示,CBA比赛作为跟踪对象。从跟踪过程中的两帧数据,可以感知不同跟踪算法在动态字符变化上的差异。

1、MEDIAFLOW, BOOSTING, MIL 在字符大小发生变化时不适合跟踪,无法跟踪目标。

2、CSRT和KCF都可以很好的跟踪运动画面,但是在遮挡场景下无法支持,效果很差。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论