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 授权边界和后续实施顺序。
This commit is contained in:
@@ -16,8 +16,8 @@
|
||||
|
||||
剩余边界:
|
||||
|
||||
1. SAM 3 真实推理需要独立满足官方 Python 3.12+、PyTorch 2.7+、CUDA 12.6+ 环境。
|
||||
2. 标注删除/更新接口已打通基础能力;逐点几何编辑器尚未实现。
|
||||
1. SAM 3 已完成独立 Python 3.12 环境安装脚本、外部 worker 桥接和状态检查;真实推理还需要 Hugging Face `facebook/sam3` gated 权重授权通过后执行 smoke test。
|
||||
2. 标注删除/更新接口已打通基础能力;逐点几何编辑器已支持顶点拖动/删除、边中点插入和多 polygon 子区域选择编辑,复杂洞结构仍待增强。
|
||||
|
||||
## 阶段 2:打通标注保存(已完成基础闭环)
|
||||
|
||||
@@ -34,16 +34,22 @@
|
||||
剩余建议:
|
||||
|
||||
1. 加入保存冲突处理和批量保存错误提示。
|
||||
2. 增加逐点几何编辑器,让已保存 mask 的 polygon 本身可以被修改后 PATCH。
|
||||
2. 逐点几何编辑器已支持拖动/删除顶点、边中点插入新点和多 polygon 子区域编辑;后续增强为复杂洞结构编辑。
|
||||
3. 区域合并/去除已支持基础 union/difference;后续增强为更明确的多选列表、操作预览和冲突确认。
|
||||
|
||||
## 阶段 3:接入导出按钮(已完成 COCO JSON)
|
||||
## 阶段 3:接入导出按钮(已完成 COCO JSON 和 PNG Mask ZIP)
|
||||
|
||||
当前工作区“导出 JSON 标注集”会先保存未归档 mask,再调用 COCO 导出接口。
|
||||
当前工作区“导出 JSON 标注集”和“导出 PNG Mask ZIP”都会先保存未归档 mask,再调用后端导出接口。
|
||||
|
||||
建议:
|
||||
已完成:
|
||||
|
||||
1. 增加“导出 PNG Mask ZIP”按钮,调用 `/api/export/{projectId}/masks`。
|
||||
2. 无标注时给出更明确的空导出提示。
|
||||
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
|
||||
|
||||
@@ -52,13 +58,18 @@
|
||||
已完成:
|
||||
|
||||
- 聚合项目、帧、标注、模板数量和主机 load average。
|
||||
- 按 `processing_tasks` queued/running 任务生成解析队列。
|
||||
- 按 `processing_tasks` queued/running/failed/cancelled 任务生成解析队列。
|
||||
- 按最近任务、项目、标注、模板记录生成活动流。
|
||||
|
||||
已完成补充:
|
||||
|
||||
1. Dashboard 对 queued/running 任务提供取消按钮。
|
||||
2. Dashboard 对 failed/cancelled 任务提供重试按钮。
|
||||
3. Dashboard 详情弹窗展示任务 error、payload、result、Celery ID 和时间。
|
||||
|
||||
剩余建议:
|
||||
|
||||
1. 为任务增加取消、重试和失败详情 UI。
|
||||
2. 为 Dashboard 增加任务历史筛选和失败详情入口。
|
||||
1. 为 Dashboard 增加任务历史筛选。
|
||||
|
||||
## 阶段 5:异步拆帧和进度
|
||||
|
||||
@@ -72,44 +83,55 @@ Word 方案中提到 Celery + Redis。当前已经有 Celery app、worker task
|
||||
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 中断粒度。
|
||||
|
||||
## 阶段 6:GT 导入与点区域(已完成基础增强版)
|
||||
|
||||
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. 前端 Dashboard 保留轮询兜底,并补充失败详情 UI。
|
||||
1. 增加骨架提取和聚类增强。
|
||||
2. 为多类别像素值提供模板分类自动映射规则。
|
||||
|
||||
Dashboard 的解析队列现在已经从“项目状态派生”升级为任务表驱动,实时推送也已通过 Redis/WebSocket 打通;剩余重点是任务控制。
|
||||
## 阶段 7:模板优先级融合(已完成导出侧裁决)
|
||||
|
||||
## 阶段 6:GT 导入与点区域
|
||||
当前导出 PNG Mask ZIP 时已经按 class/template z-index 做重叠裁决,从低到高覆盖,生成每帧 `semantic_frame_*.png`。
|
||||
|
||||
这是 Word 方案中最复杂的部分,当前完全未实现。
|
||||
|
||||
建议拆成小步:
|
||||
|
||||
1. 先支持上传二值/多类别 mask。
|
||||
2. 后端按类别提取 connected components。
|
||||
3. 用 OpenCV distance transform 找正向点。
|
||||
4. 暂时不做骨架/HDBSCAN,先生成最小可用点集。
|
||||
5. 前端以可拖拽点显示并保存。
|
||||
6. 后续再做骨架和聚类增强。
|
||||
|
||||
## 阶段 7:模板优先级融合
|
||||
|
||||
当前模板有 z-index,但没有真正用于语义冲突裁决。
|
||||
|
||||
建议:
|
||||
已完成:
|
||||
|
||||
1. 标注保存时记录 template class id / name / zIndex。
|
||||
2. 导出 mask 时按 zIndex 从低到高覆盖。
|
||||
3. 同类 mask 做 union。
|
||||
3. 同类语义值在融合图中共享同一个 class value。
|
||||
4. 跨类重叠由高 zIndex 覆盖低 zIndex。
|
||||
|
||||
这一步完成后,系统才真正符合“语义分割一个像素一个类别”的目标。
|
||||
剩余建议:
|
||||
|
||||
1. 在前端预览重叠裁决结果。
|
||||
2. 对多帧多类导出增加颜色 palette PNG 或可视化 legend。
|
||||
|
||||
## 阶段 8:清理 UI 文案与 Mock
|
||||
|
||||
建议统一这些文案和真实能力:
|
||||
|
||||
- SAM/GPU 状态已改为 `GET /api/ai/models/status` 驱动。
|
||||
- 撤销/重做按钮接历史栈,否则隐藏。
|
||||
- 撤销/重做按钮已接全局 mask 历史栈。
|
||||
- “重新提取内侧中轴树骨架”接真实接口,否则标为未实现。
|
||||
- AI 独立页不要固定 Unsplash 图,应从当前项目帧或上传文件进入。
|
||||
|
||||
Reference in New Issue
Block a user