边缘 AI 证据仓与抽帧留存手册(变电站 / 电力场景)
调研日期:约 2026-10-25(Asia/Shanghai)
定位:告警事件的前后文抽帧、短视频、特征窗、元数据如何落盘、加密、设保留期,并与 MQTT 事件 Schema、主动学习、时间同步、D60/D90 门禁对齐。
衔接:edge-ai-event-schema-acceptance.md、edge-ai-mqtt-hardening-offline-buffer.md、edge-ai-active-learning-relabel-loop.md、edge-ai-time-sync-ntp-ptp.md、edge-ai-d60-d90-acceptance-checklist.md、edge-ai-substation-gateway-bom.md、edge-ai-model-signstore-mender-cookbook.md。
公开工具参考:本地环形缓冲 + SQLite 索引、可选 MinIO / NAS、rclone 同步;不确定处标 unknown。本文不复述站端未公开规程。
0. 一句话结论与红线
结论:证据仓是「管理信息大区 / AI VLAN」上的可审计旁路资产——以可信 ts(建议 RFC3339 UTC)+ 稳定 event_id 为键,本地 SSD/eMMC 环形缓冲优先落证,MQTT 只带 media_refs 指针;断链时推理与留证不得停,上传可后补。
| 红线 ID | 禁止项 | 说明 |
|---|---|---|
| R1 | 禁止证据无可信 ts | clock_quality 为 unsync / step_recent 时,证据可落盘但默认 quality=suspect,不得进验收金标准集或事故对标 SOE |
| R2 | 禁止把证据写进保护网 | 证据盘、MinIO、rclone 目标、标注机均不得进保护二层域;无跳闸/GOOSE/软压板路径(对齐 BOM「禁止跨保」) |
| R3 | 保留期与隐私/安保 | 含人脸/人员的帧默认脱敏副本进飞轮;明文原图仅短保留+授权;日志禁长时效预签名 URL;出境默认否 |
| R4 | MQTT 不塞大媒体 | 事件 JSON 内嵌 b64 ≤100KB;完整 clip / 多帧走对象存储或本地路径,靠 media_refs 引用 |
| R5 | 断 MQTT 仍留证 | 离线缓冲保事件;证据写入本地仓,恢复后再同步——不得因 Broker 断而停抽帧 |
1. 证据对象分层
| 层级 | 对象 | 典型格式 | 何时生成 | 与 Schema 关系 |
|---|---|---|---|---|
| L0 元数据 | 事件旁路 JSON / 索引行 | JSON + SQLite 行 | 每次告警/难例触发 | 对齐 ts_utc/msg_id/model.ver/clock_quality |
| L1 单帧 | 主证据帧(原图或 OSD) | JPEG / WebP | 告警峰值帧 + 可选前后抽样 | event.snapshot.uri 或 media_refs[] |
| L2 Overlay | 框 / 热力 / 多边形叠图 | PNG / WebP(可有损) | 调试与复核;可与 L1 同存 | 不替代 L1;审计时成对核验 |
| L3 短 clip | 告警前后 N 秒 | MP4(H.264)或环形缓冲切片 | 高严重度 / 人工抽查 | 体积大,默认更短保留期 |
| L4 MCU 特征窗 | 振动/电流等窗 | .npy / 二进制 + sidecar |
TinyML 触发同窗 | ts_gateway 为主;MCU 单调计数辅 |
| L5 模型指纹 | 权重与配置哈希 | SHA-256 + 可选 Ed25519 | 与 model.ver 绑定 |
衔接签名仓;错签事件不配可信证据 |
| L6 时钟质量 | clock_quality 快照 |
JSON 字段 | 每条证据必带或可推导 | 见时间同步手册 |
命名注意:现有事件 Schema 主时间字段为 ts_utc,消息键为 msg_id。本手册 event_id = 证据主键(推荐 = msg_id,或 ULID(site,cam,code,ts));media_refs = 指向 L1–L4 的相对路径或内网 URI 列表(MQTT 侧只传引用,不传整文件)。
2. 目录与命名约定
2.1 目录树(按日 / 站 / event_id)
/var/edgeai/evidence/ # 工业 SSD 挂载点(示例)
SS-220-01/ # site
2026/10/25/ # UTC 日(与 ts_utc 日一致,禁止混用本地日切)
bay-3/
camA/
01JABCDEF1234567890XYZ/ # event_id(= msg_id 推荐)
meta.json # L0
frame_peak.jpg # L1
frame_peak.overlay.webp # L2 可选
clip_pre3_post5.mp4 # L3 可选
feat_mcu_win.bin + feat_mcu.json # L4 可选
MANIFEST.sha256 # 内容哈希清单
MANIFEST.sig # 可选分离签名
index.sqlite # 全局索引(可按站分库)
retention.json # 保留策略版本
2.2 meta.json 最小字段
{
"schema_ver": "1.0.0",
"event_id": "01JABCDEF1234567890XYZ",
"msg_id": "01JABCDEF1234567890XYZ",
"ts": "2026-10-25T01:00:00.123Z",
"ts_utc": "2026-10-25T01:00:00.123Z",
"ts_mono_ms": 18442210,
"site": "SS-220-01",
"bay": "bay-3",
"cam": "bay3-camA",
"device_id": "box-rk3588-07",
"task": "ppe",
"event_code": "PPE_NO_HELMET",
"quality": "suspect",
"clock_quality": { "source": "ntp", "state": "sync", "offset_ms": 3.2 },
"model": { "name": "yolox-ppe", "ver": "2026.10.12-int8", "hash_sha256": "…" },
"trigger": { "reason": "ALARM", "score": 0.87, "debounce_ms": 2000 },
"media_refs": [
{ "role": "peak_frame", "path": "frame_peak.jpg", "sha256": "…", "mime": "image/jpeg" },
{ "role": "overlay", "path": "frame_peak.overlay.webp", "sha256": "…", "mime": "image/webp" },
{ "role": "clip", "path": "clip_pre3_post5.mp4", "sha256": "…", "mime": "video/mp4" }
],
"privacy": { "face_blur": true, "plate_blur": true, "raw_retained": false },
"retention_class": "alarm_30d"
}
2.3 与 Schema / MQTT 衔接
| Schema / Topic | 证据仓动作 |
|---|---|
ts_utc / 手册 ts |
目录日切与索引排序键;展示转 Asia/Shanghai |
msg_id ↔ event_id |
幂等:同 id 不重复建目录;补传不改键 |
event.snapshot.uri |
可写 file:// 相对根或内网 MinIO 预签名;禁写保护网地址 |
扩展 media_refs |
告警事件可选数组;MQTT 体积控在小 JSON |
frames Topic(QoS0) |
可节流发「有新证据」摘要;满队列优先丢 frames,本地仓仍写 |
| 难例队列字段 | snap_uri → 指向本仓 L1;trigger_reason 写入 meta.trigger |
3. 存储选型与容量估算
3.1 选型
| 层 | 推荐 | 用途 | 备注 |
|---|---|---|---|
| 热盘 | 工业 NVMe/SSD(BOM:64+128/256 GB 档) | 环形缓冲 + 当日证据 | eMMC 只放系统/索引小库,避免海量 JPEG 磨损 |
| 温盘 | 站控区 NAS 或自托管 MinIO | 超保留热盘后的冷存 / 标注拉取 | 仅 AI VLAN;TLS + 桶策略 |
| 同步 | rclone(rclone sync / copy) |
盒 → NAS/MinIO;可 cron + 限速 | 断网重试;勿在推理线程内同步 |
| 索引 | SQLite(WAL) | event_id, ts, site, cam, task, code, paths, sha256, retention_class, sync_state |
与 MQTT 离线缓冲库分文件,避免锁竞争 |
加密建议(可执行最小集):
- 盘级:LUKS / 工控盘自加密(若业主要求)——具体认证流程 unknown(按业主安规)。
- 对象:MinIO SSE-S3 或客户端加密后再
rclone;密钥不进 Git。 - 传输:HTTPS / mTLS;禁止明文 SMB 出站到公网。
3.2 容量公式(经验估算)
[
\text{GB/天} \approx N_{\text{cam}} \times R_{\text{trig}} \times \big(S_{\text{jpg}} + r_{\text{clip}} \cdot S_{\text{clip}} + r_{\text{ov}} \cdot S_{\text{ov}}\big) / 1024
]
| 符号 | 含义 | 示例默认 |
|---|---|---|
| (N_{\text{cam}}) | 路数 | 4~8 |
| (R_{\text{trig}}) | 每路每天触发留证次数(节流后) | 告警 20~100;难例另计配额 |
| (S_{\text{jpg}}) | 单帧 JPEG/WebP MB | 0.15~0.4(1080p q80) |
| (r_{\text{clip}}) | 含短视频比例 | 0.05~0.2 |
| (S_{\text{clip}}) | 单 clip MB | 约 码率Mbps × 秒 / 8;例 2 Mbps × 8 s ≈ 2 MB |
| (r_{\text{ov}}, S_{\text{ov}}) | overlay 比例与大小 | 可选;常 < 单帧 |
环形缓冲盘容量:
[
\text{SSD}{\text{GB}} \ge \text{GB/天} \times D{\text{hot}} \times 1.3
]
(D_{\text{hot}}):热保留天(告警常见 7~30;难例原图 30~90 可配,对齐主动学习手册)。1.3 为碎片/索引/MANIFEST 余量。
勿用「路数 × FPS × 全帧落盘」做主路径:全帧录像是 NVR 职责;证据仓默认事件驱动抽帧。若需持续低帧率抽样做难例负样本,单独配额并计入 (R_{\text{trig}})。
4. 触发策略
| 策略 | 规则(建议默认) | 产出 |
|---|---|---|
| 告警前后窗 | 峰值帧 + 前 (N_{\text{pre}}) / 后 (N_{\text{post}}) 秒(如 3/5);仅 L3 时编码 clip | L1+L3 |
| 仅难例 / 低置信 | 对齐主动学习:LOW_SCORE / HIGH_ENTROPY / RULE_MODEL_MISMATCH / HUMAN_REJECT / SUSPECT_STALE |
L1+meta;clip 默认关 |
| 节流与去重 | 同 (cam, task, 近似感知哈希) 冷却 5–15 min 最多 1 次;同 event_code 防抖窗内合并 |
防雨雾刷盘 |
| 严重度分级 | SMOKE_FIRE / PERSON_INTRUSION 可开 clip;普通 PPE 默认真帧 |
配额记账 |
| 时钟降级 | unsync/step_recent:仍落证,强制 quality=suspect,难例窗需人工确认 |
R1 |
| 断 MQTT | 本地 evidence_writer 与推理同机异步队列;SQLite 索引 sync_state=pending |
R5;恢复后 rclone/对象上传 |
| 红水位 | 盘 >85%:停 L3 → 停难例非人工 → 只保高严重度 L1;记 evidence_drop_* |
对齐 MQTT 丢弃哲学 |
硬规则:难例/证据触发不改联锁;SMOKE_FIRE / 闯入 / PPE 禁止因留证去跳闸。
5. 完整性:哈希、签名、防篡改
5.1 内容哈希
- 每个媒体文件写后立即算 SHA-256,写入
media_refs[].sha256与MANIFEST.sha256(sha256sum格式)。 - 索引库存同一哈希;抽检:
sha256sum -c MANIFEST.sha256。 - 上传 MinIO 后可用 ETag/校验和对账(工具链细节以版本为准,unknown 处写实测)。
5.2 可选签名(衔接模型签名仓)
| 项 | 建议 |
|---|---|
| 算法 | 与模型仓一致优先 Ed25519(openssl / minisign);密钥分离保管 |
| 签名对象 | MANIFEST.sha256 或整包 tar 的哈希 |
| 验签时机 | 审计导出前、训练集入库前、D90 抽检 |
| 失败处置 | 标记 integrity=fail;不得进 A 轨微调集 |
模型权重本身仍走 edge-ai-model-signstore-mender-cookbook.md;证据仓签名管的是媒体包,不是替换模型轨。
5.3 防篡改清单(运维可勾选)
- [ ] 证据根目录非 root 可写业务账号;挂载
nodev,nosuid(若策略允许) - [ ] 删除/改期仅走带审计日志的 GC 任务;禁人工静默
rm - [ ]
retention.json版本号入库;缩短保留期须双人确认 - [ ] 导出给外包前只给脱敏集;原图通道单独 ACL
- [ ] 定期对随机
event_id做哈希复核并留报告
6. 两周落地清单 + D60/D90 验收门禁
6.1 两周落地(可执行)
| 日 | 动作 | 产出 |
|---|---|---|
| D1 | 定挂载点、目录约定、event_id=msg_id;SSD 与 eMMC 职责拆分 |
配置基线 |
| D2 | SQLite 索引 schema + 写入 API(异步,禁阻塞推理) | 库文件 + 单测 |
| D3 | 告警触发 → L1 + meta.json + MANIFEST;MQTT 只带 uri/media_refs |
样例包 |
| D4 | 接入 clock_quality;unsync 强制 suspect |
样例 JSON |
| D5 | 前后窗 clip 可选开关;节流/感知哈希去重 | 配置项 |
| D6 | 断 Broker ≥5 min:推理 FPS 跌落 ≤5% 且 本地证据持续增长 | 实验记录(叠 D60-03) |
| D7 | 盘水位丢弃策略演练 | 水位日志 |
| D8 | 可选 MinIO 桶 + rclone 限速同步;预签名短时效 | 同步 runbook |
| D9 | 难例路径打通:snap_uri → 本仓;与主动学习队列字段对齐 |
联调记录 |
| D10 | Ed25519 签 MANIFEST(可选)+ 错签拒收演练 | 签字记录 |
| D11 | 脱敏默认开;保留期分 alarm_* / hardcase_* / train_cold |
retention.json |
| D12 | 容量试算写入 BOM 附件;热盘 ≥ 公式×1.3 | 容量表 |
| D13 | 抽检 20 条:ts 时区、哈希、跨保目视(证据网段) | 抽检表 |
| D14 | 整理进 D60/D90 文档包;修订本手册版本号 | 交付清单 |
6.2 验收门禁(对齐现有检查单,可勾选)
| id | 描述 | 级别 | 证据产物 | □ |
|---|---|---|---|---|
| EV-D60-01 | 告警事件具备可信 ts/ts_utc + event_id;无时区或缺字段否决 |
否决 | 样例 meta + Broker 事件 | □ |
| EV-D60-02 | media_refs 可打开且 SHA-256 一致;MQTT 无大体积 b64 滥用 |
否决 | MANIFEST 校验日志 | □ |
| EV-D60-03 | 断 MQTT ≥5 min:本地证据仍写入;恢复后可补同步 | 否决 | 与 D60-03 同次实验附表 | □ |
| EV-D60-04 | 证据存储与保护网隔离(目视+VLAN/ACL) | 否决 | 叠 D60-09 | □ |
| EV-D60-05 | 难例 snap_uri 指向本仓;周配额与冷却生效 |
警告/否决(飞轮站) | 难例周报 | □ |
| EV-D90-01 | 保留期、脱敏、GC 已跑通;D90-13 抓拍条款可抽检 | 警告→逾期否决 | 运维包 + 抽检 | □ |
| EV-D90-02 | 完整性:随机抽检哈希;可选签名验过;错签拒收 | 否决(若合同要求签名) | 抽检报告 | □ |
| EV-D90-03 | 难例闭环 ≥2 周期所用媒体均可按 event_id 回溯 |
否决 | 叠 D90-08 | □ |
| EV-D90-04 | 容量与 BOM 存储档一致;红水位策略可演示 | 警告 | 容量表 + 演练 | □ |
否决例:生产盒长期 unsync 仍把证据当金标准;证据盘挂在保护 VLAN;断 Broker 后停抽帧;难例集对外冒充公开 benchmark。
7. 与现有文档衔接点
| 文档 | 衔接什么 |
|---|---|
edge-ai-event-schema-acceptance.md |
ts_utc/msg_id/event.snapshot;本手册补 event_id/media_refs/clock_quality 落盘约定 |
edge-ai-mqtt-hardening-offline-buffer.md |
事件离线 SQLite 与证据仓分库;优先级丢 frames 保 events;断线测法共用 |
edge-ai-active-learning-relabel-loop.md |
难例触发码、snap_uri、30–90 天难例保留、脱敏与权属;训练集冷存迁出本仓 |
edge-ai-time-sync-ntp-ptp.md |
clock_quality 枚举与 suspect 规则;抽帧窗依赖可信 ts |
edge-ai-d60-d90-acceptance-checklist.md |
上表 EV-* 作为证据专项增补;D60-03/09、D90-08/13 强相关 |
edge-ai-substation-gateway-bom.md |
SSD/eMMC 容量档、AI VLAN、禁止跨保 |
edge-ai-model-signstore-mender-cookbook.md |
model.ver/权重 SHA;MANIFEST 可选同源 Ed25519 思路 |
edge-ai-mcu-tinyml-sensing-cookbook.md |
L4 特征窗与 ts_gateway |
8. 公开实践引用与 unknown
| 项 | 状态 |
|---|---|
| MinIO 桶生命周期 / SSE | 公开产品能力可用;站内版本与策略 按部署填写 |
| rclone 后端与限速参数 | 公开 CLI;生产参数 实测 |
| SQLite WAL 在工控闪存上的寿命 | 视盘与写入速率;高写场景优先 SSD |
| 业主安规下的精确保留天数、加密等级、审计接口 | unknown(写入合同附件,勿用本文数字替代) |
| 与站内 NVR/安防平台的官方对接规程 | unknown(本文只定义 AI 边缘自管证据仓) |
9. 结语
证据仓让「告警可复核、难例可回流、审计可对时」。落地口诀:可信 ts、本地先落、指针上云、永不跨保、哈希可验、保留可配。一切以端到端实测与业主合规为准;公开工具名不等于站端已批准部署。