- 增强 DICOM/视频项目导入与演示数据:DICOM 按文件名自然顺序处理,导入后展示上传与解析任务进度,恢复演示出厂设置保留演示视频和演示 DICOM 项目,并补充 demo media seed 逻辑。 - 完善项目管理:项目支持重命名、删除、复制,删除使用站内确认弹窗,复制支持新项目重置和全内容复制,DICOM 项目不显示生成帧入口。 - 完善 GT Mask 与导出链路:只支持 8-bit maskid 图导入,非法/全背景图明确拒绝,尺寸自动适配,高精度 polygon 回显;统一导出默认当前帧,GT_label 使用 uint8 和真实 maskid,待分类 maskid 0 与背景一致。 - 完善分割工作区交互:新增画笔和橡皮擦并支持尺寸控制,移除创建点/线段入口,工具栏按类别分隔,AI 智能分割使用明确 AI 图标,取消黄色 seed point,清空/删除传播 mask 后同步清理空帧时间轴状态。 - 完善传播与时间轴:自动传播使用 SAM 2.1 权重任务,参考帧无遮罩时提示,传播历史按同一蓝色系递进变暗,删除/清空传播链时保留人工或独立 AI 标注来源。 - 完善模板库:新增头颈部 CT 分割默认模板,所有模板保留 maskid 0 待分类,支持鼠标复制模板、拖拽层级、JSON 批量导入预览、删除 label 和站内删除确认。 - 完善用户与高风险确认:用户改密码、删除用户、恢复演示出厂设置和清空人工/AI 标注帧均改为站内确认交互,避免浏览器原生 prompt/confirm。 - 补充前后端测试与文档:更新项目、模板、GT 导入、导出、传播、DICOM、用户管理等测试,并同步 README、AGENTS 和 doc 下实现/契约/测试计划文档。
6.1 KiB
6.1 KiB
目的与 Word 方案摘要
为什么要做这个系统
Word 文档《语义分割系统构建方案.docx》的核心目标是建设一个面向视频和连续帧的智能语义分割标注系统,解决传统标注工具在以下场景中的痛点:
- 视频或连续帧数量大,逐帧人工画 mask 成本高。
- 高分辨率图像上同时存在底图、点、框、多边形和遮罩,DOM 渲染难以支撑重交互。
- AI 分割需要低延迟点选/框选反馈,普通 REST 往返在密集交互场景下体验较差。
- 语义分割要求一个像素只能归属一个类别,因此需要模板、颜色、z-index 和类别优先级来解决遮罩重叠。
- 历史 GT mask 如果只是作为静态像素图层叠加,后续修改不灵活;Word 方案希望把 mask 降维成可编辑的点区域。
所以这个系统的业务目的不是单纯播放视频,而是把“视频/DICOM 数据接入、拆帧、AI 辅助分割、语义分类、标注导出”串成一个工作台。
Word 中的目标架构
Word 方案描述的理想系统包含:
- React/Vue + Konva 的高性能 Canvas 工作台。
- FastAPI 后端,使用 WebSocket 处理实时交互与任务进度。
- Celery + Redis 处理视频拆帧等长任务。
- FFmpeg/OpenCV 解析视频,pydicom 解析医学影像。
- 本地 CUDA 上的 SAM 推理;当前产品实现启用可选 SAM 2.1 tiny/small/base+/large,SAM 3 因没有文本提示入口而暂时禁用。
- GT mask 导入后通过距离变换、骨架提取、聚类等算法降维为点区域。
- 模板库管理分类、颜色和 z-index,用于语义分割遮罩重叠裁决。
- PostgreSQL 存储项目、帧、模板和点区域数据。
当前代码已落地的部分
| 目标 | 当前代码状态 | 依据 |
|---|---|---|
| React 前端工作台 | 已落地 | src/App.tsx、src/components/*.tsx |
| Konva Canvas | 已落地 | CanvasArea.tsx、AISegmentation.tsx 使用 react-konva |
| FastAPI 后端 | 已落地 | backend/main.py |
| PostgreSQL ORM | 已落地 | backend/database.py、backend/models.py |
| MinIO 对象存储 | 已落地 | backend/minio_client.py |
| Redis 连接 | 已落地 | 用于 Celery broker/result backend,并通过 seg:progress pub/sub 转发任务进度 |
| 视频拆帧 | 已落地 | backend/services/frame_parser.py、backend/routers/media.py |
| DICOM 批量导入 | 已落地 | 上传、文件名自然排序、解析任务创建和项目库解析进度回显均已接入 |
| WebSocket 进度 | 已落地 | 拆帧进度写入任务表后发布到 Redis seg:progress,FastAPI 广播到 /ws/progress |
| SAM 推理 | 部分落地 | 当前产品入口启用 SAM 2.1 tiny/small/base+/large 和真实 GPU/SAM2.1 状态接口;SAM 2.1 已接 point/box/interactive 和 video predictor 片段传播。SAM 3 桥接源码保留,但前端入口和后端 registry 已禁用 |
| 模板库 | 部分落地 | 分类、颜色、maskid、JSON 批量导入预览和拖拽排序能存储和编辑;右侧语义分类树也可拖拽调整内部覆盖顺序;PNG mask 导出时会按内部优先级做语义融合裁决,前端预览裁决尚未落地 |
| 标注持久化 | 部分落地 | 后端有 Annotation 表,前端已接入新增、回显、分类更新、传播链前后帧同目标同步换类、当前帧删除、手工绘制、GT mask 导入、polygon 顶点拖动/删除、边中点插点和多 polygon 子区域编辑;复杂洞结构编辑未落地 |
| COCO / Mask 导出 | 已落地基础能力 | backend/routers/export.py;COCO JSON、兼容 PNG mask ZIP 和统一分割结果 ZIP 均已接入;统一 ZIP 包含 maskid/GT 像素值映射、原始图片、按帧/类别合并的分开 mask、GT_label 黑白图、Pro_label 彩色图和 Mix_label 原图叠加图;GT_label 固定为 8-bit uint8 PNG,像素值使用类别真实 maskid,其中 maskid:0 的“待分类”和背景同为 0,缺失 maskid 的旧标注才补下一个可用正整数,正整数 maskid 超出 1-255 会拒绝导出 |
当前代码尚未落地的目标
- SAM 3:
sam3_engine.py、sam3_external_worker.py和setup_sam3_env.sh作为历史实现保留;由于当前系统不给文本提示,前端不再展示 SAM 3,后端 registry 也不暴露sam3。官方没有 SAM 3 tiny/small 权重,当前可选最小真实 SAM 权重仍是 SAM 2.1 tiny。 - GT mask 导入:当前仅支持 8-bit 二值/灰度 maskid 图和 8-bit RGB 三通道完全相同的
[X,X,X]maskid 图导入,后端会按 maskid 拆分区域,生成高精度 polygon 标注;超出现有类别的 maskid 可舍弃或导入为未定义类别;16-bit/uint16 GT_label 和普通彩色类别图会被拒绝,尺寸不一致会自动最近邻拉伸到当前帧;骨架提取、HDBSCAN 和更复杂的模板自动映射尚未实现。 - Mask 到点区域的拓扑降维:后端保留 distance transform seed point 数据兼容;前端不再显示黄色 seed point,也不提供 seed point 拖拽编辑;骨架提取、HDBSCAN 等增强尚未实现。
- 类别优先级融合:PNG mask 导出时已按内部优先级生成语义融合 mask;前端裁决预览尚未实现。
- 撤销/重做:当前已有全局 mask 历史栈。
- 保存状态按钮:工作区按钮按待保存数量显示“保存 X 个改动”或“已全部保存”,并调用
POST /api/ai/annotate保存当前未归档 mask,通过PATCH /api/ai/annotations/{id}更新 dirty mask。
结论
当前项目已经从 UI 原型推进到“可上传、可异步拆帧、可取消/重试任务、可查看失败详情、可实时查看任务进度、可浏览项目帧、可维护模板、可手工绘制、可逐点编辑 polygon、可边中点插点、可多 polygon 子区域编辑、可区域合并/去除、可用可选 SAM 2.1 做点/框 AI 推理、可对点/框 prompt 做裁剪推理和背景过滤、可用 SAM 2.1 后台任务进行视频片段传播、可导入多类别 GT mask、可保存标注、可导出 COCO/语义 mask ZIP、可查看 Dashboard 后端概览”的全栈雏形。下一阶段最重要的是继续补齐复杂洞结构编辑、GT mask 骨架/聚类增强和前端语义融合预览。