20260430_001744-feat: PyTorch CUDA + SAM2 GPU inference, video thumbnail, real FPS + configurable parse FPS, DICOM batch import
This commit is contained in:
62
工程分析/实现方案-20260430_001744.md
Normal file
62
工程分析/实现方案-20260430_001744.md
Normal 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`
|
||||
22
工程分析/测试方案-20260430_001744.md
Normal file
22
工程分析/测试方案-20260430_001744.md
Normal 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
|
||||
44
工程分析/经验记录.md
44
工程分析/经验记录.md
@@ -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. 系统磁盘仅 24GB,PyTorch 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()` → True,RTX 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. 具体问题
|
||||
|
||||
39
工程分析/需求分析-20260430_001744.md
Normal file
39
工程分析/需求分析-20260430_001744.md
Normal 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 文件
|
||||
Reference in New Issue
Block a user