Files
Pre_Seg_Server/doc/05-implementation-plan.md
admin b6a276cb8d feat: 完善工作区交互提示与后端属性分析
功能新增:
- 新增 POST /api/ai/analyze-mask 后端接口,基于 mask polygon、bbox、points 和 score 返回置信度来源、面积、拓扑锚点和后端分析提示。
- 前端新增 analyzeMask API 封装,并在本体检查面板读取选中 mask 的后端几何属性和重新提取拓扑锚点结果。
- 右侧语义分类树点击分类时,会给当前选中 mask 换标签、更新 class 元数据,并将选中 mask 移到前端渲染最上层,方便继续编辑。
- 分割工作区画布新增上下文操作提示,覆盖多边形 Enter 完成、Esc 取消、首节点闭合、拖拽图形、点区域、SAM 点/框提示、区域合并/去除选择顺序和多边形编辑。
- AI 智能分割画布新增正向点、反向点、边界框选和视口控制的上下文提示。
- 自动传播交互收敛为参考帧加起止帧范围加单个“自动传播”按钮,默认使用当前参考帧全部 mask 作为 seed。
- 时间轴改为用浅蓝色进度条区段标记自动传播生成的帧,而不是已编辑帧竖线提示。

Bugfix:
- AI 分割页无当前帧时移除外部演示背景图,改为明确空状态提示,避免误以为外部图片可参与真实推理。
- 工具栏魔法棒文案改为“打开 AI 智能分割”,避免误导为直接触发 SAM 推理。
- Canvas 底部当前图层信息改为显示真实选中 mask 标签和 annotation id,不再使用固定占位文本。
- 已保存标注回显时保留 mask metadata 中的传播来源、score 等字段,供时间轴和属性面板识别。
- 清理 server.ts 中遗留的 /api/login、/api/projects、/api/templates 内存 mock API,避免和 FastAPI 真实后端混淆。

测试:
- 补充 analyze-mask 后端测试,覆盖后端几何属性和锚点返回。
- 补充 api.analyzeMask 前端契约测试,覆盖 normalized polygon、bbox、points 和 extract_skeleton payload。
- 补充本体面板测试,覆盖后端属性读取、自定义分类写回后端模板、选中 mask 换标签和置顶显示。
- 补充 Canvas 测试,覆盖上下文提示、多边形完成提示、布尔选择顺序提示、当前图层真实显示和编辑优先级。
- 补充 AI 分割测试,覆盖无帧空状态和提示工具上下文提示。
- 更新 Konva 测试 mock,支持拖动过程、stroke/dash/fillRule 等渲染断言。

文档:
- 更新 README 和 AGENTS,说明 server.ts 不再保留业务 mock API。
- 更新 doc/02、doc/03、doc/04、doc/05、doc/07、doc/08、doc/09,记录后端属性分析、分类置顶显示、上下文提示、自动传播按钮、传播帧标记、测试覆盖和当前剩余限制。
2026-05-02 02:10:37 +08:00

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