Skip to content

静止目标

当被追踪的目标在连续多帧中保持几乎相同的位置时,即被判定为静止目标。这个判定阈值可在配置中的 detect -> stationary -> threshold 下设置,默认为帧率的 10 倍(即 10 秒)。一旦目标被判定为静止,它将保持静止状态,直到目标内部发生画面变动,此时目标检测将重新运行。如果目标位置发生变化,则被判定为活动状态。

静止目标有什么意义?

目标被判定为静止后,Frigate 将不再持续对其运行目标检测。这能有效降低资源消耗,避免对无画面变动的被追踪目标进行冗余检测。这也意味着 Frigate 具备上下文感知能力,例如可以过滤录像片段,仅保留目标处于活动状态的时段。仅画面变动不会决定目标对于 active_objects 片段保留是否"活动"。停放的车辆受光照变化不会使目标变为活动状态。

调整静止目标行为

配置 Frigate 如何处理静止目标。

yaml
detect:
  stationary:
    interval: 50
    threshold: 50
  • interval:对静止目标运行检测的频率(默认:50)。一旦变为静止,检测每隔第 n 帧运行一次以验证目标是否仍然存在。无法通过此值禁用静止目标追踪。
  • threshold:目标保持相对静止的帧数才能被判定为静止(默认:50)

为什么 Frigate 要追踪静止目标?

Frigate 并非从一开始就追踪静止目标。事实上,最初它甚至不追踪目标。

让我们看一个用例示例:我想记录进入我车道的所有车辆。

有人可能简单地认为"为什么不在车道区域有画面变动时运行目标检测,如果边界框在该区域内就通知?"

这种方法的问题是,与进入车道的车辆相关的视频是什么?它是从左边还是右边来的?它是否在转弯进入车道之前在街对面停了一个小时?一种方法是只进行 24/7 持续录制或画面变动录制,根本不尝试识别目标的开始和结束。这是大多数其他 NVR 的做法。因为识别对象的起止时间很困难,而且有时会出错。

难道不能只看画面变动何时停止和开始吗?视频流的画面变动只不过是查找与先前帧不同的像素。如果汽车进入车道时有人在修剪草坪,当他们在车道或街道旁修剪时,你如何区分哪些画面变动是汽车的、哪些是人的?如果另一辆车在街道上向另一个方向行驶怎么办?或者如果是刮风天,邮箱旁边的灌木丛在摇摆怎么办?

为了更准确地做到这一点,你需要识别目标并为其分配唯一 ID 进行追踪。在后续的每一帧中,所有内容都移动了一点,你需要确定哪些边界框与前一帧中的每个目标匹配。

跨帧追踪目标是一个具有挑战性的问题。特别是如果你想要实时完成。有整个竞赛专门研究算法,看哪个能最准确地完成。没有一个算法能 100% 准确。即使那些无法实时运行的算法也是如此。算法始终存在错误率。

现在考虑汽车正在一条路边停有其他车辆的道路上行驶。它将驶过其中一些车辆的前面和后面。甚至可能有一辆车向相反方向行驶。

让我们假设目前我们没有追踪街边停放的 2 辆车或车道上停放的 1 辆车,即没有静止目标追踪。

当你追踪的汽车接近停有 2 辆车的区域时,车灯反射到停放的车辆和你车道上停放的汽车上。该区域的像素值不同,因此检测到画面变动。目标检测运行并识别出其余 3 辆车。在前一帧中,你只有追踪车辆的一个边界框。现在你有 4 个。原始目标、街上的 2 辆车和车道上的 1 辆。

现在你必须确定当前帧中哪个边界框应该与你之前只有 1 个的追踪 ID 匹配。请记住,你从未见过这额外的 3 辆车,所以你对它们一无所知。更麻烦的是,你追踪的汽车的边界框已经移动到新位置,那么 4 个中哪个属于你最初追踪的汽车?这里的算法还算不错。它们使用卡尔曼滤波器根据历史边界框预测目标的下一个位置,并将与预测位置最接近的边界框链接起来。有时是对的,但当你有 4 个可能的边界框时,错误率会很高。

现在让我们假设那另外 3 辆车已经作为静止目标被追踪,所以街上行驶的汽车是新的第 4 辆。目标追踪器知道我们之前有 3 辆车,现在有 4 辆。当新汽车接近停放的车辆时,所有 4 辆车的边界框都根据前几帧进行预测。停放车辆的预测框与当前帧中的边界框几乎 100% 重叠。停放的车辆与其之前的追踪 ID 是明确匹配的,唯一剩下的是分配给新汽车的剩余边界框。这导致更低的错误率。虽然不完美,但更好。

导致 ID 分配不正确的最困难场景是一个目标完全遮挡另一个目标。当一辆车在另一辆车前面经过且不再可见时,一个边界框消失了,分配 ID 时有些难以判断,因为很难知道哪辆在前面。这在车辆经过其他车辆前方时经常发生。这是我们希望在未来改进的方面。