变电站边缘 AI:相机脏污与画质自检手册(可执行)
调研日期:约 2026-10-25(Asia/Shanghai)
落盘:/workspace/research/edge-ai-camera-dirt-quality-selfcheck.md
定位:站端每路相机的模糊 / 脏镜 / 遮挡 / 夜间欠曝周期自检 → 质量门控 → 运维告警与工单;作为防抖 L5 画质门控的输入源;不进保护网。
衔接:edge-ai-alert-debounce-suppression.md(L5)、edge-ai-human-review-false-positive-loop.md、edge-ai-onvif-camera-commissioning.md、edge-ai-observability-logging-metrics.md、edge-ai-evidence-store-snapshot-retention.md、edge-ai-event-schema-acceptance.md、edge-ai-multistream-rtsp-scheduling.md、edge-ai-visible-ir-fusion.md、edge-ai-vlan-network-isolation.md、edge-ai-d60-d90-acceptance-checklist.md。
声明:算法阈值为工程起点,须按站内镜头/焦距/日夜标定冻结进《配置基线表》;不确定处标 unknown。本文不替代二次安规或业主站规。
0. 一句话结论与红线
结论:画质自检是「感知可信度」旁路——周期评测每路相机的清晰度/脏污/遮挡/曝光,输出 quality_gate 供 L5 降权或暂缓业务告警,并生成可审计运维工单;画质差的帧不得当作金标准确认,自检进程不进 PROT,且脏镜/欠曝告警不得被用来永久静音烟火。
| 红线 ID | 禁止项 | 说明 |
|---|---|---|
| Q1 | 画质差不得假确认金标准 | blur/dirt/occlude/underexpose 超阈时,业务事件强制 quality=suspect;禁止自动 confirmed,禁止进验收金标准集 / 事故对标 SOE |
| Q2 | 自检不进 PROT | 采样、指标、工单、MQTT ops/telemetry 均在 AI/CAM/MGMT VLAN;禁止进保护二层、GOOSE、软压板、跳闸回路(对齐 VLAN N1/N5、ONVIF C5) |
| Q3 | 脏镜告警不得永久静音烟火 | L5 仅允许:按 cam×任务降权 / 拉长 debounce / 暂缓 PPE·表计;SMOKE_FIRE / 高严重度闯入禁止因脏镜一键全站静音或写永久 suppress(对齐防抖 R2、复核 H5) |
| Q4 | 自检不得挡推理主路径 | 清晰度/遮挡评测异步、有界队列;满则丢本轮自检样本,不得阻塞解码/NPU |
| Q5 | 不得改写原始证据 | 自检快照进 ops/quality/ 或证据仓旁路目录;禁止覆写业务告警的 frame_peak.jpg / meta.json 金字段 |
1. 检测指标、阈值与采样周期
1.1 指标定义(均可配置)
| 指标键 | 算法要点 | 输出 | 典型用途 |
|---|---|---|---|
laplacian_var |
灰度图 Laplacian 方差(清晰度) | float | 模糊 / 失焦 / 雨雾糊 |
contrast_rms |
RMS 对比度或全局标准差 | float | 雾、脏膜、强逆光发灰 |
brightness_mean |
均值亮度(0~255 或 0~1) | float | 欠曝 / 过曝 |
dark_ratio |
低于暗阈像素占比 | 0~1 | 夜间欠曝、IR 失效 |
bright_clip_ratio |
近饱和像素占比 | 0~1 | 过曝、眩光 |
occlude_ratio |
前景遮挡估计:大块低纹理连通域 / 边缘缺失比 / 可选语义「手/布/异物」 | 0~1 | 脏镜斑、贴纸、人为遮挡 |
dirt_score |
综合:局部对比度塌陷 + 斑块数 +(可选)与洁净基线帧差分 | 0~1 | 油污、水渍、尘积 |
ir_cut_state |
日夜切换态(ONVIF / 厂商私有 / 亮度启发式) | day/night/unknown | 夜视档阈值切换 |
freeze_score |
相邻采样帧差分过低持续 N 次 | 0~1 | 卡死画面 / 假流 |
实现注意:默认在分析子码流上抽样(720p@10~15fps 管线隔帧即可),ROI 可裁「有效监视区」避开 OSD 时钟区;Laplacian 前建议轻度高斯或直接对下采样图算,控 CPU。
1.2 建议默认阈值(验收期标定后冻结)
| 条件码 | 触发逻辑(起点) | 严重度 | 默认动作摘要 |
|---|---|---|---|
BLUR |
laplacian_var < T_blur 连续 M 次 |
warning→major | 降权 + 难例标 quality_bad |
LOW_CONTRAST |
contrast_rms < T_ctr 连续 M 次 |
warning | 同左;雾天可叠气象票窗 |
UNDEREXPOSE |
夜:brightness_mean < T_dark 或 dark_ratio > T_dr |
major | 切夜视阈值档;双光未标定禁人员金标准 |
OVEREXPOSE |
bright_clip_ratio > T_br |
warning | 暂缓表计 OCR 金标准 |
OCCLUDE |
occlude_ratio > T_occ(如 0.25~0.40) |
major | 工单「清障/擦镜」;业务告警暂缓(烟火除外策略见 §2) |
DIRT |
dirt_score > T_dirt 或斑块面积比超阈 |
major | 运维擦镜工单;L5 画质门控 |
FREEZE |
freeze_score 连续超阈 |
critical(运维) | 标 stream_suspect;触发 RTSP 重拉,不静音烟火逻辑 |
起点数值(须站内标定,非合同 SLA):
| 参数 | 建议起点 | 配置位置 |
|---|---|---|
T_blur(Laplacian var,720p 灰度) |
80~150(镜头/降噪相关,unknown 以洁净基线 30% 分位为准) | quality.cam.*.T_blur |
T_ctr |
基线对比度的 40%~50% | 同上 |
T_dark / T_dr |
mean\<35 或 dark_ratio>0.55(夜) | 夜视档 |
T_br |
clip_ratio>0.15 | 昼 |
T_occ |
0.30 | 遮挡 |
T_dirt |
0.40 | 脏污综合 |
M(连续命中) |
3(防单帧误判) | 防抖式 |
hold_clear_n |
5 次正常后复归 | 复归迟滞 |
日/夜两套阈值;ir_cut_state=night 时启用夜档,并禁止把昼档硬套到红外图做人脸/人员金标准(对齐双光手册)。
1.3 采样周期与负载
| 项 | 建议 | 说明 |
|---|---|---|
| 常态采样周期 | 60~120 s / 路 | 错峰;C 档 16~32 路须分片调度 |
| 告警后加密采样 | 触发后 15~30 s × 连续 3~5 次确认 | 减少闪报 |
| 每轮算力 | ≤ 1 帧 下采样评测;禁全分辨率逐帧 Laplacian | 对齐 Q4 |
| 基线帧 | 联调洁净态存 baseline/{cam}.jpg + 指标快照 |
ONVIF 联调勾选后写入;变更镜头后重采 |
| 输出 | MQTT …/telemetry/quality(周期)+ …/events/ops(状态变迁) |
指标低基数 label:cam,code |
1.4 与 ONVIF 联调勾选增量
在 edge-ai-onvif-camera-commissioning.md 清单末追加(本手册落地时一并勾):
| # | 项 | 目标 |
|---|---|---|
| QN1 | 分析子码流可稳定抽帧 ≥10 min | 自检输入可靠 |
| QN2 | 洁净态采集 baseline/{cam}.jpg + 指标快照入库 |
脏污差分有参照 |
| QN3 | 日↔夜切换至少验证 1 次;记录 ir_cut_state 来源 |
夜档阈值不混用 |
| QN4 | OSD 避开自检 ROI(或 ROI 扣除 OSD 带) | 降低假模糊 |
| QN5 | 故意半遮挡镜头 30 s:应出 OCCLUDE/DIRT ops,恢复后 hold_clear_n 内复归 |
门控可演示 |
2. 门控动作与上下游衔接
2.1 动作矩阵(按任务差异化)
| 质量态 | PPE / 表计 | 闯入 | 烟火 SMOKE_FIRE |
运维 |
|---|---|---|---|---|
OK |
正常 L3/L4 | 正常 | 正常 | — |
DEGRADED(轻糊/轻雾) |
只出 telemetry + 难例;或 score_thr+0.05 |
min_hits+1~2,debounce_ms×1.2 |
保持检测;可标 attrs.quality=degraded |
ops warning |
BAD(脏镜/遮挡/严重欠曝) |
暂缓升告警(不发 events,可记 ops) | 暂缓或强 suspect+强制复核 |
禁止静音;仅允许提高时序 min_hits 上限内 + 强制 suspect;仍须短冷却可审计 |
工单擦镜/清障/查供电 |
FREEZE / 断流 |
随 stream_up=0 |
同左 | 同左;重拉流优先 | critical ops |
原则:降权 / 暂缓 / 工单 ≠ 关模型;推理主路径恒开(对齐防抖 R4)。
2.2 与防抖 L5
画质模块写入每路 quality_gate={OK|DEGRADED|BAD|FREEZE} 与 codes[],供 L5 读取:
- L5 规则 ID 建议:
QG_BLUR/QG_DIRT/QG_OCC/QG_NIGHT; - 每次因画质抑制或降权须审计:
suppress_reason=QUALITY_GATE、rule_id、laplacian_var、dirt_score; - 禁止 L5 把
BAD映射为「全站静音烟火」。
2.3 与人工复核台
- 业务告警若携带
attrs.quality_gate!=OK→ 复核台默认展示「画质差」角标;证据加载失败仍只允许defer。 - 驳回原因码优先
FP_QUALITY(见复核手册 §1.3);不得因单次驳回自动写永久 suppress。 - 确认按钮在
BAD态下应二次提示:「当前相机画质门控为 BAD,确认仅升通知态,不作金标准」。
2.4 与证据仓
| 对象 | 路径建议 | 保留 |
|---|---|---|
| 自检触发帧 | evidence/ops/quality/{site}/{cam}/{ts}/snap.jpg |
短保留(如 7~30 d) |
| sidecar | quality.json:指标、阈值版本、baseline_hash、decision |
同左 |
| 业务告警证据 | 不变;仅在 meta 旁路字段或事件 attrs 引用 quality_gate |
对齐证据仓 R2/R3 |
禁止用自检帧覆盖 frame_peak.jpg。
2.5 与 ONVIF / 可观测性
- ONVIF:联调清单增项——洁净基线采集、日夜切换验证、IR-cut 可读则写入
ir_cut_state;Web/OSD 不可替代网关ts。 - 指标(低基数):
edgeai_cam_laplacian_var{cam}、edgeai_cam_dirt_score{cam}、edgeai_cam_occlude_ratio{cam}、edgeai_cam_quality_gate{cam}(枚举映射 0/1/2/3)、edgeai_cam_quality_alarm_total{cam,code}。 - 日志:状态变迁打 JSON:
cam,code,from,to,metrics,cfg_ver;禁人脸原图与密钥(对齐 O1)。 - 告警启发:
quality_gate=BAD持续 ≥10 min → 工单;FREEZE≥60 s → 与stream_up联动。
2.6 工单最小字段(运维闭环)
| 字段 | 必填 | 说明 |
|---|---|---|
ticket_id / cam / site / bay |
Y | 定位镜头 |
codes[] |
Y | 如 DIRT,OCCLUDE |
since_ts / duration_s |
Y | 进入 BAD 起算 |
metrics_snapshot |
Y | 触发时指标 |
suggested_action |
Y | CLEAN_LENS / CLEAR_FOREGROUND / CHECK_FOCUS / CHECK_IR / CHECK_POE |
quality.cfg_ver |
Y | 阈值版本可追溯 |
linked_event_ids |
可选 | 同期被降权的业务告警 |
工单复归条件:hold_clear_n 次采样均 OK,或现场勾选「已擦镜」并重采基线(重大清洁后建议重采)。
2.7 算法伪代码(边缘侧)
every sample_period_s, per cam (staggered):
frame = grab_substream_roi(cam)
m = {laplacian_var, contrast_rms, brightness_mean,
dark_ratio, bright_clip_ratio, occlude_ratio, dirt_score, freeze_score}
thr = night_thr if ir_cut_state==night else day_thr
codes = evaluate(m, thr) # 单帧候选码
state = update_hysteresis(cam, codes, M, hold_clear_n)
gate = map_gate(state) # OK/DEGRADED/BAD/FREEZE
publish_telemetry(cam, m, gate)
if gate_changed:
publish_ops_event(...); maybe_open_ticket(...)
write_sidecar_evidence(...) # 旁路,不覆盖业务 peak
apply_L5(cam, gate) # 降权/暂缓;烟火禁 mute
遮挡估计(无语义模型时):对灰度做局部方差图,低方差且大面积连通域占比 → occlude_ratio;可选与 baseline 做结构相似(SSIM 区域)辅助。有轻量分割时可将「手/布/纸」类先验并入,但仍须 M 次确认。
脏污 vs 雾:雾偏全局对比度均匀下降;脏污偏局部斑块。两者可同时为真;L5 取更严门控,工单可并条。
3. 两周落地计划
| 日 | 产出 | 完成定义 |
|---|---|---|
| D1–D2 | 选型:子码流抽样点、ROI、基线采集脚本;配置键进仓库 | 1 路相机洁净基线 + 指标可复现 |
| D3–D4 | 实现 Laplacian/对比度/亮度/遮挡最小集;周期 60~120 s | /metrics 可见;CPU 占用可接受 |
| D5 | 脏污综合分 + 连续 M 次迟滞;日/夜双档 | 人为遮挡/擦镜前后可区分 |
| D6 | 接入 L5:quality_gate → 降权/暂缓矩阵(烟火例外写死) |
单测:BAD 时 PPE 无 events、烟火仍可升 suspect |
| D7 | MQTT telemetry/quality + events/ops;证据旁路目录 |
Broker 可见状态变迁 |
| D8 | 复核台角标 + FP_QUALITY 联调;禁止盲确认文案 |
UI 抽测通过 |
| D9 | 多路错峰;与 RTSP watchdog / ONVIF 基线流程挂钩 | 8 路无拖垮推理 |
| D10 | 工单字段:cam、codes、持续时长、建议动作(擦镜/查焦/查供电) | 运维可闭环 |
| D11–D12 | 站内标定:雨雾/夜间/故意脏镜注入;冻结阈值进基线表 | 误报自检 ≤ 约定 |
| D13–D14 | 验收演练 + 文档;失败回滚开关 quality_gate.enable=false(仅关门控,不关推理) |
门禁全绿或书面偏差 |
4. 验收门禁(D60/D90 可勾选)
| ID | 门禁项 | 否决? |
|---|---|---|
| G1 | 画质 BAD 时业务事件均为 quality=suspect,无自动 confirmed |
是 |
| G2 | 网络抓包 / 路由:自检与 ops 无至保护 VLAN 路径 | 是 |
| G3 | 注入脏镜/遮挡:产生 ops 工单;烟火任务未被永久静音(仍可检出测试火焰/烟,或至少保持检测+短冷却) | 是 |
| G4 | 自检高峰时 decode_fps / infer_latency 相对基线劣化 ≤ 约定(建议 ≤10%) |
是 |
| G5 | 连续 M 与 hold_clear_n 迟滞有效:闪断不抖报 |
是 |
| G6 | 证据旁路存在且未覆盖业务 frame_peak;复核 FP_QUALITY 可提交 |
是 |
| G7 | 指标与日志无密钥、无完整未脱敏人脸 | 是 |
| G8 | 配置版本 quality.cfg_ver 写入每条 ops;可回滚禁用门控 |
是 |
5. 配置片段(示例)
quality_gate:
enable: true
sample_period_s: 90
confirm_hits: 3
hold_clear_n: 5
stream: sub # 分析子码流
day:
T_blur: 100
T_ctr_ratio: 0.45
T_occ: 0.30
T_dirt: 0.40
night:
T_blur: 60
T_dark: 35
T_dr: 0.55
T_occ: 0.30
actions:
PPE: { DEGRADED: demote, BAD: defer_events }
INTRUSION: { DEGRADED: tighten_debounce, BAD: suspect_force_review }
SMOKE_FIRE: { DEGRADED: tag_only, BAD: tag_suspect_keep_detect } # 禁止 mute
ops_ticket_after_s: 600
6. 速查
| 问题 | 处理 |
|---|---|
| 雨雾季节自检误报多 | 提高 T_blur 迟滞或叠气象降权;勿关烟火 |
| 夜视偏色导致「假脏」 | 分日夜基线;IR 图单独阈值 |
| 故意贴纸遮挡 | OCCLUDE→工单;闯入暂缓;烟火保持检测 |
| 自检 CPU 高 | 降采样、拉长周期、多路错峰 |
| 与金标准集冲突 | 凡 quality_gate!=OK 的样本默认剔除出金标准 |
| 多路同时 BAD(沙尘暴) | 站点级 DEGRADED 策略:统一降权非烟火任务;开汇总工单;仍禁全站静音烟火 |
| 基线过期(换镜头/改焦距) | 强制重采基线;禁止继续用旧基线判脏 |
一句话交付口径:先让每路相机「可信度」可测、可门控、可工单;门控只降业务告警权重与验收资格,永不代替保护,也永不用脏镜当借口永久关掉烟火通道。
7. 失败模式与禁止项对照
| 失败模式 | 正确应对 | 禁止 |
|---|---|---|
| 误报脏镜导致值班关掉烟火任务 | 仅降权 PPE/表计;烟火保持 + 工单擦镜 | 配置「DIRT → mute SMOKE_FIRE」 |
| 把模糊帧标成确认告警交差 | 强制 suspect;复核二次确认文案 | 自动 confirmed |
| 自检打满 CPU 掉帧 | 拉长周期、降采样、错峰 | 在推理线程同步 Laplacian |
| 清洁后仍 BAD | 重采 baseline;查阈值是否夜档错用 | 手工改历史证据 meta |
| 相机进保护调试 VLAN | 拒绝联调;回到 CAM VLAN | 「临时」跨保口 |