← 首页 · 边缘工程 边缘工程

变电站边缘 AI:告警防抖、去重与抑制策略手册(可执行)

调研日期:约 2026-10-25(Asia/Shanghai)
落盘:/workspace/research/edge-ai-alert-debounce-suppression.md
定位:站端规则引擎统一层——在「误报风暴」与「漏报」之间设可审计闸门;抑制只减上报/通知,不停推理、不挡证据、不改联锁。
衔接:edge-ai-event-schema-acceptance.md、edge-ai-mqtt-hardening-offline-buffer.md、edge-ai-evidence-store-snapshot-retention.md、edge-ai-active-learning-relabel-loop.md、edge-ai-intrusion-e-fence-sop.md、edge-ai-ppe-smoke-fire-model-shortlist.md、edge-ai-observability-logging-metrics.md。
参考实践:边缘 IVA 常见「持续时长门控 + 冷却」、同位置 IoU 抑制(如 CosmoEdge 类实现)、Giraffe 类「按相机×事件类型冷却」;参数以本手册表为准,禁止把厂商默认 6h 冷却原样搬进变电站烟火路径。


0. 一句话结论与红线

分层抑制(检测 NMS → 轨迹稳定 → 事件防抖 → 同类冷却 → 站点规则)只收敛重复告警与夜雾误报;烟火/闯入等高严重度禁止被静默全局抑制;每次抑制须可审计;禁止因抑制停推理或挡证据。

ID 红线 说明
R1 禁止漏报保护 不得用「全局静默 / 无限冷却 / 关任务」掩盖误报;抑制失败应降 severity 或打 suppressed=true 旁路日志,不得吞掉未确认的高危候选
R2 高等级不可静默全局抑制 SMOKE_FIRE(severity=critical)与 PERSON_INTRUSION(severity=high)禁止站点级「一键全站静音」;仅允许 按 cam×code×zone 的短冷却 或 可审计的白名单窗(施工票/检修)
R3 抑制须可审计 每次被挡须写本地 ops 事件或结构化日志:suppress_reason、rule_id、track_id、iou、cooldown_left_ms;抽检可复现
R4 禁止因抑制停推理 解码 / NPU / 跟踪主路径恒开;抑制只发生在「升告警 → MQTT events / 证据触发 / 104 遥信」出口
R5 禁止当联锁 与既有手册一致:AI 告警不接保护跳闸 / GOOSE;抑制策略更不得反向「假保持无告警」误导值班

1. 分层架构(写死顺序)

帧 → 检测框 → [L1 NMS] → [L2 轨迹稳定] → 规则(围栏/PPE/烟火)
       → [L3 事件防抖] → [L4 同类冷却] → [L5 站点抑制规则]
       → MQTT events / 证据仓触发 /(可选)104 只读点
旁路:难例采样、telemetry、ops 抑制审计 —— 不受 L4/L5「通知冷却」影响(见 §4)
层 名称 作用 典型输出
L1 检测框 NMS 同帧同类/跨类去重框;降重叠误框 每类 top-K 框
L2 轨迹稳定 BYTETrack/OC-SORT;min_hits 连续命中才赋稳定 track_id 稳定轨迹
L3 事件防抖 同一 track_id(或空间键)满足持续 debounce_ms / dwell_ms 才升告警 首条 event
L4 同类冷却 同 (cam, event.code[, zone_id][, track_id|spatial_key]) 在 cooldown_ms 内不重复升告警 合并/心跳更新
L5 站点级抑制规则 白名单时段、气象/画质门控、作业票降敏、相机维护静音 降级或旁路

原则:L1–L2 是感知质量;L3–L4 是业务去重;L5 是运维策略。任何一层失败 → 放行候选并标 quality=suspect,禁止「默默丢掉」。


2. 参数表(按任务差异化)

2.1 通用键

参数 含义 配置位置
nms_iou 同帧 NMS IoU 检测后处理 / 导出侧
link_iou 跨帧关联 IoU(无跟踪器时) L2
min_hits 轨迹确认最少连续命中帧 L2
score_thr 检出阈值 任务配置
debounce_ms 升告警前持续满足条件时长 Schema event.debounce_ms
dwell_ms 区内停留(闯入专用,可 ≥ debounce) 围栏配置
cooldown_ms 同类再告警最小间隔 L4
spatial_iou 「同位置」判定 IoU(无 track 时) L4
exit_clear_ms 条件消失后多久允许新事件 L3/L4 复位
suppress_iou 站点同位置抑制 IoU(可选) L5

2.2 任务默认值(验收期冻结进《配置基线表》)

任务 / 事件码 score_thr nms_iou min_hits debounce_ms dwell_ms cooldown_ms spatial_iou exit_clear_ms 备注
PPE PPE_VIOLATION / PPE_NO_HELMET 0.45~0.60 0.45~0.50 3~5 2000 — 60_000~180_000 0.30 5_000 须 person 共现;作业区 ROI
闯入 PERSON_INTRUSION 0.35~0.50 0.45 5~8 2000~3000 1500~3000 120_000~300_000 0.25~0.35 5_000~10_000 足迹∩多边形;授权窗走 L5
烟火 SMOKE_FIRE fire 0.40~0.55;smoke 略高 0.40 8~15(时序) 3000~5000 — 30_000~60_000(短!) 0.20~0.30 10_000 禁止小时级冷却;蒸汽/焊花靠负样本+票窗
表计 METER_READ_* / 异常档 OCR/指针分另表 — 2~3 500~1500 — 300_000~900_000 — — 周期巡检为主;突变另开「跳变」短防抖

25 fps 时:min_hits=5 ≈ 200 ms;烟火 min_hits=10 ≈ 400 ms,再叠加 debounce_ms 做持续确认。

2.3 夜雾 / 雨雾专项(L5 画质门控,不是关模型)

条件 动作 禁止动作
blur/fog 画质分低于门限 PPE/表计:只出 telemetry + 难例采样;闯入:提高 min_hits +1~2、拉长 debounce_ms 20% 全站静音烟火
夜视 / 红外切换 切换夜视阈值档;双光未标定红外不做人员金标准(见双光手册) 白天参数硬套
已知蒸汽源 ROI 烟火:该 ROI 内 smoke 降为 attrs.steam_suspect=true,须时序+可选红外 永久屏蔽整路烟火
焊花 / 角磨作业票窗 票内时段对该 bay 降敏(提高 score 或只记 ops),票外恢复 无票永久冷却

2.4 空间键与 IoU 去重算法(无稳定 track 时)

当跟踪丢失或表计无轨迹时,用空间桶代替 track_id:

  1. 将 bbox 归一化中心 (cx,cy) 量化到网格(建议 32×18 @1080p,约 60px 一格)。
  2. 键:(cam, event_code, zone_id?, grid_x, grid_y)。
  3. 候选与该键下「上次告警框」算 IoU;若 IoU ≥ spatial_iou 且距上次告警 < cooldown_ms → L4 抑制。
  4. IoU 低于阈值视为新目标 → 允许告警并更新「上次框」。
  5. 时钟:冷却用 ts_mono_ms 差值,避免 NTP 跳变导致冷却「永久」或「瞬间到期」(对齐时间同步手册)。

伪代码:

if track_id known:
  key = (cam, code, zone, track_id)
else:
  key = (cam, code, zone, grid(cx), grid(cy))
last = state[key]
if last and now_mono - last.t < cooldown_ms and iou(box, last.box) >= spatial_iou:
  audit(SUPPRESS, COOLDOWN); return
emit_alarm(); state[key] = {t: now_mono, box}

3. 与 Schema / MQTT / 证据 / 主动学习的关系

3.1 Schema:severity / quality / debounce_ms

字段 抑制策略如何用
event.severity critical/high:L5 不得全局静音;冷却仅短窗且按 cam×code
quality 默认 suspect;抑制旁路日志不升 confirmed;画质差强制 suspect
event.debounce_ms 实际上报值写入每条告警,验收对照基线表
objects[].track_id L3/L4 主键;丢失时退化为 (cam, code, spatial_iou 桶)
扩展建议 event.suppressed 仅用于 ops/旁路 报文,不进「已确认告警」主路径;或单独 Topic …/ops/suppress

MQTT:告警仍走 …/events/{task} QoS1;被 L4/L5 抑制的重复帧不发 events,但可按需发 QoS0 ops 计数(suppress_count)进 telemetry,避免 Broker 风暴。断线缓冲优先级仍按 MQTT 手册:高严重度 events > status > 低优先级帧。

3.2 证据仓触发节流(对齐证据手册)

项 规则
与 L3 对齐 **仅「首次升告警」**触发前后窗抽帧;防抖窗内合并不重复刷盘
与 L4 对齐 同 (cam, task, 近似感知哈希) 5~15 min 最多 1 次难例/重复证据(证据手册已写)
高等级例外 SMOKE_FIRE / PERSON_INTRUSION:冷却内若 score 明显升高或新区,允许再触发 1 次(记 trigger.reason=ESCALATE)
红线 证据节流 ≠ 告警抑制失败时的「丢弃」;盘满按证据红水位,另计 evidence_drop_*

3.3 主动学习

  • 抑制不关闭 LOW_SCORE / HIGH_ENTROPY / RULE_MODEL_MISMATCH 采样。
  • 被 L5 票窗降敏的帧:优先进难例池(负样本/授权进场),标签 authorized 或 steam_suspect。
  • 人工 HUMAN_REJECT 反馈可调高该 cam×code 的 score_thr,不得自动写「永久 suppress」。

3.4 电子围栏 / PPE / 烟火衔接

场景 防抖要点
围栏 person ∩ 多边形 → dwell_ms → debounce_ms → 事件;白名单窗 = L5,须 rule_id=ticket:…
PPE 无 person 共现的 vest/helmet L2 前丢弃;同 track 冷却 1~3 min
烟火 长 min_hits + 中长 debounce_ms + 短 cooldown;蒸汽/焊花用票窗与负样本,不用长冷却「闷死」

4. 可审计抑制(实现清单)

每条抑制记录(本地 SQLite / JSONL,保留 ≥30 天):

{
  "ts_utc": "2026-10-25T01:02:03.456Z",
  "site": "SS-220-01", "cam": "bay3-camA",
  "task": "smoke_fire", "event_code": "SMOKE_FIRE",
  "track_id": 42, "score": 0.61, "iou": 0.44,
  "layer": "L4", "rule_id": "cooldown:cam+code",
  "suppress_reason": "COOLDOWN_ACTIVE",
  "cooldown_left_ms": 18200,
  "would_severity": "critical",
  "action": "NO_MQTT_EVENT_BUT_INFER_OK"
}

指标(对齐可观测性手册):alert_emit_total、alert_suppress_total{reason,layer,code}、debounce_pending_gauges;看板告警「抑制比」异常升高 → 查夜雾/阈值漂移,禁止再加长冷却掩盖。


5. 两周落地 + 验收门禁

5.1 两周清单

日 动作 产出
D1–2 规则引擎挂 L1–L4;参数进配置仓;config.ver 基线表 v0
D3–4 接入围栏 dwell + PPE 共现;烟火时序 min_hits 单路回放通过
D5–6 抑制审计日志 + Prometheus 计数;证据触发与 L3 对齐 ops 可查
D7–8 注入夜雾/蒸汽/焊花/授权进场录像;调 L5 票窗与画质门控 误报初表
D9–10 多路并行;MQTT 风暴压测(故意短 debounce) 队列不反压推理
D11–12 与 104 只读点、主动学习采样联调 联调记录
D13–14 冻结基线;写验收脚本;备份配置 基线表 v1 + 门禁报告

5.2 验收门禁(不通过不得扩站)

门禁 标准
G1 分层存在 代码/配置可指出 L1–L5;无「只改阈值」替代防抖
G2 红线 无法通过下行 cmd 对 SMOKE_FIRE/PERSON_INTRUSION 做全站无限静音;尝试须失败并记审计
G3 不停推理 抑制打开时 fps_infer 与关闭时相对偏差 ≤10%(同负载)
G4 可审计 随机抽 20 次抑制,均可从日志还原 reason/layer/rule_id
G5 任务参数 PPE/闯入/烟火/表计四套参数与基线表一致;event.debounce_ms 上送匹配
G6 误报收敛 固定 2h 夜雾回放:PPE/闯入重复告警条数较「无 L3/L4」下降 ≥70%;烟火召回不因冷却下降(用标注片段测)
G7 证据 首次告警必有证据索引;冷却内无感知哈希重复刷盘
G8 联锁 点表仍只读;无 GOOSE/跳闸映射

5.3 回放验收用例(最小集)

ID 录像内容 期望
T1 单人禁入区站立 10s 仅 1 条 PERSON_INTRUSION;含 debounce_ms
T2 同人同区持续 5 min 冷却期内无第 2 条 events;telemetry 可有 suppress_count
T3 两人先后进入不同 zone 2 条告警(不同 zone_id)
T4 蒸汽 2 min + 真烟片段 蒸汽不升 critical;真烟在 debounce 后升,且不被 6h 规则吞掉
T5 未戴帽作业 3 min PPE 1 条起告 + 冷却合并;证据 1 次索引
T6 开 L4 时断 MQTT 30s 推理 FPS 不跌;恢复后高严重度补发不丢(缓冲策略按 MQTT 手册)
T7 下行尝试 site_mute=smoke_fire 拒绝;审计 REJECT_SITE_MUTE

6. 配置片段(示例)

# config/alert_policy.yaml  — 与 model.ver 解耦,升 config.ver
schema_ver: "1.0.0"
config_ver: "2026.10.25-debounce-v1"
layers:
  nms_iou: 0.45
  tracker: bytetrack
  min_hits_default: 5
tasks:
  ppe:
    event_code: PPE_VIOLATION
    score_thr: 0.50
    require_person: true
    debounce_ms: 2000
    cooldown_ms: 120000
    spatial_iou: 0.30
  intrusion:
    event_code: PERSON_INTRUSION
    score_thr: 0.40
    dwell_ms: 2000
    debounce_ms: 2500
    cooldown_ms: 180000
    exit_clear_ms: 8000
  smoke_fire:
    event_code: SMOKE_FIRE
    score_thr: { fire: 0.45, smoke: 0.50 }
    min_hits: 12
    debounce_ms: 4000
    cooldown_ms: 45000          # 短冷却;禁止 6h
    allow_site_mute: false      # 硬编码红线
  meter:
    debounce_ms: 1000
    cooldown_ms: 600000
site_rules:
  - id: ticket_weld_bay3
    when: "ticket.weld && bay==bay-3"
    action: demote_smoke_to_ops
  - id: fog_gate
    when: "quality.fog < 0.35"
    action: tighten_min_hits:+2

下行仅允许改已备案参数(见 Schema set_threshold);allow_site_mute 对烟火/闯入恒 false。


7. 常见误区

误区 正确做法
误报多用「关相机 / 关任务」 用 L3/L4 + 负样本 + 票窗
烟火套用安防 6h 同位置抑制 短冷却 + 时序确认 + 蒸汽 ROI
冷却期内停抽帧/停难例 推理与主动学习旁路常开
抑制日志只打一行 info 结构化 + 指标 + 抽检门禁
把 quality=suspect 当抑制 suspect 仍上送;抑制是「不上送重复告警」

8. 文档修订

日期 说明
2026-10-25 初版:五层抑制、任务参数表、Schema/证据/主动学习衔接、两周落地与门禁;只落盘不改飞书
← 变电站边缘 AI:ONVIF / RTSP 相机配置与联调手册 首页 变电站边缘 AI:安全启动与运行时完整性手册 →