feat: 建立 SAM2 标注闭环基线
- 打通工作区真实标注闭环:支持手工多边形、矩形、圆形、点区域和线段生成 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 授权边界和后续实施顺序。
This commit is contained in:
53
README.md
53
README.md
@@ -6,7 +6,7 @@
|
||||
|
||||
> 基于 React + FastAPI + 可选 SAM 2 / SAM 3 的全栈交互式图像/视频语义分割与标注平台。
|
||||
>
|
||||
> 支持本地多媒体资产上传、服务器端按帧解析、交互式 Canvas 标注、模板分类管理和标注数据结构化导出;工作区点/框 AI 推理默认走 SAM 2,语义文本可选择 SAM 3,前端会显示真实 GPU/模型状态。
|
||||
> 支持本地多媒体资产上传、服务器端按帧解析、交互式 Canvas 标注、GT mask 导入、模板分类管理和标注数据结构化导出;工作区点/框 AI 推理默认走 SAM 2,语义文本可选择 SAM 3,前端会显示真实 GPU/模型状态。
|
||||
|
||||
---
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
|
||||
- **多媒体资产管理** — 支持视频(MP4/AVI/MOV)和 DICOM 医学影像的上传、存储与解析
|
||||
- **AI 智能分割引擎** — 后端提供 SAM 2 / SAM 3 模型选择;SAM 2 支持点分割(point)、框分割(box)和自动分割(auto),SAM 3 入口支持文本语义提示并按真实运行环境显示可用性
|
||||
- **交互式画布标注** — 基于 Konva 的高性能 Canvas,支持缩放/平移/选点/框选,实时渲染 Mask 遮罩
|
||||
- **交互式画布标注** — 基于 Konva 的高性能 Canvas,支持缩放/平移/手工多边形/矩形/圆/点/线、polygon 顶点拖动/删除、区域合并/去除、选点/框选、撤销/重做,实时渲染 Mask 遮罩
|
||||
- **GT Mask 导入** — 工作区可导入 GT mask 图片,后端按非零像素值和连通域生成 polygon 标注并用 distance transform 写入 seed point;前端可回显和拖动 seed point
|
||||
- **本体字典管理** — 可配置的分类体系、颜色映射、图层优先级(z-index)
|
||||
- **项目工作区** — 项目创建、帧浏览、多图层标注、进度追踪
|
||||
- **数据导出** — 支持 COCO JSON 格式和 PNG Mask 批量导出
|
||||
- **数据导出** — 支持 COCO JSON 格式和 PNG Mask 批量导出;PNG ZIP 包含单标注 mask、按 z-index 融合的语义 mask 和类别映射
|
||||
|
||||
---
|
||||
|
||||
@@ -38,7 +39,7 @@
|
||||
│ ├── /api/projects 项目 & 视频帧 CRUD │
|
||||
│ ├── /api/templates 本体字典(分类/颜色/z-index) │
|
||||
│ ├── /api/media 文件上传 & 异步拆帧任务创建 │
|
||||
│ ├── /api/tasks Celery 后台任务状态 │
|
||||
│ ├── /api/tasks Celery 后台任务状态/取消/重试/详情 │
|
||||
│ ├── /api/ai SAM 2 / SAM 3 推理与模型状态 │
|
||||
│ └── /api/export COCO JSON / PNG Masks 导出 │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
@@ -62,6 +63,7 @@
|
||||
| 样式方案 | TailwindCSS + 自定义深色主题 | v4 |
|
||||
| 状态管理 | Zustand | - |
|
||||
| Canvas 渲染 | Konva + react-konva | - |
|
||||
| 几何布尔运算 | polygon-clipping | 0.15+ |
|
||||
| HTTP 客户端 | Axios | - |
|
||||
| 后端框架 | FastAPI | v0.136+ |
|
||||
| 数据库 ORM | SQLAlchemy(依赖中包含 Alembic) | 2.0+ |
|
||||
@@ -92,6 +94,7 @@ Seg_Server/
|
||||
│ ├── celery_app.py # Celery app 配置
|
||||
│ ├── worker_tasks.py # Celery 任务入口
|
||||
│ ├── download_sam2.py # SAM 2 模型权重自动下载脚本
|
||||
│ ├── setup_sam3_env.sh # SAM 3 独立 Python 3.12 环境安装脚本
|
||||
│ ├── requirements.txt # Python 依赖
|
||||
│ ├── routers/ # API 路由
|
||||
│ │ ├── auth.py # 登录认证
|
||||
@@ -102,7 +105,8 @@ Seg_Server/
|
||||
│ │ └── export.py # 数据导出
|
||||
│ └── services/ # 业务服务
|
||||
│ ├── sam2_engine.py # SAM 2 推理引擎(懒加载 + stub降级)
|
||||
│ ├── sam3_engine.py # SAM 3 状态检测与文本语义推理适配器
|
||||
│ ├── sam3_engine.py # SAM 3 状态检测、外部环境桥接与文本语义推理适配器
|
||||
│ ├── sam3_external_worker.py # 独立 sam3 conda 环境中执行的状态/推理 helper
|
||||
│ ├── sam_registry.py # SAM 模型选择、GPU 状态与推理分发
|
||||
│ └── frame_parser.py # FFmpeg 拆帧 / pydicom 读片
|
||||
├── src/ # React 前端
|
||||
@@ -117,10 +121,10 @@ Seg_Server/
|
||||
│ └── components/ # 组件(扁平化目录)
|
||||
│ ├── Login.tsx # 登录页
|
||||
│ ├── Sidebar.tsx # 左侧导航栏
|
||||
│ ├── Dashboard.tsx # 总体概况仪表盘(解析队列)
|
||||
│ ├── Dashboard.tsx # 总体概况仪表盘(解析队列/任务控制)
|
||||
│ ├── ProjectLibrary.tsx # 项目库列表
|
||||
│ ├── VideoWorkspace.tsx # 核心分割工作区布局
|
||||
│ ├── CanvasArea.tsx # Konva 画布(缩放/平移/选点/Mask渲染)
|
||||
│ ├── CanvasArea.tsx # Konva 画布(缩放/平移/手工绘制/选点/Mask渲染)
|
||||
│ ├── ToolsPalette.tsx # 左侧工具栏
|
||||
│ ├── OntologyInspector.tsx # 右侧本体/属性检查面板
|
||||
│ ├── FrameTimeline.tsx # 底部时间轴
|
||||
@@ -161,7 +165,7 @@ Seg_Server/
|
||||
- **GPU**: NVIDIA GPU(推荐 RTX 4090 或同等算力),用于 SAM 推理;SAM 3 官方要求 Python 3.12+、PyTorch 2.7+ 和 CUDA 12.6+ 环境
|
||||
- **CUDA**: 12.x / 13.x
|
||||
- **Node.js**: 22.x+
|
||||
- **Python**: 3.11(通过 Miniconda/Anaconda 管理)
|
||||
- **Python**: 主后端使用 3.11(通过 Miniconda/Anaconda 管理);SAM 3 使用独立 `sam3` Python 3.12 conda 环境
|
||||
|
||||
### 安装系统级依赖
|
||||
|
||||
@@ -243,7 +247,22 @@ python download_sam2.py
|
||||
|
||||
> **注意**:当前系统磁盘紧张时,建议仅保留 `sam2_hiera_tiny.pt`,删除其他模型以释放空间。
|
||||
|
||||
### 步骤 5: 配置环境变量
|
||||
### 步骤 5: 可选安装 SAM 3 环境
|
||||
|
||||
当前后端不会把 SAM 3 直接装进 `seg_server`,而是通过独立 `sam3` conda 环境执行 `backend/services/sam3_external_worker.py`。这样可以保留现有 Python 3.11 / SAM 2 环境。
|
||||
|
||||
```bash
|
||||
cd ~/Desktop/Seg_Server
|
||||
./backend/setup_sam3_env.sh
|
||||
|
||||
# 首次使用官方权重前,需要先在 Hugging Face 申请 facebook/sam3 访问权限并登录
|
||||
conda activate sam3
|
||||
huggingface-cli login
|
||||
```
|
||||
|
||||
官方 `facebook/sam3` 权重约 3.45 GB,当前没有类似 SAM 2 `tiny/small/base/large` 的官方小权重梯度;`facebook/sam3.1` 约 3.5 GB,主要面向新的视频 multiplex checkpoint。未获得 gated model 授权时,`GET /api/ai/models/status` 会把 SAM 3 标为不可用并说明 checkpoint access 不满足。
|
||||
|
||||
### 步骤 6: 配置环境变量
|
||||
|
||||
后端通过 `backend/config.py` 中的 Pydantic Settings 读取 `backend/.env`。如需覆盖默认值,请编辑以下文件:
|
||||
|
||||
@@ -258,7 +277,10 @@ minio_secure=false
|
||||
sam_model_path=/home/wkmgc/Desktop/Seg_Server/models/sam2_hiera_tiny.pt
|
||||
sam_model_config=configs/sam2/sam2_hiera_t.yaml
|
||||
sam_default_model=sam2
|
||||
sam3_model_version=sam3.1
|
||||
sam3_model_version=sam3
|
||||
sam3_external_enabled=true
|
||||
sam3_external_python=/home/wkmgc/miniconda3/envs/sam3/bin/python
|
||||
sam3_timeout_seconds=300
|
||||
cors_origins=["http://localhost:3000","http://192.168.3.11:3000"]
|
||||
```
|
||||
|
||||
@@ -271,7 +293,7 @@ VITE_WS_PROGRESS_URL=ws://192.168.3.11:8000/ws/progress
|
||||
|
||||
如果未配置 `VITE_API_BASE_URL`,前端会按当前浏览器 hostname 推导 `http://<host>:8000`。
|
||||
|
||||
### 步骤 6: 启动后端服务
|
||||
### 步骤 7: 启动后端服务
|
||||
|
||||
```bash
|
||||
cd ~/Desktop/Seg_Server/backend
|
||||
@@ -287,7 +309,8 @@ nohup uvicorn main:app --host 0.0.0.0 --port 8000 > /tmp/fastapi.log 2>&1 &
|
||||
- 创建数据库表(如果不存在)
|
||||
- 检查 MinIO bucket 是否存在
|
||||
- 测试 Redis 连接
|
||||
- 懒加载 SAM 模型;`GET /api/ai/models/status` 会返回 SAM 2、SAM 3 与 GPU 的真实可用状态
|
||||
- 懒加载 SAM 模型;`GET /api/ai/models/status` 会返回 SAM 2、SAM 3、GPU 和 SAM 3 checkpoint access 的真实可用状态
|
||||
- `/api/ai/predict` 支持 AI 参数 `crop_to_prompt`、`auto_filter_background` 和 `min_score`,用于点/框 prompt 的局部裁剪推理、回映射和背景过滤
|
||||
|
||||
### 步骤 6.1: 启动 Celery Worker
|
||||
|
||||
@@ -301,7 +324,7 @@ celery -A celery_app:celery_app worker --loglevel=info --concurrency=1
|
||||
nohup celery -A celery_app:celery_app worker --loglevel=info --concurrency=1 > /tmp/celery.log 2>&1 &
|
||||
```
|
||||
|
||||
`POST /api/media/parse` 只创建 `processing_tasks` 记录并把任务投递给 Celery;真正的 FFmpeg/OpenCV/pydicom 拆帧由 worker 执行。worker 每次更新任务状态后会发布到 Redis `seg:progress` 频道,FastAPI 订阅后转发到 `/ws/progress`,前端 Dashboard 可实时更新。
|
||||
`POST /api/media/parse` 只创建 `processing_tasks` 记录并把任务投递给 Celery;真正的 FFmpeg/OpenCV/pydicom 拆帧由 worker 执行。worker 每次更新任务状态后会发布到 Redis `seg:progress` 频道,FastAPI 订阅后转发到 `/ws/progress`,前端 Dashboard 可实时更新。Dashboard 也可调用 `/api/tasks/{id}/cancel`、`/api/tasks/{id}/retry` 和 `/api/tasks/{id}` 完成任务取消、重试与失败详情查看。
|
||||
|
||||
### 步骤 7: 安装前端依赖并构建
|
||||
|
||||
@@ -438,7 +461,8 @@ pip install -e . --no-build-isolation
|
||||
- 前端 `predictMask()` 已发送后端需要的 `image_id`、`prompt_type`、`prompt_data`,并把后端 `polygons` 转成 Konva `pathData`。
|
||||
- 工作区点选/框选会使用当前帧的数据库 `frame.id` 调用 `/api/ai/predict`。
|
||||
- 前端 `exportCoco()` 已对齐到 `/api/export/{projectId}/coco`。
|
||||
- 工作区“导出 JSON 标注集”按钮已绑定下载流程;导出前会先保存当前待归档的前端 mask。
|
||||
- 工作区“导出 JSON 标注集”和“导出 PNG Mask ZIP”按钮已绑定下载流程;导出前会先保存当前待归档的前端 mask。
|
||||
- 工作区“导入 GT Mask”按钮已绑定 `/api/ai/import-gt-mask`,导入后会刷新并回显已保存标注和 seed point。
|
||||
- 工作区“结构化归档保存”按钮会把当前项目未保存 mask 写入 `POST /api/ai/annotate`,并把 dirty mask 写入 `PATCH /api/ai/annotations/{id}`。
|
||||
- 工作区“清空遮罩”会通过 `DELETE /api/ai/annotations/{id}` 删除当前帧已保存标注,并清空当前帧本地 mask。
|
||||
|
||||
@@ -447,6 +471,7 @@ pip install -e . --no-build-isolation
|
||||
```bash
|
||||
curl http://localhost:8000/health
|
||||
curl http://localhost:8000/api/export/1/coco
|
||||
curl http://localhost:8000/api/export/1/masks
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user