静止目标
当一个目标被跟踪并在一个非常相似的位置停留了一定帧数时,就会被认为是静止的。这个数量在配置中的 detect -> stationary -> threshold
中定义,默认为帧率的 10 倍(或 10 秒)。一旦一个目标被认为是静止的,它就会一直保持静止,直到目标内部发生动态,这时目标检测才会重新开始运行。如果目标改变了位置,则会被认为是活动的。
目标是否静止有什么关系?
一旦目标静止不动,目标检测就不会在该目标上持续运行。这样做的目的是在被跟踪物体附近没有动态的情况下,减少资源占用和冗余检测。这也意味着 Frigate 可以感知上下文,例如,可以过滤录像剪辑,只在目标被认为处于活动状态时才进行检测。对于 active_objects 剪辑留存来说,动态本身并不能决定一个目标是否处于 "活动 "状态。停放的汽车的灯光变化不会使对象处于活动状态。
调整静止行为
默认配置为:
detect:
stationary:
interval: 50
threshold: 50
interval
定义为对静止目标进行检测的频率。这意味着,默认情况下,一旦目标被认为是静止的,在检测到动态或间隔时间(默认情况下每 50 帧)之前不会对其运行检测。如果interval >= 1
,则每隔 n 帧运行一次检测,以确保目标仍然存在。
注意:使用此值无法禁用静止目标跟踪。
threshold
是指目标在被视为静止之前需要保持相对静止的帧数。
处理静止目标
在某些情况下,例如在车道上,您可能更希望只在汽车进出时才有事件发生,而不是在汽车静止在车道上时一直有事件发生。
为什么 Frigate 追踪静止目标?
Frigate 并不总是跟踪静止的目标。事实上,它最初甚至根本无法跟踪目标。
让我们来看一个用例:我想记录所有进入我车道的汽车。
有人可能会简单地想:“为什么不在车道周围有动态时运行目标检测,并在边界框位于该防区时发出通知呢?“
有了这种方法,与进入车道的汽车有关的视频是什么?它是从左边还是右边开过来的?它是否在街对面停了一个小时才驶入车道?一种方法是全天候录像或动态录像(在任何像素发生变化时),和前两种都不做。大多数其它 NVR 都是这样做的。甚至不要试图确定该目标的开始和结束时间,因为这很难,而且在某些时候会出错。
难道不能只看动态停止和开始的时间吗?视频画面的动态只不过是寻找与前几帧不同的像素点而已。如果汽车驶入车道时,有人正在割草,你怎么知道哪个动作是汽车的,哪个动作是人沿着车道或街道割草时的?如果另一辆车在街道上朝另一个方向行驶呢?或者,如果是大风天,你邮箱旁的灌木丛被吹得东倒西歪怎么办?
为了更精确地完成这项工作,您需要识别目标并用唯一的 ID 跟踪它们。在随后的每一帧中,所有目标都会发生一些移动,因此需要确定上一帧中的每个目标对应的边界框。
跨帧跟踪目标是一个具有挑战性的问题。尤其是当你想要实时追踪时。有很多研究算法的竞赛,看哪种算法能最准确地完成这项任务。但没有一种算法能做到 100% 的准确。即使是那些不能实时计算的算法也是如此。算法总是存在误差率的。
现在考虑一下,这辆汽车正行驶在一条街道上,街道两旁还停着其他汽车。汽车会开在其中一些汽车的后面,另一些汽车的前面。甚至可能还有一辆车逆向行驶。
让我们暂时假设,我们并没有跟踪街道上停放的两辆汽车或停在车道上的汽车,即没有固定目标跟踪。
当您跟踪的汽车接近有两辆汽车停放的区域时,车头灯会反射出停放的汽车和停在您车道上的汽车。该区域的像素值不同,因此检测到了动态。目标检测运行并识别出其余 3 辆汽车。在上一帧中,您跟踪的汽车只有一个边界框。现在有 4 个。原始目标、街道上的两辆车和车道上的一辆车。
现在,您必须确定这一帧中的哪个边框应该与上一帧中的跟踪 ID 相匹配,因为上一帧中只有一个跟踪 ID。请记住,你以前从未见过这另外 3 辆车,所以你对它们一无所知。此外,你正在追踪的那辆车的边界框现在已经移动到了一个新的位置,那么这 4 辆车中哪一辆属于你最初追踪的那辆车呢?这里的算法相当不错。它们使用卡尔曼滤波器,利用历史边界框预测目标的下一个位置,然后将最接近预测位置的边界框连接起来。有时是对的,但如果有 4 个可能的边界框,错误率就会很高。
现在,让我们假设另外 3 辆车已经作为静止目标被跟踪,那么行驶在街上的这辆车就是新的第 4 辆车。目标追踪器知道我们有 3 辆车,现在有 4 辆。当新车接近停放的汽车时,会根据之前的帧来预测所有 4 辆汽车的边界框。预测出的停放车辆的边界框与新帧中的边界框几乎 100%重合。停放的汽车与它们之前的追踪 id 完全吻合,唯一剩下的就是分配给新车的剩余边界框。这就大大降低了错误率。虽然还不够完美,但已经好多了。
导致 ID 分配错误的最困难情况是一个目标完全遮挡了另一个目标。当一辆汽车驶到另一辆汽车前面,而另一辆汽车不再可见时,一个边界框就消失了,这时在分配 ID 时就比较麻烦,因为很难知道哪一辆车在另一辆车前面。这种情况经常发生在汽车从其他汽车前面驶过时。这是我们希望在未来改进的地方。