视觉检测如何接入告警闭环

巡检场景里,模型打出「框和标签」只是起点;业务要的是 可分派、可抑制、可追溯的告警。与其把视觉服务直接耦合进业务库表,不如做成「检测事件 → 消息总线 → 告警服务」的闭环。

一、从检测结果到告警的鸿沟

模型输出 业务需要
框坐标 + 标签 + 置信度 谁的设备、什么时间、在哪、要不要处理
每帧都出 同一目标不要刷屏
无状态 要工单、要确认、要误报反馈

模型不懂「工单」,业务不该懂「bbox」。中间需要一层 事件化

二、闭环图



flowchart LR
  V[视频帧/图片] --> D[检测服务]
  D --> E[标准化 DetectionEvent]
  E --> Q[消息队列]
  Q --> A[告警服务]
  A --> DB[(告警单)]
  A --> N[通知/推送]
  A --> U[人工确认/误报]
  U --> A

读图: 检测服务只产出标准化事件,经消息队列交给告警服务;人工确认/误报再回到告警侧,形成可运营闭环。

消息队列把模型世界和业务世界拆开:检测侧专注推理与事件 schema,告警侧专注抑制、分派和确认。两边可以独立扩缩容,也不会互相拖垮。

三、DetectionEvent 最小字段



classDiagram
  class DetectionEvent {
    +String source
    +String deviceId
    +String taskId
    +Number frameTs
    +String label
    +Number score
    +BBox bbox
    +String model
    +String modelVersion
    +String traceId
  }
  class BBox {
    +Number x
    +Number y
    +Number w
    +Number h
    +String coordSystem
  }
  DetectionEvent --> BBox : 包含

  • source:设备/任务/帧时间
  • label / score
  • bbox(坐标系约定写清)
  • model / version
  • traceId

业务侧负责:阈值、地理围栏、重复告警合并、升级策略——不要让模型服务理解「工单」。

四、检测服务内部流程



sequenceDiagram
  participant V as 视频流
  participant D as 检测服务
  participant M as 模型
  participant Q as 消息队列
  V->>D: 帧
  D->>D: 预处理(缩放/归一化)
  D->>M: 推理
  M-->>D: detections
  D->>D: 后处理(NMS/过滤)
  D->>D: 包装 DetectionEvent
  D->>Q: 发布事件

五、Mock 与真权重



flowchart TB
  A[开发期] --> B[Mock 检测器<br/>固定 bbox]
  B --> C[链路可测]
  D[预发] --> E[真权重模型]
  E --> F[事件 schema 不变]
  F --> G[前端/告警无感切换]

开发期用 mock 检测器保持链路可测;预发再挂真权重。事件 schema 保持不变,避免前端与告警服务被模型细节绑死。

六、告警服务内部处理



flowchart TB
  E[DetectionEvent] --> R{重复检测?}
  R -->|是 同目标短时间| S[抑制]
  R -->|否| T[创建告警单]
  T --> G{围栏内?}
  G -->|否| D[丢弃]
  G -->|是| P[推送通知]
  P --> W[等待人工确认]
  W -->|确认| C[闭环]
  W -->|误报| F[反馈]
  F --> M[反哺规则/数据集]

七、抑制与确认策略

策略 作用
时间窗去重 同一目标短时间不刷屏
置信度门槛可配 不同场景不同阈值
人工误报反馈 反哺规则或微调数据集
围栏过滤 围栏外丢弃,减少噪声

实际落地时,抑制往往比「创建工单」更重要——否则每帧一个框会把告警中心打爆。下面这张决策图把常见分支收一下:



flowchart TB
  E[DetectionEvent] --> S{score ≥ 阈值?}
  S -->|否| X[丢弃]
  S -->|是| D{同设备+同标签<br/>在时间窗内?}
  D -->|是| Y[抑制/合并计数]
  D -->|否| G{在地理围栏内?}
  G -->|否| X
  G -->|是| C[创建或升级告警单]

顺序建议固定:先阈值,再时间窗去重,再围栏。阈值过滤掉噪声;去重避免刷屏;围栏决定「要不要进业务视野」。确认与误报则走状态机,不要塞回检测服务。

八、告警状态机



stateDiagram-v2
  [*] --> 待处理: 新告警
  待处理 --> 处理中: 分派
  处理中 --> 已确认: 人工确认
  处理中 --> 误报: 标记误报
  已确认 --> [*]
  误报 --> [*]
  待处理 --> 超时: 超时升级
  超时 --> 处理中: 重新分派

九、小结

视觉项目能上线,靠的往往不是更高的 mAP 宣传,而是 检测结果是否事件化、告警是否可运营。消息队列是模型世界和业务世界之间最清晰的防腐层。