- 接入 SAM2 视频传播能力:新增 /api/ai/propagate,支持用当前帧 mask/polygon/bbox 作为 seed,通过 SAM2 video predictor 向前、向后或双向传播,并可保存为真实 annotation。 - 接入 SAM3 video tracker:通过独立 Python 3.12 external worker 调用 SAM3 video predictor/tracker,使用本地 checkpoint 与 bbox seed 执行视频级跟踪,并在模型状态中标记 video_track 能力。 - 完善 SAM 模型分发:sam_registry 按 model_id 明确区分 sam2 propagation 与 sam3 video_track,避免两个模型链路混用。 - 打通前端“传播片段”:VideoWorkspace 使用当前选中 mask 和当前 AI 模型调用后端传播接口,传播结果回写并刷新工作区已保存标注。 - 增强 SAM3 本地 checkpoint 配置:新增 sam3_checkpoint_path 配置和 .env.example 示例,状态检查改为基于本地 checkpoint/独立环境/模型包可用性。 - 完善视频拆帧参数:/api/media/parse 支持 parse_fps、max_frames、target_width,后端任务保存帧时间戳、源帧号和 frame_sequence 元数据。 - 增加运行时 schema 兼容处理:启动时为旧 frames 表补充 timestamp_ms 和 source_frame_number 列,避免旧库升级后缺字段。 - 强化 Canvas 标注编辑:补齐多边形闭合、点工具、顶点拖拽、边中点插入、Delete/Backspace 删除、区域合并和重叠去除等交互。 - 增强语义分类联动:选中 mask 后可通过右侧语义分类树更新标签、颜色和 class metadata,并同步到保存/导出链路。 - 增加关键帧时间轴体验:FrameTimeline 显示具体时间信息,并支持键盘左右方向键切换关键帧。 - 完善 AI 交互分割参数:前端保留正向点、反向点、框选和 interactive prompt 的调用状态,支持 SAM2 细化候选区域与 SAM3 bbox 入口。 - 扩展后端/前端 API 类型:新增 propagateMasks、传播请求/响应 schema,并补齐 annotation、导出、模型状态和任务接口的测试覆盖。 - 更新项目文档:同步 README、AGENTS、接口契约、需求冻结、设计冻结、前端元素审计、实施计划和测试计划,标明真实功能边界与剩余风险。 - 增加测试覆盖:补充 SAM2/SAM3 传播、SAM3 状态、媒体拆帧参数、Canvas 编辑、语义标签切换、时间轴、工作区传播和 API 合约测试。 - 加强仓库安全边界:将 sam3权重/ 加入 .gitignore,避免本地模型权重被误提交。 验证:npm run test:run;pytest backend/tests;npm run lint;npm run build;python -m py_compile;git diff --check。
7.3 KiB
后续实施建议
目标是把当前“能看、能上传、能拆帧”的系统推进到“能真实完成标注闭环”的系统。
阶段 1:先修接口契约(已完成基础对齐)
优先级最高。AI 点/框推理和 COCO 导出的基础契约已经按当前代码完成对齐。
已完成:
src/lib/api.ts的updateProject()已改为PATCH。exportCoco()路径已改为/api/export/{projectId}/coco。- Canvas 调 AI 时已使用当前帧真实
frame.id作为image_id。 - Canvas 点/框坐标已转成后端需要的归一化坐标。
- 后端
polygons已转成前端可渲染的 Konva path。
剩余边界:
- SAM 3 已完成独立 Python 3.12 环境安装脚本、外部 worker 桥接、本地
sam3权重/sam3.ptcheckpoint 状态检查、本地 checkpoint 加载参数接入、单帧文本/框提示和 video tracker API 入口;下一步需要基于真实业务帧验证语义召回质量和视频 tracker 稳定性。 - 标注删除/更新接口已打通基础能力;逐点几何编辑器已支持顶点拖动/删除、边中点插入和多 polygon 子区域选择编辑,复杂洞结构仍待增强。
阶段 2:打通标注保存(已完成基础闭环)
当前工作区可将未保存 mask 写入后端标注表,并在加载项目帧后回显。
已完成:
- 前端根据
Mask.segmentation构造后端需要的 normalizedmask_data.polygons。 - 用户点击“结构化归档保存”后,未保存 mask 调用
POST /api/ai/annotate,dirty mask 调用PATCH /api/ai/annotations/{annotation_id}。 - 后端保存或更新
project_id、frame_id、template_id、mask_data、bbox;具体分类写入mask_data.class。 - 工作区加载帧后调用
GET /api/ai/annotations回显已保存标注。 - 工作区“清空遮罩”调用
DELETE /api/ai/annotations/{annotation_id}删除当前帧已保存标注。
剩余建议:
- 加入保存冲突处理和批量保存错误提示。
- 逐点几何编辑器已支持拖动/删除顶点、边中点插入新点和多 polygon 子区域编辑;后续增强为复杂洞结构编辑。
- 区域合并/去除已支持基础 union/difference;后续增强为更明确的多选列表、操作预览和冲突确认。
阶段 3:接入导出按钮(已完成 COCO JSON 和 PNG Mask ZIP)
当前工作区“导出 JSON 标注集”和“导出 PNG Mask ZIP”都会先保存未归档 mask,再调用后端导出接口。
已完成:
- COCO JSON 调用
/api/export/{projectId}/coco。 - PNG Mask ZIP 调用
/api/export/{projectId}/masks。 - ZIP 内保留单标注二值
mask_*.png,同时输出semantic_frame_*.png和semantic_classes.json。
剩余建议:
- 无标注时给出更明确的空导出提示。
阶段 4:替换 Dashboard mock
当前 Dashboard 已通过 GET /api/dashboard/overview 读取后端聚合快照,不再使用硬编码初始统计、队列或活动日志。
已完成:
- 聚合项目、帧、标注、模板数量和主机 load average。
- 按
processing_tasksqueued/running/failed/cancelled 任务生成解析队列。 - 按最近任务、项目、标注、模板记录生成活动流。
已完成补充:
- Dashboard 对 queued/running 任务提供取消按钮。
- Dashboard 对 failed/cancelled 任务提供重试按钮。
- Dashboard 详情弹窗展示任务 error、payload、result、Celery ID 和时间。
剩余建议:
- 为 Dashboard 增加任务历史筛选。
阶段 5:异步拆帧和进度
Word 方案中提到 Celery + Redis。当前已经有 Celery app、worker task 和 processing_tasks 表。
已完成:
- 新建 Celery app。
POST /api/media/parse只创建任务并立即返回 task id。- worker 执行 FFmpeg/OpenCV/pydicom。
- worker 写 PostgreSQL 任务进度。
- worker 发布 Redis
seg:progress,FastAPI 广播到/ws/progress。
已完成补充:
POST /api/tasks/{task_id}/cancel取消 queued/running 任务,并尝试 revoke Celery。POST /api/tasks/{task_id}/retry为 failed/cancelled 任务创建新的 queued 任务。- worker 在关键阶段检查 cancelled 状态,避免取消后继续写帧。
- Redis/WebSocket 进度事件增加
cancelled类型。
Dashboard 的解析队列现在已经从“项目状态派生”升级为任务表驱动,实时推送也已通过 Redis/WebSocket 打通;剩余重点是任务历史筛选和更细的 worker 中断粒度。
阶段 6:GT 导入与点区域(已完成基础增强版)
Word 方案中的完整版本包含距离变换、骨架提取和聚类。当前已经完成基础增强版:导入二值/标签 mask 图片后,后端按非零像素值拆分类别,再按连通域生成 polygon 标注,并用距离变换提取一个正向 seed point。
已完成:
- 工作区提供“导入 GT Mask”入口。
- 前端调用
POST /api/ai/import-gt-maskmultipart 接口。 - 后端按非零像素值拆分多类别 mask。
- 后端使用 OpenCV contour 提取每个类别下的连通域。
- 后端使用 distance transform 生成
pointsseed。 - 导入结果写入
annotations表并回显为工作区 mask。 - 前端把 seed point 转为像素坐标显示在 Canvas 上,拖动后会标记标注为 dirty 并可归档保存。
剩余建议:
- 增加骨架提取和聚类增强。
- 为多类别像素值提供模板分类自动映射规则。
阶段 7:模板优先级融合(已完成导出侧裁决)
当前导出 PNG Mask ZIP 时已经按 class/template z-index 做重叠裁决,从低到高覆盖,生成每帧 semantic_frame_*.png。
已完成:
- 标注保存时记录 template class id / name / zIndex。
- 导出 mask 时按 zIndex 从低到高覆盖。
- 同类语义值在融合图中共享同一个 class value。
- 跨类重叠由高 zIndex 覆盖低 zIndex。
剩余建议:
- 在前端预览重叠裁决结果。
- 对多帧多类导出增加颜色 palette PNG 或可视化 legend。
阶段 7.5:视频片段传播(已完成基础闭环)
当前工作区“传播片段”会使用当前选中 mask 或当前帧第一个 mask 作为 seed,默认向后传播 30 帧并把结果写入后端标注表。
已完成:
- 前端
propagateMasks()已接入POST /api/ai/propagate。 - 工作区按钮会把 seed mask 的 normalized polygon、bbox、label、color 和 class 元数据传给后端。
- SAM 2 路径使用官方
SAM2VideoPredictor.add_new_mask()和propagate_in_video()。 - SAM 3 路径通过
sam3_external_worker.py调用独立 Python 3.12 环境中的官方build_sam3_video_predictor()。 - 后端会跳过源帧,把传播结果保存到后续帧
annotations,并在完成后由前端刷新回显。
剩余建议:
- 把传播任务改为异步任务,接入 Dashboard 和 WebSocket 进度。
- 前端增加传播方向、帧数和覆盖已有标注策略设置。
- 用真实长视频分别做 SAM 2 / SAM 3 tracker smoke test 和质量评估。
阶段 8:清理 UI 文案与 Mock
建议统一这些文案和真实能力:
- SAM/GPU 状态已改为
GET /api/ai/models/status驱动。 - 撤销/重做按钮已接全局 mask 历史栈。
- “重新提取内侧中轴树骨架”接真实接口,否则标为未实现。
- AI 独立页不要固定 Unsplash 图,应从当前项目帧或上传文件进入。