上一篇我们分享了多模型多实例推理,把 RK3588 NPU 利用率从 40% 提升到 85%。但推理准确率上去了,不代表告警就准了——AI 模型每一帧都可能误检,树叶晃动、光线变化、飞虫飞过都可能触发误报。如果每一帧检测到目标就告警,客户一天能收到几百条误报,最后直接把告警关了。本文分享我们的越微自研工业多模态事件去重与时空融合引擎,以及如何把误报率从 30% 降到个位数。
一、背景:AI 视觉检测的误报痛点
做工业 AI 视觉,最常被客户吐槽的就是:「你们这个系统误报太多了,一天报几十次,大部分都是假的,我们都懒得看了。」
误报是 AI 视觉检测的老大难问题。原因很现实:
为什么 AI 模型会误报?
- 训练数据覆盖不全——模型训练时没见过的场景,推理时就可能误判。比如模型训练时都是晴天,阴天光线暗的时候就可能把阴影误检成人
- 复杂环境干扰——树叶晃动、光影变化、飞虫飞过、雨滴打在镜头上、玻璃反光,这些都可能被模型误检成目标
- 小目标和远距离目标——远距离的人只有几十个像素,模型很难准确判断,容易把类似形状的物体误检成人
- 模型本身的精度上限——没有 100% 准确的模型,再强的模型也有误检率,特别是在复杂场景下
单帧检测的问题
如果系统采用「单帧检测到目标就告警」的策略,那误报率会非常高。因为:
- 模型每一帧都可能误检,25fps 的视频,一秒就可能有 25 次误检机会
- 偶发的误检(飞虫飞过、光影闪烁)会被当成真实告警
- 客户会被海量误报淹没,最终对系统失去信任
我们早期的版本就是单帧告警,客户的反馈非常直接:「你们这个告警不能信,十次有八次是假的。」
要让 AI 视觉检测真正可用,必须在模型推理之上加一层「越微自研的工业多模态事件去重与时空融合引擎」——把连续多帧的检测结果综合判断,区分「真实事件」和「偶发误检」,并针对原始 ROI 进行时间域与空间域的防误报滤波与防抖处理。
二、我们的方案:事件融合状态机 [Yuewell Inside]
我们设计了一个三态事件融合状态机,对每个检测目标(或每个 ROI 区域)维护一个状态,根据连续帧的检测结果在状态之间转换。
三个状态
```
Suspected(疑似) → Confirmed(确认) → Cleared(清除)
↑ ↓
└────────────────────────────────────┘
```
状态一:Suspected(疑似)
- 定义:检测框与 ROI 区域存在重叠,模型认为可能有目标
- 触发条件:某一帧检测到目标,且目标框与指定 ROI 区域重叠
- 行为:进入「观察期」,开始计数连续检测到目标的帧数
- 不告警:疑似状态不触发告警,只是「注意到可能有情况」
状态二:Confirmed(确认)
- 定义:连续 N 帧检测到同一目标,且目标 IOU 重合度高(或有跟踪 ID 时以跟踪为准),确认是真实事件
- 触发条件:连续 N 次(FusionCount)检测成功,且目标位置连续(IOU 重合度高,说明是同一个目标在移动,不是不同位置的偶发误检)
- 行为:触发告警,生成证据链,推送给客户端和第三方平台
- 这是唯一会触发告警的状态
状态三:Cleared(清除)
- 定义:目标消失或离开 ROI,事件结束
- 触发条件:连续 M 帧没有检测到目标(或目标离开 ROI 区域)
- 行为:重置计数,回到初始状态,等待下一次事件
- 不告警:清除状态只是结束当前事件,不触发新的告警
状态转换的关键参数
FusionCount(融合确认次数):从疑似到确认需要连续检测到目标的帧数。比如 FusionCount = 3,就是连续 3 帧检测到同一目标才确认告警。
- FusionCount 越大,误报率越低,但漏报率越高(真实目标如果只出现 2 帧就走了,就不会告警)
- FusionCount 越小,响应越快,但误报率越高
- 我们的经验是:实时检测任务 FusionCount = 3 是一个比较好的平衡点,误报率显著降低,漏报率可接受
ClearCount(清除计数):从确认到清除需要连续未检测到目标的帧数。比如 ClearCount = 10,就是连续 10 帧没检测到目标才认为事件结束。
- ClearCount 太小,目标短暂被遮挡(如走过一棵树后面)就会被清除,然后又重新检测到,导致重复告警
- ClearCount 太大,目标已经走了很久才清除,事件持续时间不准
- 我们的经验是 ClearCount = FusionCount 的 3-5 倍比较合适
为什么状态机能降低误报率?
越微自研事件融合状态机的核心逻辑是:偶发误检通常只持续 1-2 帧,真实目标通常会持续多帧。
- 飞虫飞过镜头:可能只在 1 帧里出现,下一帧就没了 → 只到疑似状态,不确认,不告警
- 光影闪烁:可能在 1-2 帧里被误检,然后恢复正常 → 只到疑似状态,不确认
- 真实人员入侵:人走进 ROI,会持续很多帧 → 连续 N 帧检测到,进入确认状态,触发告警
通过「连续 N 帧确认」的机制,我们过滤掉了大部分偶发误检,只对持续存在的真实目标告警。 这就是事件融合降低误报率的核心原理。
三、ROI 区域过滤:只关注该关注的地方 [Yuewell Inside]
事件融合状态机解决了「连续帧确认」的问题,但还有一个问题:模型可能在画面的任何位置检测到目标,但我们只关心特定区域。
比如周界防范场景,我们只关心围墙附近的警戒区域,画面远处的马路上有人走,不应该触发告警。如果不对检测区域做限制,远处的人也会触发告警,误报率会很高。
这就是 ROI(Region of Interest,感兴趣区域) 的作用。
ROI 的定义
ROI 是用户在画面上指定的一个或多个区域,只有目标出现在 ROI 内时,才会触发事件融合和告警。
ROI 可以是:
- 矩形:最简单,适合规则区域(如门口、通道)
- 多边形:更灵活,适合不规则区域(如围墙边界、不规则场地)
- 坐标用归一化值(0-1)表示,这样不管摄像头分辨率怎么变,ROI 的相对位置不变
检测框与 ROI 的判定方式
目标检测模型输出的是一个矩形框(检测框),怎么判断目标是否在 ROI 内?
我们支持几种判定模式:
- 重叠模式(overlap):检测框与 ROI 区域有重叠就算命中。适合「只要目标进入区域边缘就告警」的场景
- 中心点模式(center):检测框的中心点在 ROI 内才算命中。适合「目标完全进入区域才告警」的场景
- 底部点模式(foot):检测框的底部中心点(通常对应人的脚的位置)在 ROI 内才算命中。适合人员检测——因为人的脚站在哪里,人就在哪里,用底部点比用整个框更准确
不同的场景用不同的判定模式,能进一步降低误报率。比如周界防范用底部点模式——只有人的脚站在警戒区域内才告警,人的上半身探进来但脚还在外面就不告警,减少误报。
ROI 的实战价值
我们在一个客户现场做过对比:
- 不设 ROI:整个画面都检测,一天告警 80 多次,其中 60 多次是画面远处马路上的行人(误报)
- 设 ROI(只警戒围墙附近 2 米范围):一天告警 15 次,其中 12 次是真实入侵,误报率大幅下降
ROI 过滤是降低误报率最简单也最有效的手段之一。 很多误报不是模型不准,而是「检测了不该检测的区域」。把 ROI 设好,误报率直接降一半。
四、实帧证据链:告警要有图,图要是真的 [Yuewell Inside]
告警触发了,但客户会问:「你说有人入侵,证据呢?」
这就需要证据链——告警发生时的现场图片。有图有真相,客户看到图片才能判断是不是真的告警,也才能事后追溯。
为什么不能用占位图?
有些系统为了省事,告警时用一张占位图(比如系统 logo 或「告警发生」的文字图)作为证据。这是非常不专业的做法:
- 客户看不到现场实际情况,无法判断告警真假
- 事后追溯没有依据,出了问题说不清
- 第三方平台(如客户的安防平台)收到告警但没有真实图片,无法使用
我们的原则是:告警必须带真实现场图片,绝对不能用占位图作为主证据。
实帧抓拍的实现
我们的实帧抓拍机制是这样的:
- 事件融合状态机进入 Confirmed(确认)的瞬间,立即拦截触发告警的那一帧真实图像(NV12 格式,来自 MPP 硬解码的输出)
- 调用硬件 JPEG 编码器(RK3588 的 VPU 模块支持硬编码 JPEG),把 NV12 帧编码成 JPEG 图片
- JPEG 质量设为中等偏高(Quality ≈ 75),在图片质量和文件大小之间取平衡——质量 75 的 JPEG 人眼几乎看不出压缩痕迹,但文件大小只有全质量的 1/3 左右
- 编码耗时很短(1080P JPEG 硬编码约 10ms 以内),不会影响实时性
关键点:抓拍的是「触发告警的那一帧」,不是随便一帧。 这一帧里目标的位置、状态,和告警触发时完全一致,证据最准确。
证据链的多图打包
除了主图(触发告警的那一帧),我们还会根据 FusionCount 和采样策略,打包几张前后的原始抓拍,组成完整的证据链:
- 告警前 1-2 帧(目标刚进入 ROI 的画面)
- 告警主图(确认告警的那一帧)
- 告警后 1-2 帧(目标在 ROI 内的画面)
这样客户能看到目标从进入到确认的完整过程,更准确地判断事件性质。
当然,证据链的图片数量有上限(避免占用太多存储和带宽),具体数量根据场景和配置决定。
安全回退机制
虽然我们坚持用实帧,但也要考虑异常情况——如果实帧编码失败(比如硬件编码器临时故障、帧数据异常),怎么办?
我们的安全回退机制:
- 如果实帧编码异常,回退到占位图(系统生成的告警提示图)
- 但占位图只作兜底,主进程不能崩溃——不能因为编码失败导致整个系统挂掉
- 记录编码失败的日志,方便排查
- 占位图上明确标注「图片获取异常」,让客户知道这不是真实现场图
回退机制保证了系统的健壮性,但正常情况下必须用实帧,占位图只是最后的兜底。
多路一致性
生成的 JPEG 证据图要同时用于:
- 客户端 gRPC 推送(运维人员在客户端看到告警图片)
- 第三方 HTTP 推送(推送到客户的安防平台或其他系统)
必须保证两路用的是同一张图——不能 gRPC 发实图而 HTTP 发占位图(或反之),否则客户在两个平台看到的证据不一致,会困惑。
我们的做法是:实帧编码只做一次,生成的 JPEG 字节流同时用于 gRPC 和 HTTP 推送,保证一致性。
五、推送冷却:防止频繁上报
越微自研事件融合引擎 + ROI 过滤 + 实帧证据链,误报率已经降下来了。但还有一个问题:同一个目标持续在 ROI 内,会不会反复告警?
比如一个人在警戒区域内站了 5 分钟,如果系统每确认一次就告警一次,5 分钟内可能告警几十次——这也是一种「误报」(重复告警)。
这就需要推送冷却(Push Interval)机制。
推送冷却的原理
推送冷却的核心是:同一个目标(或同一个 ROI 区域)在短时间内只告警一次,后续的检测结果不重复告警,直到冷却时间过去。
具体实现:
- 每次触发告警后,记录该 ROI 区域(或该目标的跟踪 ID)的最后告警时间
- 在冷却时间内(如 60 秒),即使再次检测到目标并确认,也不推送新的告警
- 冷却时间过去后,如果目标还在(或新目标进入),才会再次告警
冷却时间的选择
冷却时间不是越长越好,也不是越短越好:
- 冷却时间太短(如 5 秒):同一个目标还是会反复告警,效果不明显
- 冷却时间太长(如 30 分钟):第一个人走了,第二个人进来,可能因为还在冷却期而不告警,导致漏报
我们的经验是:
- 周界防范等安全场景:冷却时间 60-120 秒比较合适——同一个人在区域内活动只告警一次,但人走了之后新人进来能及时告警
- 工业质检等场景:根据产品节拍调整,通常一个产品只告警一次
推送冷却的其他保障
除了冷却时间,我们还有一些辅助机制防止频繁上报:
- 第三方推送并发限制:对同一个推送地址,在途请求并发数上限为 5,避免突发大量告警把第三方平台打垮
- 超时控制:第三方 HTTP 推送单次请求超时强制为 3 秒,避免网络不好时推送线程阻塞太久
- 告警合并:同一帧内多个目标触发告警,合并成一条告警推送(带多个检测框),而不是每个目标推一条
六、实战案例:某园区周界防范的误报率优化
我们在一个客户现场做了完整的误报率优化。这个客户是一个工业园区,有 8 路周界摄像头,需要做人员入侵检测。
优化前:单帧检测,无 ROI,无冷却
- 检测策略:单帧检测到人就告警
- ROI:未设置,整个画面都检测
- 事件融合:无(单帧确认)
- 推送冷却:无
- 结果:一天告警 120 多次,误报率约 75%(大部分是远处马路上的行人、树叶晃动、光影变化、飞虫等)
- 客户反馈:「告警太多了,我们都不看了,这个系统没用。」
优化后:越微自研事件融合引擎 + ROI 过滤 + 实帧证据链 + 冷却
- 检测策略:事件融合状态机,FusionCount = 3(连续 3 帧确认)
- ROI:设置围墙附近 2 米警戒区域,用底部点模式判定
- 证据链:确认时刻实帧抓拍 + 前后各 1 帧,组成 3 图证据链
- 推送冷却:60 秒
- 结果:一天告警 15 次左右,误报率约 10-15%(偶尔有动物闯入、极端天气下的误检)
- 客户反馈:「现在告警基本都是真的,我们会认真看每一条告警,系统有用了。」
各项优化的贡献分解
| 优化措施 | 误报率下降贡献 | 说明 |
|---|---|---|
| ROI 区域过滤 | ~50% | 过滤掉画面远处的行人、车辆等无关目标 |
| 越微自研事件融合引擎(连续 3 帧确认) | ~30% | 过滤掉飞虫、光影等偶发误检 |
| 推送冷却(60 秒) | ~10% | 过滤掉同一目标的重复告警 |
| 底部点判定模式 | ~5% | 减少上半身探入但脚在外面的误报 |
| 其他(模型调优等) | ~5% | 模型本身的精度优化 |
ROI 过滤和越微自研事件融合引擎是降低误报率的两大主力,合计贡献了约 80% 的误报率下降。 这两个措施不需要改模型、不需要重新训练,只是软件层面的策略调整,就能取得非常显著的效果。
七、定时抽帧任务的特殊处理
前面讲的事件融合主要针对 LIVE 实时任务(持续视频流,连续帧)。但还有一类 CRON 定时抽帧任务(每 2 小时抽一帧),这类任务的事件融合要特殊处理。
为什么定时任务不能用连续帧确认?
定时抽帧任务,两帧之间隔了几小时——这根本不是「连续帧」,无法用「连续 N 帧确认」的逻辑。如果定时任务也要求 FusionCount = 3,那需要 3 个抽帧周期(6 小时)才能确认一次告警,响应太慢了。
而且定时任务通常用于「状态检测」(如摄像头是否被遮挡、仓库里是否有烟火),这类检测一帧就能判断状态,不需要连续确认。
我们的处理:定时任务强制单帧确认
对 CRON 定时任务,我们强制单帧确认——检测到目标就确认告警,不需要连续多帧确认。
这样做的原因:
- 定时任务两帧间隔太久,连续帧确认没有意义
- 定时任务通常用于状态检测,单帧足够判断
- 避免和跳帧策略冲突——定时任务本身就是低频抽帧,如果还要求多帧确认,可能永远凑不齐
但定时任务的单帧确认意味着误报率可能比实时任务高一些——因为没有连续帧过滤。所以定时任务更依赖 ROI 过滤和模型本身的精度。对于误报率要求高的定时任务,我们会建议用更精准的专用模型(如烟火检测用专模,而不是通用检测模型)。
八、踩坑实录
事件融合与证据链的实现过程中,我们也踩了不少坑。
坑一:连续确认和跳帧策略的冲突
我们一开始给所有任务都设置了连续 3 帧确认,但跳帧策略下,如果推理引擎忙,可能连续跳过很多帧,导致「永远凑不齐 3 帧连续确认」,结果是检测到了目标但永远不告警。
后来我们做了区分:
- LIVE 实时任务:连续确认次数可以 >1,但要和采样间隔一起评估,确保在预期的跳帧率下能凑够连续确认
- CRON 定时任务:强制单帧确认(因为定时任务本来就是几小时一帧,不存在「连续帧」)
这个调整解决了漏告警的问题。
坑二:证据图和告警时间戳对不上
有一次客户反馈:「告警记录的时间是 14:30:05,但证据图里的时钟显示是 14:30:02,差了 3 秒,怎么回事?」
排查后发现:告警触发时,我们抓拍的是「当前最新帧」,但当前最新帧可能是 3 秒前的(因为帧缓冲和推理延迟)。所以告警时间戳是「现在」,但证据图是「3 秒前」,对不上。
解决方案:抓拍证据图时,用「触发告警的那一帧」而不是「当前最新帧」。事件融合状态机在确认告警时,已经持有触发确认的那一帧的引用,直接用这一帧编码证据图,时间戳和帧内容完全一致。
坑三:ROI 坐标归一化的坑
ROI 坐标用归一化值(0-1)表示,这样不管摄像头分辨率怎么变,ROI 的相对位置不变。但实现中有个坑:不同品牌的摄像头,画面可能有黑边(比如 4:3 的摄像头输出 16:9 的画面,上下有黑边),归一化坐标会把黑边也算进去,导致 ROI 实际位置偏移。
解决方案:在配置 ROI 时,先做画面有效区域校准,排除黑边的影响,再做归一化。或者在运行时根据摄像头的实际有效画面区域调整 ROI 坐标。
⚠️ 工程坑点与技术壁垒警告
提示:事件融合与证据链的思想不难理解,但工程落地中有几个高壁垒问题:
时空融合引擎的防抖与防误报:连续帧确认说起来简单,但真实场景中目标可能被短暂遮挡、光线突变、目标快速移动,简单的「连续 N 帧」会导致大量漏报或误报。越微自研的工业多模态事件去重与时空融合引擎,针对原始 ROI 进行了时间域与空间域的防误报滤波与防抖处理,经过大量真实场景数据调优才达到稳定的低误报率。
证据链的帧同步与时间戳对齐:告警时间戳和证据图必须严格对应,否则事后追溯时客户会质疑数据真实性。这需要在硬件层做全局时钟锚定,所有进程共享同一个时间基准,并且抓拍证据图时精确锁定触发告警的那一帧。这些细节不是「拍一帧就行」那么简单。
这些工程细节需要大量真实场景数据调优和故障注入验证。越微团队在这上面投入了大量时间,才打磨出稳定的事件融合与证据链引擎。
九、几点经验总结
回头看事件融合与证据链的设计和落地过程,总结几点:
1. 单帧告警是 AI 视觉系统的「大忌」
很多人做 AI 视觉,把模型跑起来、检测到目标就告警,觉得就完事了。但单帧告警的误报率极高,客户很快就会被海量误报淹没,最终放弃使用系统。越微自研事件融合引擎(连续多帧确认)是降低误报率最核心的手段,必须做。没有事件融合的 AI 视觉系统,在生产环境里是不可用的。
2. ROI 过滤是性价比最高的误报率优化
不需要改模型、不需要重新训练,只需要在画面上画个区域,误报率就能降一半。很多误报不是模型不准,而是检测了不该检测的区域。做 AI 视觉项目,第一件事就是和客户确认 ROI——哪些区域要检测,哪些区域忽略。ROI 设好了,后面的事件融合压力也小很多。
3. 告警必须带真实证据图,这是专业系统的底线
用占位图糊弄客户,是非常不专业的做法。客户要看到现场图片才能判断告警真假,事后追溯也要有图为证。实帧抓拍虽然增加了一些实现复杂度(硬件编码、帧同步、异常处理),但这是生产级系统必须做的。而且 RK3588 有硬件 JPEG 编码器,实帧编码的开销很小,没有理由不用。
4. 推送冷却是「最后一道防线」
即使有事件融合和 ROI,同一个目标持续在区域内还是可能反复告警。推送冷却保证了同一目标短时间内只告警一次,避免了「告警轰炸」。冷却时间要根据场景合理设置,太长会漏报,太短没效果。
5. 不同类型的任务要用不同的事件融合策略
LIVE 实时任务和 CRON 定时任务的特性完全不同——实时任务有连续帧,可以用多帧确认;定时任务只有离散帧,必须单帧确认。做系统设计时不能「一刀切」,要根据任务类型设计不同的融合策略。我们踩过「定时任务也要求多帧确认导致永远不告警」的坑,才意识到这一点。
6. 误报率和漏报率是天平的两端,要根据场景找平衡点
连续确认次数越多,误报率越低,但漏报率越高(短暂出现的目标可能不被确认)。没有「零误报零漏报」的系统,只能根据场景找平衡点——安全要求高的场景(如周界防范)可以接受一定漏报,优先降低误报率(避免客户不信任);安全要求极高的场景(如危险品检测)可以接受一定误报,优先降低漏报率(避免漏掉真实危险)。
写在最后
从单帧告警到越微自研事件融合状态机,从无 ROI 到精准区域过滤,从占位图到实帧证据链,从无冷却到推送冷却,我们花了不少时间把误报率从 75% 降到 10-15%。这个过程中最大的体会是:AI 视觉系统的可用性,不只取决于模型准确率,更取决于工程层面的策略设计。
模型再准,如果单帧告警、不设 ROI、没有冷却,误报率照样很高,客户照样不信任。而通过越微自研事件融合引擎、ROI 过滤、证据链、推送冷却这些工程手段,即使模型准确率只有 80%,也能把系统的实际误报率降到个位数,让客户真正用起来。
这些经验都是我们(越微智能)在实际项目中踩坑踩出来的。我们团队一直在做工业 AI 视觉、边缘计算部署、机器人二次开发这些落地工作,边缘 AI 视频分析系统是我们的核心产品之一。下一篇是部署与 OTA 升级,我们会继续分享实战经验。
如果你也在做 AI 视觉检测、工业安防、边缘智能相关的工作,欢迎交流,我们一起踩坑、一起进步。
关于作者与团队:
越微智能(Yuewell)是一支专注具身智能与工业 AI 视觉落地的技术团队,提供工业级视觉算法定制(30+ 算法)、RK3588 边缘一体机、具身机器人调度管理平台、全品牌机器人二次开发(适配宇树/优必选/智元/傅利叶等)、ROS2 系统开发等产品和服务,支持从算法、硬件到产线实机部署的全栈交付。
我们将这套经过大量真实场景验证的越微自研工业多模态事件去重与时空融合引擎,封装为了工业级边缘 AI 视觉基座(Yuewell Edge Framework)的核心模块,支持硬件/算法快速二次开发,帮助客户跳过最痛苦的误报率调优阶段。
📌 获取更多技术白皮书、工业 AI 视觉方案与产品交流,欢迎访问越微智能官网:https://yuewell.com/
下一篇预告: 《从开发到现场:RK3588 边缘设备的冷部署与 OTA 升级实战》,我们将分享边缘设备的部署运维挑战、热插拔扁平布局、生产数据与编译制品分离、新机器冷部署流程(SHA256 校验 + 权限自愈 + systemd 安装)、OTA 升级机制(Watchdog 回滚 + 客户端热切换 + 依赖检查)、四类部署场景的选择,以及 50 台设备批量 OTA 升级的实战案例,敬请关注。