Files
Pre_Seg_Server/doc/05-implementation-plan.md
admin 4c21de02f8 feat: 完善标注删除、AI 框选与视频传播交互
功能增加:

- 在工作区增加按范围传播和传播全部可达入口,支持选中区域或当前帧全部 mask 作为 seed,并按前后帧范围调用 SAM2 传播后刷新已保存标注。

- 在 AI 智能分割中接入框选提示,支持 box prompt 以及 box + 正/反向点的 interactive prompt 细化流程。

- 在 AI 智能分割中增加提示点删除、最近锚点删除、清空锚点、选中 AI 候选删除和 Delete/Backspace 快捷删除。

- 在项目库删除项目后同步清理当前项目、帧、mask 与选区状态,避免删除后工作区残留旧数据。

- 将时间进度条上的已编辑帧提示改为覆盖在进度条上的琥珀色竖线,并保留已编辑帧计数。

- 将 AI 参数文案调整为局部专注模式(自动裁剪无锚区域)和严格除杂模式(自动清理干涉点),仅改善可读性,不改变内部字段。

Bugfix:

- 修复 AI 框选工具无实际 prompt 输出的问题。

- 修复多次执行 AI 高精度语义分割时旧候选 mask 叠加显示的问题,改为替换本页 AI 候选。

- 修复删除 AI 候选后选区仍引用已删除 mask 的状态残留。

- 修复进度条当前帧提示与已编辑帧提示颜色/语义混淆的问题,当前帧继续由播放进度和缩略图高亮表达。

测试与文档:

- 补充 AI 分割框选、候选替换、提示点删除和快捷删除相关测试。

- 补充工作区传播范围、传播全部可达、编辑区域删除和项目删除状态清理测试。

- 更新 README、AGENTS 和 doc 下需求冻结、设计冻结、接口契约、前端审计、实施计划、测试计划,记录当前真实功能和测试覆盖。
2026-05-02 00:56:13 +08:00

7.6 KiB
Raw Blame History

后续实施建议

目标是把当前“能看、能上传、能拆帧”的系统推进到“能真实完成标注闭环”的系统。

阶段 1先修接口契约已完成基础对齐

优先级最高。AI 点/框推理和 COCO 导出的基础契约已经按当前代码完成对齐。

已完成:

  1. src/lib/api.tsupdateProject() 已改为 PATCH
  2. exportCoco() 路径已改为 /api/export/{projectId}/coco
  3. Canvas 调 AI 时已使用当前帧真实 frame.id 作为 image_id
  4. Canvas 点/框坐标已转成后端需要的归一化坐标。
  5. 后端 polygons 已转成前端可渲染的 Konva path。

剩余边界:

  1. SAM 3 相关源码和安装脚本保留,但当前产品入口已禁用:前端不展示 SAM 3后端 registry 不暴露 sam3model=sam3 请求返回不支持。若后续重新需要文本语义提示再恢复前端入口、registry、状态接口和对应测试。
  2. 标注删除/更新接口已打通基础能力;逐点几何编辑器已支持顶点拖动/删除、边中点插入和多 polygon 子区域选择编辑,复杂洞结构仍待增强。

阶段 2打通标注保存已完成基础闭环

当前工作区可将未保存 mask 写入后端标注表,并在加载项目帧后回显。

已完成:

  1. 前端根据 Mask.segmentation 构造后端需要的 normalized mask_data.polygons
  2. 用户点击“结构化归档保存”后,未保存 mask 调用 POST /api/ai/annotatedirty mask 调用 PATCH /api/ai/annotations/{annotation_id}
  3. 后端保存或更新 project_idframe_idtemplate_idmask_databbox;具体分类写入 mask_data.class
  4. 工作区加载帧后调用 GET /api/ai/annotations 回显已保存标注。
  5. 工作区“清空遮罩”调用 DELETE /api/ai/annotations/{annotation_id} 删除当前帧已保存标注。

剩余建议:

  1. 加入保存冲突处理和批量保存错误提示。
  2. 逐点几何编辑器已支持拖动/删除顶点、边中点插入新点和多 polygon 子区域编辑;后续增强为复杂洞结构编辑。
  3. 区域合并/去除已支持基础 union/difference后续增强为更明确的多选列表、操作预览和冲突确认。

阶段 3接入导出按钮已完成 COCO JSON 和 PNG Mask ZIP

当前工作区“导出 JSON 标注集”和“导出 PNG Mask ZIP”都会先保存未归档 mask再调用后端导出接口。

已完成:

  1. COCO JSON 调用 /api/export/{projectId}/coco
  2. PNG Mask ZIP 调用 /api/export/{projectId}/masks
  3. ZIP 内保留单标注二值 mask_*.png,同时输出 semantic_frame_*.pngsemantic_classes.json

剩余建议:

  1. 无标注时给出更明确的空导出提示。

阶段 4替换 Dashboard mock

当前 Dashboard 已通过 GET /api/dashboard/overview 读取后端聚合快照,不再使用硬编码初始统计、队列或活动日志。

已完成:

  • 聚合项目、帧、标注、模板数量和主机 load average。
  • processing_tasks queued/running/failed/cancelled 任务生成解析队列。
  • 按最近任务、项目、标注、模板记录生成活动流。

已完成补充:

  1. Dashboard 对 queued/running 任务提供取消按钮。
  2. Dashboard 对 failed/cancelled 任务提供重试按钮。
  3. Dashboard 详情弹窗展示任务 error、payload、result、Celery ID 和时间。

剩余建议:

  1. 为 Dashboard 增加任务历史筛选。

阶段 5异步拆帧和进度

Word 方案中提到 Celery + Redis。当前已经有 Celery app、worker task 和 processing_tasks 表。

已完成:

  1. 新建 Celery app。
  2. POST /api/media/parse 只创建任务并立即返回 task id。
  3. worker 执行 FFmpeg/OpenCV/pydicom。
  4. worker 写 PostgreSQL 任务进度。
  5. worker 发布 Redis seg:progressFastAPI 广播到 /ws/progress

已完成补充:

  1. POST /api/tasks/{task_id}/cancel 取消 queued/running 任务,并尝试 revoke Celery。
  2. POST /api/tasks/{task_id}/retry 为 failed/cancelled 任务创建新的 queued 任务。
  3. worker 在关键阶段检查 cancelled 状态,避免取消后继续写帧。
  4. Redis/WebSocket 进度事件增加 cancelled 类型。

Dashboard 的解析队列现在已经从“项目状态派生”升级为任务表驱动,实时推送也已通过 Redis/WebSocket 打通;剩余重点是任务历史筛选和更细的 worker 中断粒度。

阶段 6GT 导入与点区域(已完成基础增强版)

Word 方案中的完整版本包含距离变换、骨架提取和聚类。当前已经完成基础增强版:导入二值/标签 mask 图片后,后端按非零像素值拆分类别,再按连通域生成 polygon 标注,并用距离变换提取一个正向 seed point。

已完成:

  1. 工作区提供“导入 GT Mask”入口。
  2. 前端调用 POST /api/ai/import-gt-mask multipart 接口。
  3. 后端按非零像素值拆分多类别 mask。
  4. 后端使用 OpenCV contour 提取每个类别下的连通域。
  5. 后端使用 distance transform 生成 points seed。
  6. 导入结果写入 annotations 表并回显为工作区 mask。
  7. 前端把 seed point 转为像素坐标显示在 Canvas 上,拖动后会标记标注为 dirty 并可归档保存。

剩余建议:

  1. 增加骨架提取和聚类增强。
  2. 为多类别像素值提供模板分类自动映射规则。

阶段 7模板优先级融合已完成导出侧裁决

当前导出 PNG Mask ZIP 时已经按 class/template z-index 做重叠裁决,从低到高覆盖,生成每帧 semantic_frame_*.png

已完成:

  1. 标注保存时记录 template class id / name / zIndex。
  2. 导出 mask 时按 zIndex 从低到高覆盖。
  3. 同类语义值在融合图中共享同一个 class value。
  4. 跨类重叠由高 zIndex 覆盖低 zIndex。

剩余建议:

  1. 在前端预览重叠裁决结果。
  2. 对多帧多类导出增加颜色 palette PNG 或可视化 legend。

阶段 7.5:视频片段传播(已完成基础闭环)

当前工作区传播功能会使用当前帧的选中 mask 或当前帧全部 mask 作为 seed按用户设置的起止帧向前、向后或双向传播并把结果写入后端标注表。“传播全部可达”会把范围设置为项目第 1 帧到最后 1 帧。

已完成:

  1. 前端 propagateMasks() 已接入 POST /api/ai/propagate
  2. 工作区会把 seed mask 的 normalized polygon、bbox、label、color 和 class 元数据传给后端。
  3. SAM 2 路径使用官方 SAM2VideoPredictor.add_new_mask()propagate_in_video()
  4. SAM 3 video tracker 路径已从当前产品入口禁用,相关 helper 仅保留作后续恢复参考。
  5. 后端会跳过源帧,把传播结果保存到后续帧 annotations,并在完成后由前端刷新回显。
  6. 前端已经支持传播对象选择、起止帧范围和“传播全部可达”;多个 seed 或前后双向范围会拆成多次顺序调用单 seed 后端接口。

剩余建议:

  1. 把传播任务改为异步任务,接入 Dashboard 和 WebSocket 进度。
  2. 增加覆盖已有标注策略设置,例如跳过已有、覆盖同类、全部覆盖。
  3. 用真实长视频做 SAM 2 tracker smoke test 和质量评估;如果未来恢复 SAM 3再单独补充 SAM 3 tracker 评估。

阶段 8清理 UI 文案与 Mock

建议统一这些文案和真实能力:

  • SAM/GPU 状态已改为 GET /api/ai/models/status 驱动。
  • 撤销/重做按钮已接全局 mask 历史栈。
  • “重新提取内侧中轴树骨架”接真实接口,否则标为未实现。
  • AI 独立页不要固定 Unsplash 图,应从当前项目帧或上传文件进入。