使用dlib进行对象跟踪

您所在的位置:网站首页 opencv跟踪器 使用dlib进行对象跟踪

使用dlib进行对象跟踪

2023-03-25 13:12| 来源: 网络整理| 查看: 265

几个月前,我们讨论了质心跟踪,这是一种简单而有效的方法,可以(1)为图像中的每个对象分配唯一的ID,然后(2)在视频流中移动时跟踪每个对象和相关的ID。

此对象跟踪算法的最大缺点是必须在每个输入帧上运行单独的对象检测器 - 在大多数情况下,这种行为作为对象检测器是不合需要的,包括HOG + Linear SVM, Faster R-CNNs, and SSDs运行起来计算成本很高。

另一种方法是:

1、执行一次对象检测(或每N帧一次)

2、然后应用专用的跟踪算法,该算法可以在后续帧中移动时跟踪对象,而无需执行对象检测

学习如何应用dlib的相关跟踪器在视频流中实时跟踪对象。

使用dlib进行对象跟踪

我们将从今天的教程开始,简要讨论dlib实现基于相关性的对象跟踪。

从那里我将向您展示如何在您自己的应用程序中使用dlib的对象跟踪器。

最后,我们将通过讨论dlib的对象跟踪器的一些限制和缺点来结束。

什么是相关跟踪器?

实现我们的dlib对象跟踪器

让我们继续使用dlib开始实现我们的对象跟踪器。

打开track_object.py并插入以下代码:

我们将使用经过预先培训的MobileNet SSD在单个帧中执行对象检测。从那里,对象位置将被传递给dlib的相关跟踪器,以便在视频的剩余帧中进行跟踪。

“下载”中包含的模型在第27-30行支持20个对象类(加上背景类为1)。

注意:如果您使用的是其他Caffe模型,则需要重新定义此CLASSES列表。同样,如果您使用今天下载中包含的模型,请不要修改此列表。如果您对学习对象探测器的工作深度感到困惑,请务必参考此入门指南。

在循环帧之前,我们需要将模型加载到内存中。这在第34行处理,其中加载Caffe模型所需的全部是原型文本和模型文件的路径(两者都在我们的命令行args字典中提供)。

现在让我们执行重要的初始化,特别是我们的视频流:

我们的视频流,跟踪器和视频编写器对象在第39-41行初始化。我们还在第42行初始化我们的文字标签。

我们的每秒帧数估算器在第45行实例化。

现在我们已经准备好开始循环我们的视频帧了:

我们在第48行开始我们的while循环并继续在第50行抓取一个帧。

我们的框架调整大小,颜色通道在第58和59行交换。调整大小可以加快处理速度 - 您可以尝试框架尺寸以获得更高的FPS。 dlib需要转换为RGB颜色空间(OpenCV默认以BGR顺序存储图像)。

可选地,在运行时,可以通过命令行参数传递输出视频路径。因此,如有必要,我们将在第63-66行初始化我们的视频编写器。有关使用OpenCV将视频写入磁盘的更多信息,请参阅此前一篇文章。

接下来,我们需要检测一个跟踪对象(如果我们还没有):

如果我们的跟踪器对象为None(第71行),我们首先需要检测输入框架中的对象。为此,我们创建一个blob(第74行)并将其传递通过网络(第78和79行)。

我们现在处理检测:

如果我们的物体探测器找到任何物体(第82行),我们将抓住概率最大的物体(第88行)。

我们只是在这篇文章中演示如何使用dlib执行单个对象跟踪,因此我们需要找到概率最高的检测对象。下周的博客文章将介绍使用dlib进行多对象跟踪。

从那里,我们将获得与对象相关的置信度(conf)和标签(第92和93行)。

现在是时候筛选出检测结果了。在这里,我们试图确保我们拥有通过命令行参数传递的正确类型的对象:

在第97行,我们检查以确保conf超过置信度阈值,并且该对象实际上是我们正在寻找的类类型。当我们稍后运行脚本时,我们将使用“person”或“cat”作为示例,以便您可以看到我们如何过滤结果。

我们在第100行和第101行确定对象的边界框坐标。

然后我们建立我们的dlib对象跟踪器并提供边界框坐标(第106-108行)。从现在开始,未来的跟踪更新将很容易。

在第111-114行的框架上绘制边界框矩形和对象类标签文本。

让我们来处理我们已经建立跟踪器的情况:

这个else块处理我们已经锁定到对象进行跟踪的情况。

把它想象成电影中的混战,Top Gun。一旦敌方飞机被“引导系统”锁定,就可以通过更新跟踪它。

这需要我们采取两项主要行动:

更新我们的跟踪器对象(第121行) - 在此更新方法的后端执行繁重的提升。

从跟踪器中获取对象的位置(get_position)(第122行)。如果例如机器人试图跟踪被跟踪的物体,那么这将是PID控制回路将派上用场的地方。在我们的例子中,我们只是在第131-134行的边界框和标签上注释框架中的对象。

让我们完成循环:

如果帧应该写入视频,我们在第137和138行。

我们将在屏幕上显示框架(第141行)。

如果在播放+跟踪期间的任何一点按下退出键(“q”),我们将跳出循环(第142-146行)。

我们的fps估算器在149行更新。

最后,让我们在脚本退出之前执行打印FPS吞吐量统计和释放指针:

我们脚本的内务管理包括:

我们的fps计数器停止,FPS信息显示在终端中(第152-154行)。

然后,如果我们写入输出视频,我们将发布视频编写器(第157和158行)。

最后,我们关闭所有OpenCV窗口并释放视频流(第161和162行)。

实时运行dlib的对象跟踪器

要查看我们的dlib对象跟踪器的运行情况,请确保使用此博客文章的“下载”部分下载源代码。

从那里,打开一个终端并执行以下命令:

缺点和潜在的改进

与July’s质心跟踪的教程不同,dlib的对象跟踪算法可以利用从输入RGB图像获得的信息更新自身 - 该算法不需要为输入视频流中的每个帧计算一组边界框。

我们发现,dlib的相关跟踪算法非常强大,能够实时运行。

然而,最大的缺点是如果视点基本上变化或者如果要跟踪的对象被遮挡,则相关跟踪器可能变得“混乱”并丢失我们希望跟踪的对象。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3