遮罩功能
运动遮罩
运动遮罩用于防止不需要的运动类型触发检测。可以打开调试视图(设置 --> 调试)并启用"运动框"选项,观察哪些区域经常被误检测为运动。例如,您可能需要遮罩掉时间戳、天空、屋顶等区域。请注意,这种遮罩仅阻止运动检测,如果对象检测是由未遮罩区域的运动触发的,它不会阻止对象被检测到。运动信息也会在对象追踪过程中用于优化下一帧的对象检测区域。过度使用遮罩会使对象追踪变得更加困难。
关于为何可能不需要使用运动遮罩的进一步说明见下文。
对象过滤遮罩
对象过滤遮罩用于根据位置过滤特定对象类型的误报。这些遮罩应该用于过滤掉不可能出现某类对象的区域。系统会评估检测对象边界框的底部中心点是否位于遮罩区域内。如果在遮罩区域内,则会被视为误报。例如,您可能需要对人物检测遮罩屋顶、墙壁、天空、树顶等区域。对于车辆,遮罩掉街道或车道以外的区域可以告诉Frigate院子里的任何检测都是误报。
对象过滤遮罩可用于过滤固定位置顽固的误报。例如,某棵树的底部可能经常被误检测为人。下图展示了一个对象过滤遮罩示例(红色阴影区域),覆盖了通常检测到底部中心点的位置,以精确过滤该位置的人物检测。
使用遮罩创建工具
创建多边形遮罩的步骤:
- 访问Web界面
- 点击齿轮图标打开"设置"
- 选择"遮罩/区域编辑器"
- 在右上角选择要创建遮罩或区域的摄像头
- 点击要创建的遮罩或区域类型下的加号图标
- 在摄像头最新画面上点击创建遮罩区域的多边形顶点。点击第一个顶点闭合多边形。
- 完成遮罩创建后,点击保存
- 重启Frigate应用更改
配置文件将更新为遮罩/区域的相对坐标:
motion:
mask: "0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456,0.700,0.424,0.701,0.311,0.507,0.294,0.453,0.347,0.451,0.400"
配置中可以列出多个遮罩:
motion:
mask:
- 0.239,1.246,0.175,0.901,0.165,0.805,0.195,0.802
- 0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456
进一步说明
这是对Reddit上提出问题的回应:
了解Frigate如何结合使用运动检测和对象检测会很有帮助。
首先,Frigate使用运动检测作为初步检查,判断画面中是否有值得进行对象检测的活动。
一旦检测到运动,它会尝试将附近的运动区域分组,希望能识别出画面中值得检测的矩形区域。这些就是您在调试视图中看到的红色"运动框"。
确定运动区域后,Frigate会创建一个"区域"(调试视图中的绿色框)来运行对象检测。模型是在方形图像上训练的,所以这些区域总是正方形。它会在运动区域周围添加边距,希望能捕捉到填充大部分检测图像的运动对象裁剪视图,同时不会切断任何部分。如果正在追踪对象,它还会考虑前一帧边界框的位置。
运行对象检测后,如果检测到似乎被切断的对象,Frigate会重新调整区域并在同一帧上再次运行对象检测以获得更好的视角。
所有这些处理都会针对每个运动区域和追踪对象进行。
您是否只是说任何类型的检测的初始触发只会发生在未遮罩区域,但一旦触发发生,遮罩就变得无关紧要,对象检测优先?
基本上是的。不过我不会描述为对象检测优先。运动遮罩只是阻止这些区域被计为运动。这些遮罩不会以任何方式修改传递给对象检测的区域,因此您绝对可以在运动遮罩区域中检测到对象。
如果是这样,这对我来说是完全预期和直观的行为。因为显然如果一只"脚"开始运动检测,相机应该能够检查它是否是一个完整的人,然后它完全进入区域。文档暗示这是行为,所以我也不能理解为什么这总体上对对象检测有害。
当只有一只脚触发运动时,Frigate会放大并只查看这只脚。如果这甚至符合一个人的特征,它会确定对象被切断并再次查看,直到放大到足以找到整个人。
这对Frigate追踪移动对象的方式也有害。前一帧边界框附近的运动用于智能确定下一帧中区域应该在哪里。遮罩过多会阻碍追踪,如果对象从未遮罩区域进入完全遮罩区域,它们基本上会消失,如果离开遮罩区域,将被视为"新"对象。这很重要,因为Frigate在追踪对象时使用分数历史记录来判断是 否是误报。Frigate至少需要3帧才能确定它认为的对象类型,且中位数分数必须大于阈值。如果一个人在进入您的门廊前在人行道上达到此阈值,您将在他们单脚踏入区域的瞬间收到警报。
我认为这个功能的主要目的是减少不必要区域发生运动时的CPU使用。
是的,但"不必要"的定义各不相同。我想忽略那些我知道绝对不是由感兴趣对象触发的运动区域。时间戳、树木、天空、屋顶。我不想忽略我想要追踪并知道去向的对象的运动。
对我来说,给我的遮罩任何填充都会导致很多我不感兴趣的人物检测。我住在城市里,相机捕捉到很多人行道。人们经常走过我的前门,人行道和实际走上我的门廊之间的边缘非常薄,所以我基本上遮罩掉了门廊精确轮廓之外的所有区域。这导致非常整洁的检测,但这些信息一直让我困惑。我只是想太多了吗?
这就是必需区域
的用途。您应该定义一个区域(记住这是基于边界框底部中心评估的),并将其设为保存快照和片段所必需的(在0.9.0到0.13.0中称为事件,在0.14.0及以后称为回放条目)。您也可以在通知条件中使用它。
也许我的具体情况就需要这样。我一直很难理解这些信息的相关性 - 似乎这正是"遮罩"任何图像区域时所期望的。
对您来说可能是这样。Frigate肯定会更努力地追踪人行道上的人,以确保不会错过任何踏上您门廊的人。您现在的方式的权衡是对象识别速度较慢和可能的遗漏。根据您的需求,这可能是可以接受的。此外,如果您的检测流分辨率足够低,您的区域可能已经足够大,可以直接捕捉整个对象。