遮罩
动态遮罩
动态遮罩用于防止不必要的动态类型触发检测。请尝试在启用 Motion Boxes
的情况下观看调试流,看看哪些动态可能会被定期检测到。例如,您想屏蔽掉时间戳、天空、屋顶等。请记住,如果目标检测是由于未遮罩区域的动态而启动的话,这种屏蔽只能防止动态被检测到,而不能防止目标被检测到。在目标跟踪过程中,动态也会被用来完善下一帧的目标检测区域。过度遮蔽会增加跟踪目标的难度。要查看这种效果,请创建一个遮罩,然后再次启用 Motion Boxes
观看视频画面。
目标过滤遮罩
目标过滤遮罩用于根据位置过滤特定目标类型的误报。应使用它们来过滤不可能存在该类型目标的任何区域。检测到的目标边界框的底部中心将根据遮罩进行评估。如果它位于遮罩区域内,则假定为误报。例如,你可能想屏蔽掉屋顶、墙壁、天空和树梢上的人。对于汽车,屏蔽街道或车道以外的位置会告诉 Frigate,院子里的任何东西都是误报。
目标过滤遮罩可用于过滤固定位置的顽固误报。例如,这棵树的底部可能经常被检测为人。下图显示了目标过滤遮罩的示例(红色阴影区域),典型的底部中心位置位于遮挡中,可以过滤掉精确位置上的人形检测。
使用遮罩创建器
创建多边形遮罩:
- 浏览用户图形界面
- 单击要为其创建遮罩的摄像机
- 选择顶部的“调试”
- 展开视频流下方的“选项”
- 单击 "遮罩 & 防区创建器"
- 单击要创建的遮罩或防区类型上的“添加”
- 点击摄像机的最新图像以创建遮罩区域。yaml 表示将实时更新
- 创建完遮罩后,单击“复制”并将内容粘贴到配置文件中,然后重新启动 Frigate
与下图示例相对应的成品行示例:
motion:
mask: "0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432"
多个遮罩。
motion:
mask:
- 458,1346,336,973,317,869,375,866,432
- 0,461,3,0,1919,0,1919,843,1699,492,1344
进一步说明
这是对reddit 上的提问的回复:
了解一下 Frigate 是如何同时使用动态侦测和目标检测的,会有所帮助。
首先,Frigate 使用动态侦测作为第一道检查程序,查看画面中是否有任何值得用目标检测来检查事情的发生。
一旦侦测到动态,它就会尝试将附近的动态区域组合在一起,希望在图像中找出一个矩形来捕捉值得检查的区域。这就是你在调试视图中看到的红色 "动态框"。
确定动态区域后 Frigate 会创建一个 "区域"(调试视图中的绿色方框)来进行目标检测。模型是在正方形图像上训练的,因此这些区域总是正方形。它在动态区域周围添加了一个边距,希望能捕捉到目标动态的剪切视图,以填充目标检测所需的大部分图像,但又不切断任何部分。如果要跟踪目标,它还会考虑上一帧图像中边界框的位置。
目标检测运行后,如果检测到的目标似乎被切断了,Frigate 会重构该区域,并在同一帧上再次运行目标检测,以获得更好的效果。
所有这些都是针对每个动态区域和被跟踪目标进行的。
您的意思是说,任何检测的初始触发都只会发生在未遮蔽的区域,而一旦触发,遮蔽就变得无关紧要,就会优先目标检测?
基本上是的。但我不会将其描述为目标检测优先。动态遮罩只是防止这些区域被算作动态区域。这些遮罩不会以任何方式修改传递给目标检测的区域,所以你完全可以在动态遮罩区域中检测到目标。
如果是这样,这对我来说完全是意料之中的直观行为。因为很明显,如果一只 "脚" 启动了动态侦测,摄像机就应该能够在它完全进入检测区域之前检查它是否是整个人。文档中暗示了这种行为,所以我也不明白为什么这会对整个目标检测产生不利影响。
当只有一只脚触发动态时,Frigate 会放大并只看那只脚。如果这还算得上是一个人,它就会确定目标被截断,然后反复查看,直到放大到足以找到整个人为止。
这也不利于 Frigate 跟踪移动目标。上一帧边框附近的动态会被用于智能确定下一帧中该区域的位置。如果遮罩过多,跟踪就会受到阻碍,如果一个目标从一个未遮罩的区域进入一个完全遮罩的区域,它们基本上就会消失,如果它们离开遮罩区域,就会作为一个 "新"目标被拾取。这一点非常重要,因为 Frigate 会使用跟踪目标时的历史得分来判断是否为误报。Frigate 至少需要 3 个帧来确定它认为的对象类型,而且中位分数必须大于阈值。如果一个人在人行道上走进你的门廊之前就达到了这个阈值,那么当他一脚踏入你的区域时,你就会收到警报。
我以为这项功能的主要目的是在不必要的区域发生动态时减少 CPU 的使用。
的确如此,但"不必要"的定义各不相同。我想忽略那些我知道肯定不是由感兴趣的目标触发的动态区域。时间戳、树木、天空、屋顶。我不想忽略那些我想跟踪并了解其去向的目标动态。
对我来说,给遮罩加任何填充物都会让我发现很多我不感兴趣的人。我住在城市里,摄像机能拍到很多人行道上的景物。人们经常从我家门口走过,而人行道与实际走上我家门廊之间的距离非常小,所以除了门廊的确切轮廓外,我基本上把其他地方都屏蔽掉了。这样做的结果是探测结果非常整洁,但这些信息一直让我感到困惑。我是不是想太多了?
这就是 required_zones
的作用。您应该定义一个防区(记住,这是以边界框的底部中心为基础进行评估的),并使其成为保存抓拍和剪辑的必备条件(现在是 0.9.0 中的事件)。您也可以在消息触发条件中使用此功能。
也许我的具体情况需要这样做。我只是很难理解这些信息的相关性--似乎这正是在 "遮蔽 "任何图像的某个区域时应该做的事情。
你可能就是这种情况。Frigate 肯定会更加努力地追踪人行道上的人,确保不会错过任何踏上你家门廊的人。您现在使用的方式所带来的代价就是识别目标的速度较慢,可能会出现遗漏。根据您的需求,这也许是可以接受的。另外,如果你的检测流分辨率足够低,你的区域可能已经大到可以捕捉到整个目标。