状态: 规划定稿(2026-08-21) 目标: ① 取消会话停止时的逐屏自动捕获(会话 33 实测 50%+ 结构图围绕字幕,误收严重); ② 改为手动一键分析参考图集(full/ 全部归档帧)——结构图只记表格/公式/代码/流程图等 含有文本信息且 OCR 不准确的图。 依据: 会话 33 真机验收实测(2026-08-21)· v0.7.7 结构图机制(REQ-182~185)交付后质量回归 关联: v0.7.7(本版修正其结构图机制)· ADR-010(图语义纯本地无法还原)·
SessionOcrBlock字幕标记(v0.7.3 REQ-155/156)
现象:会话 33 的结构图 50%+ 围绕字幕区域。
根因:字幕背景条 + 白色文字在 32×18 版面网格中呈现为"满宽长直线 + 中等墨迹密度 + 合适面积",
恰好命中 diagram_likeness 三项特征(长直线 0.75 / 墨迹密度 0.15 / 面积占比 0.10):
被版面分析判为 Text 后,旧门控 diagram_likeness ≥ 0.5 轻易通过 → 字幕条入库为结构图。
关键洞察:数据库已具备字幕标记(SessionOcrBlock.region="subtitle" + 帧坐标 bbox,v0.7.3 落库),
但结构图管线从未消费该信号。准确性判据应是"含文本且 OCR 不准确"——OCR 自己的表现就是最直接的度量。
| # | 决策点 | 结论 | 被否方案 |
|---|---|---|---|
| 1 | 捕获时机 | 取消停止后自动捕获,改为图库「分析参考图集」手动一键 | 保留自动(误收无感知);保留逐屏采样(复杂度高收益低) |
| 2 | 分析对象 | 直接扫描参考图集 full/ 全部归档帧(与图集画廊同源) | 逐屏构建 + 帧采样 + 选优帧(旧管线,样本与字幕纠缠) |
| 3 | Text 区域策略 | OCR 置信度动态判断(L2):高置信 → 已还原 → 拒;低置信/无块 → 收 | 全部跳过(漏掉被判 Text 的真实流程图);全部收(字幕误收不变) |
| 4 | 字幕拦截 | L0:候选区域与字幕块 bbox IoU ≥ 0.3 → 拒 | 仅底部条带位置约束(旧数据无字幕标记时兜底用 L3) |
| 5 | 历史数据 | 不清理(只影响新捕获,旧记录用户手动删) | 自动清理(误删风险);启动时全量扫描(成本高收益低) |
判定顺序(任一拒则拒,全部过则收):
| 层 | 机制 | 规则 | 作用 |
|---|---|---|---|
| L3 | 位置约束(最廉价预过滤) | 区域中心位于画面底部 12% 且 高宽比 > 8:1 → 拒 | 字幕条形状特征;防旧数据无字幕标记 |
| L0 | 字幕块重叠拦截 | 与 region="subtitle" 块 bbox IoU ≥ 0.3 → 拒 |
直接解决 50%+ 误收(字幕块 bbox 同帧坐标系) |
| L1 | 版面类型 | Table/Formula/Code 直收;Unknown 拒 | 结构布局 OCR 无法还原,直收不查 OCR |
| L2 | OCR 置信度反向信号 | Image/Text 过 diagram_likeness 后:重叠 full 块平均分 ≥ 0.7 → 拒;< 0.5 或无块 → 收;0.5~0.7 → 收(模糊地带偏向收,V1.0 用户删除反馈校准) | "OCR 不准确"的直接度量——OCR 已还原的线性文本不收 |
OCR 块与参考图帧同时间基(相对会话起点 ms),按 ±3s 时间窗(STRUCTURE_OCR_WINDOW_MS)对齐。
| # | 文件 | 改动 |
|---|---|---|
| 1 | app/src-tauri/src/commands_live.rs |
删除停止后 trigger_auto_capture_structures 调用与函数(trigger_auto_refine 保留) |
| 2 | app/src-tauri/src/structure_detect.rs |
新增 StructureFilterContext + decide_keep + iou_frame;删除 edge_energy/pick_sharpest/filter_structure_regions 死代码;新增 5 常量(SUBTITLE_IOU_MIN/OCR_SCORE_CONFIDENT/OCR_SCORE_WEAK/BOTTOM_BAND_RATIO/SUB_BAR_ASPECT) |
| 3 | app/src-tauri/src/structure_capture.rs |
重写主循环直扫参考图集(list_full_image_timestamps 全量);新增 build_filter_context/decode_frame;删除 frame_candidates/decode_candidates/MAX_FRAMES_PER_SCREEN;CaptureSummary.screens_scanned → images_scanned |
| 4 | app/src-tauri/src/structure_detect_tests.rs |
删除 pick_sharpest 4 测试;新增 decide_keep L0/L2/L3 用例(字幕重叠拒 / 高置信拒 / 低置信与无块收 / 底部条带拒 / 结构三类直收) |
| 5 | app/src-tauri/src/structure_capture_tests.rs |
删除 frame_candidates 2 测试;新增字幕帧+表格帧端到端(只收表格);新增过滤上下文时间窗/无 bbox 用例 |
| 6 | app/src/components/StructureImageSection.tsx |
「重新捕获」→「分析参考图集」;空状态/成功文案更新;imagesScanned 字段适配 |
保留不动:layout_analyzer.rs(版面分析)、db_structures.rs/structure_store.rs(存储层)、
screens.rs/screen_merge.rs(屏卡体系——手动框选仍依赖)、commands_images.rs(参考图集)、
手动框选 capture_structure_manual、历史已入库数据。
| 步骤 | 内容 | 验收 |
|---|---|---|
| M1 | Rust 单测 | structure_detect 13 用例 + structure_capture 10 用例全绿(含字幕拦截端到端);cargo test 无本次改动引入的失败;cargo clippy 干净 |
| M2 | 前端 | tsc --noEmit 通过;按钮/空状态/成功文案更新 |
| M3 | 真机回归(人工) | 会话 33 重跑「分析参考图集」:字幕结构图不再产生;表格/公式/代码仍正常捕获 |
| M4 | 回归 | 停止会话不再自动产生结构图(行为变更符合预期);手动框选/删除/大图预览不劣化 |
- 用户删除反馈回路(D1 既有设计):统计删除结构图的特征(位置/类型/OCR 信号)反哺阈值
- L2 模糊地带(0.5~0.7)当前偏向收,真机数据积累后校准
- unknown 区域归 V1.0 AI 补缝(ADR-010 不变)