20260430_001744-feat: PyTorch CUDA + SAM2 GPU inference, video thumbnail, real FPS + configurable parse FPS, DICOM batch import

This commit is contained in:
2026-04-30 00:30:58 +08:00
parent 35d6e1503c
commit 6d008ec4a2
15 changed files with 555 additions and 101 deletions

View File

@@ -0,0 +1,62 @@
# 实现方案 — 2026-04-30
## R1 — PyTorch CUDA + SAM2 安装
### 步骤
1. `pip uninstall torch torchvision torchaudio -y`
2. `pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124`
3. `pip install sam2`
4. 验证: `torch.cuda.is_available()` → True
5. 修改 `backend/services/sam2_engine.py`,移除 stub fallback使用真实 SAM2
### SAM2 模型配置
- 模型文件: `/home/wkmgc/Desktop/Seg_Server/models/sam2_hiera_tiny.pt` (149MB)
- 配置文件: 需下载对应 YAML 或使用默认配置
## R2 — 视频封面
### 后端
1. `frame_parser.py`: `parse_video()` 提取第一帧为 `thumbnail.jpg`
2. `upload_frames_to_minio()`: 同时上传 thumbnail 到 `projects/{id}/thumbnail.jpg`
3. `models.py`: Project 增加 `thumbnail_url` 字段
4. `schemas.py`: ProjectOut 增加 `thumbnail_url`
5. `projects.py`: list_projects / get_project 返回 thumbnail presigned URL
### 前端
1. `ProjectLibrary.tsx`: 卡片背景显示 `proj.thumbnail_url``<img>`
## R3 — 帧率
### 后端
1. `models.py`: Project 增加 `original_fps` (float), `parse_fps` (float, default=30)
2. `schemas.py`: ProjectOut / ProjectCreate 增加字段
3. `frame_parser.py`:
- `parse_video()` 开头用 FFmpeg/FFprobe 读取原始帧率,返回给调用方
- 解析时按 `parse_fps` 参数提取帧
4. `media.py`: `parse_media()` 传入 parse_fps
5. `main.py`: 默认视频种子逻辑设置 original_fps
### 前端
1. `useStore.ts`: Project 增加 `original_fps`, `parse_fps`
2. `api.ts`: getProjects / createProject 映射字段
3. `ProjectLibrary.tsx`: 显示真实帧率 `original_fps`
4. 上传时弹窗允许设置 parse_fps
## R4 — DICOM 批量导入
### 后端
1. `models.py`: Project 增加 `source_type` (str, default="video")
2. `schemas.py`: ProjectOut 增加 source_type
3. `media.py`:
- `upload_media()` 支持批量上传(`List[UploadFile]`
- 新增 `/api/media/upload/dicom` 接口,专用于批量 .dcm 上传
- DICOM 文件存储到 `uploads/{project_id}/dicom/`
- 上传完成后可直接触发解析
4. `frame_parser.py`: `parse_dicom()` 支持从 MinIO 读取整个 dicom 目录
### 前端
1. `ProjectLibrary.tsx`:
- 导入按钮支持两种模式: 视频导入 / DICOM 序列导入
- DICOM 模式: `<input multiple accept=".dcm">`
- 上传进度显示
2. `useStore.ts`: Project 增加 `source_type`

View File

@@ -0,0 +1,22 @@
# 测试方案 — 2026-04-30
## TC1 — PyTorch CUDA + SAM2
1. 后端启动后日志应显示 "SAM2 loaded successfully" 而非 "SAM2 import failed"
2. `python -c "import torch; print(torch.cuda.is_available())"` → True
3. `python -c "import sam2; print('OK')"` → OK
4. 调用 `/api/ai/predict` 应返回真实 polygon而非 dummy rectangle
## TC2 — 视频封面
1. 解析视频后,检查 MinIO 中是否存在 `projects/{id}/thumbnail.jpg`
2. 项目库卡片应显示视频第一帧作为封面背景
## TC3 — 帧率
1. 上传 25fps 视频original_fps 应显示 25.0
2. 设置 parse_fps=10解析后帧数应为 original_fps 的约 1/3
3. 项目库显示原始帧率
## TC4 — DICOM 批量导入
1. 选择 10 个 .dcm 文件批量上传
2. 项目创建成功source_type="dicom"
3. 解析完成后帧数等于上传的 .dcm 数量
4. 再次向同一项目上传 5 个 .dcm帧数增加 5

View File

@@ -5,6 +5,50 @@
---
## 2026-04-30-00-17-44 — PyTorch CUDA + SAM2 + 封面 + 帧率 + DICOM 批量导入
### A. 具体问题
1. PyTorch 为 CPU 版本SAM2 未安装GPU 推理不可用
2. 项目库视频卡片无封面缩略图
3. 项目库 FPS 为硬编码 "30FPS",不显示真实原始帧率,也无法修改解析帧率
4. 不支持 DICOM 连续帧批量导入
### B. 产生原因
1. 系统磁盘仅 24GBPyTorch CUDA wheel (~1GB) + SAM2 编译依赖导致 `No space left on device`
2. 解析视频时未提取封面Project 模型无 thumbnail_url 字段
3. 解析视频时未读取原始帧率Project 模型无 original_fps / parse_fps 字段
4. upload 接口仅支持单文件,无批量 DICOM 上传接口Project 无 source_type 区分视频/DICOM
### C. 解决方案
1. **磁盘扩容后安装 PyTorch CUDA + SAM2**
- `pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124`
- `pip install sam2`(成功编译安装 sam2-1.1.0
- 修正 `config.py``sam_model_config``configs/sam2/sam2_hiera_t.yaml`Hydra 包内相对路径)
- 验证 `torch.cuda.is_available()` → TrueRTX 4090 识别正常
2. **视频封面**
- `frame_parser.py` 新增 `extract_thumbnail()`,从视频第一帧提取 640px JPEG 封面
- `media.py` `parse_media()` 解析视频时自动上传封面到 `projects/{id}/thumbnail.jpg`
- `projects.py` 返回 presigned URL
- 前端 `ProjectLibrary.tsx` 卡片背景显示 `<img>` 封面
3. **真实帧率 + 可修改解析帧率**
- `models.py` Project 新增 `original_fps` (Float), `parse_fps` (Float, default=30)
- `frame_parser.py` `get_video_fps()` 用 OpenCV 读取真实帧率,`parse_video()` 返回 `(frames, original_fps)`
- 前端 `ProjectLibrary.tsx` 上传视频时弹窗允许用户滑动设置 parse_fps (1-60)
- 项目卡片显示 `原 60.0fps``30FPS` 标签
4. **DICOM 批量导入**
- `models.py` Project 新增 `source_type` (video | dicom)
- `media.py` 新增 `/api/media/upload/dicom` 接口,接收 `List[UploadFile]`,上传多个 .dcm 到 `uploads/{id}/dicom/`
- `media.py` `parse_media()` 支持 DICOM 模式:从 MinIO 下载整个 dicom 目录 → `parse_dicom()` 解析
- 前端 `ProjectLibrary.tsx` 导入按钮展开菜单:导入视频 / 导入 DICOM 序列DICOM 用 `<input multiple accept=".dcm">`
### D. 后续如何避免问题
1. **SAM2 配置路径必须用 Hydra 包内相对路径**`build_sam2()` 使用 Hydra配置文件必须传 `configs/sam2/xxx.yaml` 而非绝对路径
2. **数据库 schema 变更必须彻底清理旧表**PostgreSQL `drop_all()` 可能因外键约束不彻底,生产环境应使用 Alembic 迁移,开发环境应手动 `DROP TABLE ... CASCADE`
3. **大依赖安装必须预留足够磁盘空间**PyTorch CUDA (~1GB) + SAM2 build (~500MB temp) 至少需要 5GB 可用空间
4. **前端上传交互必须区分媒体类型**:视频和 DICOM 的上传流程、文件选择器 `accept`、后续解析逻辑完全不同,应提供明确的模式切换
---
## 2026-04-29-23-28-13 — 视频帧显示链路全修复
### A. 具体问题

View File

@@ -0,0 +1,39 @@
# 需求分析 — 2026-04-30
## 需求背景
磁盘已扩容至 184GB空间充足。用户提出 4 个核心需求:
## 需求拆解
| 编号 | 需求 | 优先级 | 影响面 |
|------|------|--------|--------|
| R1 | 安装完整版 PyTorch CUDA + SAM2恢复 GPU 推理 | P0 | conda 环境 |
| R2 | 项目库视频显示封面缩略图 | P0 | backend/media.py, ProjectLibrary.tsx |
| R3 | 项目库显示原始帧率,支持修改解析帧率 | P0 | backend/models.py, frame_parser.py, 前端 |
| R4 | DICOM 连续帧批量导入支持 | P0 | backend/media.py, ProjectLibrary.tsx |
### R1 — PyTorch CUDA + SAM2
- 当前 PyTorch 为 CPU 版本 (2.11.0+cpu)
- SAM2 未安装
- GPU: RTX 4090 24GB驱动 595.58.03
- 目标: 安装 PyTorch 2.5+ CUDA 12.4 + SAM2使 `/api/ai/predict` 使用真实 SAM2 推理
### R2 — 视频封面
- 当前项目卡片只显示 Film 图标,无封面
- 目标: 解析视频时提取第一帧作为封面 thumbnail项目库显示为卡片背景图
### R3 — 帧率显示与修改
- 当前 fps 为硬编码 "30FPS"
- 目标:
- 解析视频时读取真实原始帧率,存入 Project.original_fps
- 项目库显示原始帧率
- 支持设置 parse_fps解析帧率可低于原始帧率
- 后端解析时按 parse_fps 提取帧
### R4 — DICOM 批量导入
- Data_Dicom帧/ 下有 300 个 .dcm 文件,共约 160MB
- 目标:
- 项目类型支持 `source_type`: video / dicom
- 导入时支持多选 .dcm 文件批量上传
- 上传后解析为帧序列
- 支持后续继续向同一项目新增 .dcm 文件