Files
Pre_Seg_Server/doc/05-implementation-plan.md
admin 689a9ba283 feat: 建立 SAM2 标注闭环基线
- 打通工作区真实标注闭环:支持手工多边形、矩形、圆形、点区域和线段生成 mask,并可保存、回显、更新和删除后端 annotation。

- 增强 polygon 编辑器:支持顶点拖动、顶点删除、边中点插入、多 polygon 子区域选择编辑,以及区域合并和区域去除。

- 接入 GT mask 导入:后端支持二值/多类别 mask 拆分、contour 转 polygon、distance transform seed point,前端支持导入、回显和 seed point 拖动编辑。

- 完善导出能力:COCO JSON 导出对齐前端,PNG mask ZIP 同时包含单标注 mask、按 zIndex 融合的 semantic_frame 和 semantic_classes.json。

- 打通异步任务管理:新增任务取消、重试、失败详情接口与 Dashboard 控件,worker 支持取消状态检查并通过 Redis/WebSocket 推送 cancelled 事件。

- 对接 Dashboard 后端数据:概览统计、解析队列和实时流转记录从 FastAPI 聚合接口与 WebSocket 更新。

- 增强 AI 推理参数:前端发送 crop_to_prompt、auto_filter_background 和 min_score,后端支持点/框 prompt 局部裁剪推理、结果回映射和负向点/低分过滤。

- 接入 SAM3 基础设施:新增独立 Python 3.12 sam3 环境安装脚本、外部 worker helper、后端桥接和真实 Python/CUDA/包/HF checkpoint access 状态检测。

- 保留 SAM3 授权边界:当前官方 facebook/sam3 gated 权重未授权时状态接口会返回不可用,不伪装成可推理。

- 增强前端状态管理:新增 mask undo/redo 历史栈、AI 模型选择状态、保存状态 dirty/draft/saved 流转和项目状态归一化。

- 更新前端 API 封装:补充 annotation CRUD、GT mask import、mask ZIP export、task cancel/retry/detail、AI runtime status 和 prediction options。

- 更新 UI 控件:ToolsPalette、AISegmentation、VideoWorkspace 和 CanvasArea 接入真实操作、导入导出、撤销重做、任务控制和模型状态。

- 新增 polygon-clipping 依赖,用于前端区域 union/difference 几何运算。

- 完善后端 schemas/status/progress:补充 AI 模型外部状态字段、任务 cancelled 状态和进度事件 payload。

- 补充测试覆盖:新增后端任务控制、SAM3 桥接、GT mask、导出融合、AI options 测试;补充前端 Canvas、Dashboard、VideoWorkspace、ToolsPalette、API 和 store 测试。

- 更新 README、AGENTS 和 doc 文档:冻结当前需求/设计/测试计划,标注真实功能、剩余 Mock、SAM3 授权边界和后续实施顺序。
2026-05-01 15:26:25 +08:00

138 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后续实施建议
目标是把当前“能看、能上传、能拆帧”的系统推进到“能真实完成标注闭环”的系统。
## 阶段 1先修接口契约已完成基础对齐
优先级最高。AI 点/框推理和 COCO 导出的基础契约已经按当前代码完成对齐。
已完成:
1. `src/lib/api.ts``updateProject()` 已改为 `PATCH`
2. `exportCoco()` 路径已改为 `/api/export/{projectId}/coco`
3. Canvas 调 AI 时已使用当前帧真实 `frame.id` 作为 `image_id`
4. Canvas 点/框坐标已转成后端需要的归一化坐标。
5. 后端 `polygons` 已转成前端可渲染的 Konva path。
剩余边界:
1. SAM 3 已完成独立 Python 3.12 环境安装脚本、外部 worker 桥接和状态检查;真实推理还需要 Hugging Face `facebook/sam3` gated 权重授权通过后执行 smoke test。
2. 标注删除/更新接口已打通基础能力;逐点几何编辑器已支持顶点拖动/删除、边中点插入和多 polygon 子区域选择编辑,复杂洞结构仍待增强。
## 阶段 2打通标注保存已完成基础闭环
当前工作区可将未保存 mask 写入后端标注表,并在加载项目帧后回显。
已完成:
1. 前端根据 `Mask.segmentation` 构造后端需要的 normalized `mask_data.polygons`
2. 用户点击“结构化归档保存”后,未保存 mask 调用 `POST /api/ai/annotate`dirty mask 调用 `PATCH /api/ai/annotations/{annotation_id}`
3. 后端保存或更新 `project_id``frame_id``template_id``mask_data``bbox`;具体分类写入 `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_*.png``semantic_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:progress`FastAPI 广播到 `/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。
## 阶段 8清理 UI 文案与 Mock
建议统一这些文案和真实能力:
- SAM/GPU 状态已改为 `GET /api/ai/models/status` 驱动。
- 撤销/重做按钮已接全局 mask 历史栈。
- “重新提取内侧中轴树骨架”接真实接口,否则标为未实现。
- AI 独立页不要固定 Unsplash 图,应从当前项目帧或上传文件进入。