# 实现方案 — 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`
