- 打通工作区真实标注闭环:支持手工多边形、矩形、圆形、点区域和线段生成 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 授权边界和后续实施顺序。
8.7 KiB
8.7 KiB
当前需求冻结文档
冻结日期:2026-05-01
本文档描述当前仓库已经实现或明确保留为占位的需求。测试用例以本文档为准,不把早期设想或 Word 文档中的远期能力当作当前版本必须实现的功能。
R1 登录与会话
- 系统提供登录页。
- 默认开发凭证为
admin / 123456。 - 登录成功后前端保存 token,并进入主应用。
- 登录失败时显示错误信息。
- 当前 token 是开发用固定 token,不做真实 JWT 校验。
R2 项目管理
- 前端展示项目库,并从
GET /api/projects获取项目列表。 - 用户可以新建项目,前端调用
POST /api/projects。 - 用户可以选择项目,进入工作区。
- 用户可以导入视频文件,前端创建项目、上传文件、触发拆帧、刷新项目列表。
- 用户可以导入 DICOM 序列,前端上传 DICOM、触发拆帧、刷新项目列表。
- 后端支持项目创建、列表、详情、局部更新和删除。
- 后端支持项目帧创建、列表和单帧查询。
R3 媒体上传与拆帧
- 后端允许上传视频、图片、DICOM 文件,其他扩展名返回 400。
- 未提供项目 ID 上传时,后端自动创建项目。
- 提供项目 ID 上传时,后端把上传对象关联到该项目。
- 拆帧接口根据项目
source_type处理视频或 DICOM。 - 拆帧完成后写入
frames记录,并把项目状态设为ready。 - 拆帧接口会创建
processing_tasks记录并投递 Celery worker。 - 前端可通过
GET /api/tasks/{task_id}查询任务状态。 - 后端支持
POST /api/tasks/{task_id}/cancel取消 queued/running 任务,写入cancelled状态并尝试 revoke Celery。 - 后端支持
POST /api/tasks/{task_id}/retry对 failed/cancelled 任务创建新的 queued 任务。 - worker 会在关键阶段检查任务是否已取消,取消后停止继续写帧。
R4 工作区与帧浏览
- 工作区根据当前项目加载帧列表。
- 若项目有媒体但无帧,工作区会尝试触发拆帧后重新加载。
- Canvas 显示当前帧图片。
- Canvas 支持滚轮缩放、移动工具拖拽、鼠标坐标显示。
- 时间轴支持缩略图点击切帧、range 拖动切帧、播放/暂停顺序推进帧。
- 播放帧率使用项目
parse_fps或original_fps,限制在 1 到 30 FPS。
R5 工具栏
- 工具栏可以切换当前 active tool。
- 正向点、反向点、框选工具会影响 Canvas 交互。
- 魔法棒按钮切换到 AI 页面。
- 多边形、矩形、圆、点、线工具会在 Canvas 上生成可保存的 polygon mask。
- 多边形通过点击取点并按 Enter 完成;矩形、圆、线通过拖拽生成;点工具生成小点区域。
- Canvas 支持点击 mask 进入 polygon 顶点编辑态;拖动顶点会更新 mask 几何并把已保存 mask 标记为 dirty。
- 顶点编辑态下选中顶点后可用 Delete/Backspace 删除顶点,但不会让 polygon 少于三点。
- 撤销、重做绑定全局
maskHistory/maskFuture,支持工具栏按钮、AI 页按钮和 Canvas 快捷键。 - 区域合并工具支持多选当前帧 mask,并使用 polygon union 生成合并后的主 mask。
- 区域去除工具支持多选当前帧 mask,并从第一个选中的主 mask 中扣除后续选中 mask。
R6 AI 推理
- 前端可以在 AI 页面选择
sam2或sam3,选择结果存放在全局 store。 - 前端和工作区通过
GET /api/ai/models/status展示 GPU、SAM 2 和 SAM 3 的真实运行状态。 - 前端
predictMask()调用POST /api/ai/predict。 - 前端发送后端契约:
image_id、prompt_type、prompt_data、model。 - 点提示传
{ points, labels },正向点 label 为 1,反向点 label 为 0。 - 框选提示传归一化
[x1, y1, x2, y2]。 - 语义文本提示传
semantic;选择sam3且独立 Python 3.12 环境、CUDA、官方包和 Hugging Face gated 权重访问均满足时走 SAM 3 文本语义推理,选择sam2时回退到自动分割。 - AI 参数支持
crop_to_prompt、auto_filter_background和min_score;点/框 prompt 可以裁剪局部区域推理并回映射结果,背景过滤会移除低分结果和包含负向点的 polygon。 - 后端返回
polygons和scores。 - 前端把后端
polygons转成 KonvapathData、segmentation、bbox、area。 - AI 推理结果先存放在前端 store 的
masks中,点击“结构化归档保存”后持久化到后端标注表。
R7 标注保存
- 后端提供
POST /api/ai/annotate保存标注。 - 保存时必须存在项目;如果传入
frame_id,帧也必须存在。 - 后端提供
GET /api/ai/annotations查询项目标注,可选按frame_id过滤。 - 后端提供
PATCH /api/ai/annotations/{annotation_id}更新已保存标注的mask_data、points、bbox和template_id。 - 后端提供
DELETE /api/ai/annotations/{annotation_id}删除已保存标注。 - 当前前端“结构化归档保存”会保存当前项目未保存 mask,并会更新已标记为 dirty 的已保存 mask。
- 工作区“清空遮罩”会删除当前帧已保存标注,并清空当前帧未保存 mask。
- 工作区加载项目帧后会查询已保存标注并回显。
- 工作区支持导入 GT mask 图片,前端调用
POST /api/ai/import-gt-mask。 - 后端导入 GT mask 时按非零像素值拆分多类别区域,再按连通域生成 polygon 标注,并通过距离变换写入 seed point。
- 前端会回显导入标注的 seed point;拖动 seed point 后,已保存标注会变为 dirty,归档保存时会更新后端
points。
R8 模板库
- 前端展示模板列表,调用
GET /api/templates。 - 用户可以新建、编辑、删除模板。
- 模板分类存放在
mapping_rules.classes,规则存放在mapping_rules.rules。 - 前端支持添加/删除分类、拖拽排序后重算
zIndex、JSON 批量导入、加载腹腔镜默认分类。 - 后端支持模板创建、列表、详情、局部更新和删除。
R9 本体检查面板
- 工作区右侧可以选择模板。
- 面板显示模板分类和组件本地自定义分类。
- 用户可以选择具体分类;新 AI mask 会记录
classId、className、classZIndex,并在保存时写入mask_data.class。 - 添加自定义分类只存在组件本地状态,不保存到后端。
- 置信度、拓扑锚点和重新提取骨架按钮当前为展示/占位。
R10 Dashboard 与 WebSocket
- Dashboard 显示基础统计、解析队列和活动日志。
- Dashboard 初始数据来自
GET /api/dashboard/overview。 - 后端聚合项目数、处理中任务数、标注数、帧数、模板数和主机 load average。
- 解析队列由
processing_tasks中的 queued/running/failed/cancelled 任务生成;活动日志由最近任务、项目、标注和模板记录生成。 - Dashboard 对 queued/running 任务提供取消按钮,对 failed/cancelled 任务提供重试按钮。
- Dashboard 任务详情会读取
GET /api/tasks/{task_id}并展示失败 error、payload、result、Celery ID 和时间信息。 - Dashboard 会连接
/ws/progress。 - 收到 progress、complete、error、status 消息时,前端会更新队列或日志。
- 收到 cancelled 消息时,前端会把对应任务标记为已取消。
- Celery worker 每次更新
processing_tasks后会发布 Redisseg:progress事件,FastAPI 订阅并广播给/ws/progress客户端。 - 后端 WebSocket 接收到客户端消息后返回 status heartbeat。
R11 导出
- 后端支持
GET /api/export/{project_id}/coco导出 COCO JSON。 - 后端支持
GET /api/export/{project_id}/masks导出 PNG mask ZIP。 - 当前前端
exportCoco()API 封装已对齐后端路径。 - 当前前端
exportMasks()API 封装已对齐后端路径。 - 工作区“导出 JSON 标注集”按钮已绑定下载事件;导出前会先保存当前未归档 mask。
- 工作区“导出 PNG Mask ZIP”按钮已绑定下载事件;导出前会先保存当前未归档 mask。
- PNG mask ZIP 包含单标注二值 mask、按 zIndex 融合后的每帧语义 mask 和
semantic_classes.json。
R12 配置
- 前端 API 地址由
src/lib/config.ts统一推导。 VITE_API_BASE_URL优先级高于自动推导。VITE_WS_PROGRESS_URL优先级高于从 API 地址推导 WebSocket 地址。- 未设置环境变量时,前端按当前浏览器 hostname 推导
http://<host>:8000。
R13 文档与测试
doc/目录保存当前实现审计、接口契约、需求冻结、设计冻结和测试计划。- 测试应覆盖当前冻结需求中的真实功能、半可用行为和明确占位行为。
- 对外部服务依赖 PostgreSQL、MinIO、Redis、SAM 模型的测试应使用 mock 或测试替身,不依赖真实服务可用性。