Skip to content

Latest commit

 

History

History
74 lines (55 loc) · 5.98 KB

File metadata and controls

74 lines (55 loc) · 5.98 KB

v0.10.2 — 结构图准确性重构:参考图集单一分析 + 三层过滤

状态: 规划定稿(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 实测)

现象:会话 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 自己的表现就是最直接的度量。

二、探讨结论(2026-08-21)

# 决策点 结论 被否方案
1 捕获时机 取消停止后自动捕获,改为图库「分析参考图集」手动一键 保留自动(误收无感知);保留逐屏采样(复杂度高收益低)
2 分析对象 直接扫描参考图集 full/ 全部归档帧(与图集画廊同源) 逐屏构建 + 帧采样 + 选优帧(旧管线,样本与字幕纠缠)
3 Text 区域策略 OCR 置信度动态判断(L2):高置信 → 已还原 → 拒;低置信/无块 → 收 全部跳过(漏掉被判 Text 的真实流程图);全部收(字幕误收不变)
4 字幕拦截 L0:候选区域与字幕块 bbox IoU ≥ 0.3 → 拒 仅底部条带位置约束(旧数据无字幕标记时兜底用 L3)
5 历史数据 不清理(只影响新捕获,旧记录用户手动删) 自动清理(误删风险);启动时全量扫描(成本高收益低)

三、四层过滤机制(decide_keep)

判定顺序(任一拒则拒,全部过则收):

层 机制 规则 作用
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 回归 停止会话不再自动产生结构图(行为变更符合预期);手动框选/删除/大图预览不劣化

六、V1.0 校准预留

  • 用户删除反馈回路(D1 既有设计):统计删除结构图的特征(位置/类型/OCR 信号)反哺阈值
  • L2 模糊地带(0.5~0.7)当前偏向收,真机数据积累后校准
  • unknown 区域归 V1.0 AI 补缝(ADR-010 不变)