在这个深度学习时代,我们能够以惊人的速度和精度解决许多计算机视觉问题。
然而,多目标跟踪仍然是一项具有挑战性的任务。目前只有少数方法能够以合理的速度提供稳定的跟踪。
在这篇文章中,我们将讨论如何跟踪视频中的多个物体 - 我们将使用神经网络的组合来实现。
我们不会分享实现跟踪器的代码,但我们会提供一些技术片段,以便您将它们组合成一个良好的跟踪器,以及一些挑战和应用。
目标跟踪的一些应用
跟踪在许多现实生活中的用例中都有应用。
想象一下,您负责办公室占用管理,并且您希望了解员工如何使用它:他们通常如何在一天中在整个建筑物中移动,您是否有足够的会议室,以及是否存在使用不足或过度使用的空间。此外,您可能还想分析员工是否保持社交距离。对于所有这些任务,您需要检测和跟踪人员并分析他们如何利用空间。
另一个用例是零售空间管理:为了优化人们在杂货店购物的方式,您可能希望为每位访客构建跟踪路线并分析他们。您还可以分析为什么不同的空间布局会导致销售额发生变化:例如,如果货架移动,商店的某些区域可能会变得不那么受访,因为它们偏离了主通道。
在视频监控和安保中,您希望了解是否有人员或车辆未经授权进入限制区域。例如,您可能禁止在特定地点或方向行走,或在场所内奔跑。这些用例广泛应用于建筑工地等设施。
多目标跟踪的方法
现在,让我们只关注人员跟踪和计数 - 但相同的技术可以应用于各种其他物体。
解决多目标跟踪的一种常见方法是使用跟踪检测范式。要理解它,我们需要熟悉另外两种计算机视觉算法:**目标检测**和**行人再识别**。
目标检测
目标检测是目前最流行的计算机视觉算法之一。它的目标是在图像上找到所有感兴趣的物体并输出它们的边界框。它应用于各种物体 - 从汽车到细菌。但是,在我们的案例中,我们对人感兴趣 - 因此我们将进行行人检测。
多年来,行人检测几乎完全由深度学习算法解决。而且有充分的理由 - 尽管这个问题很困难,但神经网络在这方面非常出色。它们显着提高了检测的最新水平,从而使许多现实世界的应用成为可能 - 包括无人驾驶,在无人驾驶中,行人检测绝对没有误差容限。
尽管这个算法家族非常先进,但我们不能说行人检测是一个已解决的问题。通常,检测器仍然存在错误 - 例如,对不是人的物体进行误报,或对人进行漏报。稍后,我们将讨论这些错误对跟踪的影响程度。剧透:影响很大。
行人再识别
再识别算法,或再识别,需要能够识别不同图像上的同一个人。该网络的任务是构建一个数字向量,以某种方式从视觉上描述该人。对于同一个人的不同照片,这些向量应该相似,并且与描述其他人的外观的向量相比,它们应该尽可能地不同。
这种方法有两个分支
- **人脸再识别**依赖于人脸。它的工作原理与侦探电影中的情况完全一样:给定一张头部照片,它会在视频中找到那个人,例如在机场。但是,这种方法也有一些缺点:例如,它无法从后面检测某人。
- **全身再识别**使用人的整张图像。通过这种方式,它可以获得更多信息,即使从后面也能识别某人。但是,它的缺点是它只能在一天内使用 - 因为它在设计上严重依赖于服装,并且在人们更换服装时不起作用。
再识别为每个图像生成的向量可以被视为多维空间中的点。对于良好的再识别网络,对应于同一个人的不同照片的点将形成一个独立的簇。
对我们来说,重要的是,通过再识别,我们可以定量地比较检测结果的相似程度。在多目标跟踪中,我们需要在某人访问某个特定地点期间跟踪他们。因此,我们将使用全身再识别:我们将获得更多信息,并且我们不想跟踪某人好几天。
跟踪检测
现在让我们深入了解跟踪 - 并理解我们如何在其中组合检测和再识别。
我们将视频视为一系列连续帧。
想象一下,我们有两帧连续的视频。在每帧上,我们将首先使用目标检测神经网络检测人。这样,我们将获得每帧上的人的边界框。
然后我们将**匹配**第二帧的检测结果与第一帧的检测结果。
现在想象一下,我们对视频的许多帧执行了相同的过程。这样,我们将为我们看到的每一个人都有一个**跟踪路线**。
将跟踪路线与检测结果匹配
现在匹配是这里最棘手的部分。对于来自连续帧的两个检测结果,我们需要确定它们是否对应于同一个人。为此,我们将使用关于两个框的三个信息
- 它们的**外观**有多接近。在这里,我们将比较再识别网络为两张图像生成的向量。
- 它们的**中心**在连续帧上的距离有多近。假设视频帧率良好,我们可以假设人不能突然从图像的一角移动到另一角 - 这意味着,同一个人在连续帧上的检测结果的中心必须彼此靠近。
- 框的**大小**。同样,大小对于连续帧应该是一致的。
事实上,许多跟踪算法使用内部运动预测模型。它会记住人之前如何移动并根据运动模型预测下一个位置。人们通常不会随机移动,而是朝着一致的方向移动 - 因此这些模型确实有助于将检测结果与正确的跟踪路线匹配。
现在,我们将这三个数字组合成一个衡量两个框代表同一个人的可能性。如果我们对第一帧和第二帧上的所有可能的检测结果组合执行此操作,我们将获得一个包含框之间组合距离的矩阵
现在我们需要以最佳方式将新的检测结果分配给旧的跟踪路线。这本质上是一个优化问题 - 为了解决它,研究人员通常使用匈牙利算法。它会找到矩阵中分配的组合,该组合在我们的组合指标方面将是最优解。
跟踪检测方法在各种任务中效果很好,并且速度很快。它的性能主要受限于检测器和再识别网络的速度。随着像 OpenCV AI Kit 这样的智能板的兴起,即使在边缘设备上,实时运行跟踪也成为可能。
当然,还有其他方法可以进行多目标跟踪。最著名的类别是**基于图**的方法。这些方法可能很准确,并且经常赢得像 MOTChallenge 这样的基准测试,但速度很慢 - 并且不允许实时推理。此外,它们通常需要查看“未来”才能构建对应关系,这再次不允许即时跟踪。
OpenCV AI 人员跟踪引擎
在 OpenCV.AI,我们创建了一个用于目标跟踪和计数的**最先进**引擎。
为此,我们设计了一个优化后的神经网络,与普通网络相比,它使用的计算量减少了**370 倍**。因此,我们的跟踪可以在小型边缘设备上运行,也可以在云端设置中运行。它速度快、准确且稳定 - 因此可以实现各种商业应用。
如果您想了解更多信息,请通过以下方式与我们联系:[email protected].
为什么多目标跟踪很困难
您可能已经注意到,我们描述的过程并不完全是万无一失的。有许多事情可能出错
- 检测器有时可能会漏报人或产生误报。
一方面,我们需要一个快速的检测器才能实时工作。另一方面,检测器需要非常准确,才能跟踪每个人,并且不能创建多余的误报跟踪路线。为了创建一个不错的跟踪器,我们需要在准确性和速度之间进行权衡 - 这在计算机视觉中很常见。
- 人们可能会被遮挡一段时间,然后再次出现。跟踪需要“记住”这个人并继续在同一个跟踪路线中跟踪他们。
为了解决这个问题,我们需要在跟踪中引入记忆。但我们不能永远记住每个人——不仅因为内存消耗,还会使匹配部分更加复杂。
同样,我们需要在这里做出权衡!例如,我们可以记住一个人几分钟,如果他们稍后回来,跟踪会认为这是一个新人。
- 穿着制服的人对跟踪来说是一个难题。
实际上,经常会有穿着制服或长相相似的人——例如,商店或药店的店员,或者穿着黑色办公室西装的人。重新识别只能正确地说他们看起来很相似。在这种情况下,我们只能依赖盒子的大小和位置。
通常,多个目标跟踪算法都是基于这样的权衡。因此,它们是具有数十或数百个参数的复杂系统。一方面,这允许针对特定用例进行定制——但另一方面,它使跟踪系统变得复杂且难以构建。