变电站边缘 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:
- 将 bbox 归一化中心
(cx,cy) 量化到网格(建议 32×18 @1080p,约 60px 一格)。
- 键:
(cam, event_code, zone_id?, grid_x, grid_y)。
- 候选与该键下「上次告警框」算 IoU;若
IoU ≥ spatial_iou 且距上次告警 < cooldown_ms → L4 抑制。
- IoU 低于阈值视为新目标 → 允许告警并更新「上次框」。
- 时钟:冷却用
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/证据/主动学习衔接、两周落地与门禁;只落盘不改飞书 |