Files
Pre_Seg_Server/doc/05-implementation-plan.md
admin afcddfaeb9 feat: 完善分割工作区导入导出与管理流程
- 新增基于 JWT 当前用户的登录恢复、角色权限、用户管理、审计日志和演示出厂重置后台接口与前端管理页。

- 重串 GT_label 导出和 GT Mask 导入逻辑:导出保留类别真实 maskid,导入仅接受灰度或 RGB 等通道 maskid 图,支持未知 maskid 策略、尺寸最近邻拉伸和导入预览。

- 统一分割结果导出体验:默认当前帧,按项目抽帧顺序和 XhXXmXXsXXXms 时间戳命名 ZIP 与图片,补齐 GT/Pro/Mix/分开 Mask 输出和映射 JSON。

- 调整工作区左侧工具栏:移除创建点/线段入口,新增画笔、橡皮擦及尺寸控制,并按绘制、布尔、导入/AI 工具分组分隔。

- 扩展 Canvas 编辑能力:画笔按语义分类绘制并可自动并入连通选中 mask,橡皮擦对选中区域扣除,优化布尔操作、选区、撤销重做和保存状态联动。

- 优化自动传播时间轴显示:同一蓝色系按传播新旧递进变暗,老传播记录达到阈值后统一旧记录色,并维护范围选择与清空后的历史显示。

- 将 AI 智能分割入口替换为更明确的 AI 元素图标,并同步侧栏、工作区和 AI 页面入口表现。

- 完善模板分类、maskid 工具函数、分类树联动、遮罩透明度、边缘平滑和传播链同步相关前端状态。

- 扩展后端项目、媒体、任务、Dashboard、模板和传播 runner 的用户隔离、任务控制、进度事件与兼容处理。

- 补充前后端测试,覆盖用户管理、GT_label 往返导入导出、GT Mask 校验和预览、画笔/橡皮擦、时间轴传播历史、导出范围、WebSocket 与 API 封装。

- 更新 AGENTS、README 和 doc 文档,记录当前接口契约、实现状态、测试计划、安装说明和 maskid/GT_label 规则。
2026-05-03 03:52:32 +08:00

8.4 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};按钮文案会按待保存数量显示“保存 X 个改动”或“已全部保存”。
  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接入导出按钮已完成统一分割结果导出

当前工作区“分割结果导出”会先保存未归档 mask再调用后端统一结果导出接口。旧 COCO JSON 和 PNG Mask ZIP 接口保留为兼容路径。

已完成:

  1. COCO JSON 调用 /api/export/{projectId}/coco
  2. PNG Mask ZIP 调用 /api/export/{projectId}/masks
  3. 兼容 PNG Mask ZIP 仍保留单标注二值 mask_*.png,同时输出 semantic_frame_*.pngsemantic_classes.json
  4. 统一导出调用 /api/export/{projectId}/results,支持整体视频、特定范围帧、当前图片三种范围,以及分开 mask、GT_label 黑白图、Pro_label 彩色图和 Mix_label 原图叠加图ZIP 固定包含 maskid/GT 像素值映射 JSON 和原始图片文件夹,各输出文件夹按客户指定的 视频名称_0h00m00s000ms_项目帧序号 规则命名GT_label 图背景为 0类别值优先使用模板中的真实 maskid缺失 maskid 的旧标注才补下一个可用正整数。

剩余建议:

  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 / maskid并保留内部覆盖优先级。
  2. 导出 mask 时按内部优先级从低到高覆盖。
  3. 同类语义值在融合图中共享同一个 class value。
  4. 跨类重叠由更高内部优先级覆盖更低内部优先级maskid 不作为排序规范。

剩余建议:

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

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

当前工作区传播功能会使用当前打开参考帧的全部 mask 作为 seed按用户设置的传播起始帧和传播结束帧向前、向后或双向传播并把结果写入后端标注表。前端只保留一个“自动传播”按钮减少传播对象选择带来的歧义。

已完成:

  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 演示图;没有当前项目帧时显示空状态。后续如果要支持独立图片分析,应接正式上传入口和项目/帧关联。