PET / docs /PET_VLM_PROJECT_PLAN.md
DesonDai's picture
Add files using upload-large-folder tool
821844e verified
|
Raw
History Blame Contribute Delete
6.05 kB
# FDG-PET 区域代谢多模态项目定义
## 1. 当前数据状态
当前目录已经清理为一一配对的数据集:
- FDG-PET 体数据:`fdgpet_M00_112/fdgpet_M00_112/*.nii.gz`,共 1015 个。
- 区域 SUVR 表:`petfdg_suvr_csv/petfdg_suvr_csv/*.csv`,共 1015 个。
- 成功配对:1015 对。
- 未配对文件:0 个。
- PET 尺寸:全部为 `112 x 128 x 112`
- 体素间距:全部为 `1.5 x 1.5 x 1.5 mm`
- 每个 CSV:121 行,其中 `Background` 1 行,真实脑区 120 行。
已经固定的数据划分:
| split | samples | subjects |
|---|---:|---:|
| train | 710 | 710 |
| val | 152 | 152 |
| test | 153 | 153 |
划分文件保存在:
- `metadata/pet_fdg_manifest.csv`
- `metadata/splits/train.csv`
- `metadata/splits/val.csv`
- `metadata/splits/test.csv`
- `metadata/splits/split_summary.csv`
- `metadata/splits/pet_fdg_manifest_with_split.csv`
划分按 `subject_id` 完成,避免同一受试者泄漏到不同 split。
## 2. 任务目标判断
当前阶段的主任务不是分割,也不应该直接定义为临床分类。
### 不是分割
分割任务需要 voxel-level mask 或 ROI label map 作为监督信号。当前目录没有脑区 mask、病灶 mask、配准标签或分割真值,只有 PET 图像和由 PET 派生出来的区域 SUVR CSV。因此不能把当前项目定义为分割。
### 目前也不是临床分类
分类任务需要类别标签,例如 CN/MCI/AD、pMCI/sMCI、阳性/阴性、疾病分期等。当前目录没有诊断标签、年龄、性别、MMSE、ADAS-Cog 或转化状态。因此现在不能严肃地训练“AD 分类器”,也不能声称模型能做诊断分类。
### 当前最合理目标
当前最合理、数据支撑最充分的目标是:
> 训练一个 FDG-PET 区域代谢理解 encoder,使模型能够从 3D PET 图像中学习区域代谢模式,并与 120 脑区 SUVR 数值表示对齐。这个 encoder 后续可作为 VLM 的视觉/医学影像前端,用于分类、检索、问答或报告生成。
换句话说,当前阶段应该做的是 **PET-SUVR 表征学习和区域代谢理解**,不是最终临床任务。
## 3. 当前可训练任务
在没有临床标签的条件下,可以做以下任务:
1. **PET -> SUVR 回归**
- 输入:3D FDG-PET。
- 输出:120 个脑区 SUVR。
- 目的:验证 image encoder 是否真正学到区域代谢分布。
2. **PET-SUVR 对比学习**
- 同一扫描的 PET embedding 和 SUVR embedding 作为正样本。
- 不同扫描作为负样本。
- 目的:把 3D 图像表示和区域结构化表示对齐。
3. **高低代谢脑区预测**
- 预测 top-k 高 SUVR 脑区和 top-k 低 SUVR 脑区。
- 目的:形成可解释的区域级输出。
4. **相似病例检索**
- 用 PET embedding 或 PET-SUVR fused embedding 检索相似代谢模式病例。
- 目的:验证表示空间是否有实际用途。
5. **规则报告生成**
- 基于真实或预测 SUVR 生成结构化文本摘要。
- 目的:为后续 VLM/LLM 接入准备可控文本接口。
## 4. 后续可扩展任务
补充临床标签后,才建议做:
- CN / MCI / AD 三分类。
- AD vs CN 二分类。
- pMCI vs sMCI 转化预测。
- MMSE / ADAS-Cog 回归。
- 脑龄或疾病风险评分。
- PET 图像问答。
- 自动报告生成。
这些是下游任务,不是当前数据本身直接支持的第一任务。
## 5. Backbone 与 VLM 路线
不建议从头训练完整 VLM。1015 个 3D 样本太少,直接训练大模型会过拟合。推荐路线是:
```text
3D FDG-PET
-> pretrained 3D medical image encoder
-> projection layer / Q-Former / Perceiver resampler
-> visual tokens
-> fusion with SUVR region tokens
-> downstream head or LLM adapter
```
推荐阶段:
1. **流程基线**
- 使用当前 `scripts/train_pet_vlm_baseline.py` 里的小型 3D CNN。
- 目的只是验证数据读取、预处理、loss、训练循环。
2. **正式第一版 encoder**
- 推荐 MedicalNet 3D ResNet-50。
- 原因:轻量、稳定、3D 医学影像预训练,适合作为 PET encoder 起点。
3. **架构对照**
- SwinUNETR 或 SAM-Med3D image encoder。
- 目的:验证 Transformer-style encoder 是否比 ResNet 更适合区域代谢建模。
4. **VLM 接入**
- 不让 LLM 直接读 NIfTI。
- 先由 3D encoder 把 PET 压成 embedding/token。
- 再通过 projector 或 Q-Former 接到语言模型。
## 6. 当前保留文件
项目根目录保留:
```text
fdgpet_M00_112/ # 原始 PET NIfTI
petfdg_suvr_csv/ # 原始 SUVR CSV,已清理为 1015 个
metadata/
pet_fdg_manifest.csv # 全量 1015 对配对清单
splits/
train.csv
val.csv
test.csv
split_summary.csv
pet_fdg_manifest_with_split.csv
docs/
PET_VLM_PROJECT_PLAN.md
scripts/
pet_vlm_dataset.py # 可复用 Dataset 和预处理
train_pet_vlm_baseline.py # 可复用训练基线
requirements.txt
预训练3D脑MRI编码器验证报告.pdf
```
已经删除的一次性或临时文件:
- manifest 生成脚本。
- split 生成脚本。
- smoke test checkpoint。
- `__pycache__`
## 7. 当前代码入口
安装依赖:
```bash
pip install -r requirements.txt
```
运行最小 PET-SUVR 对齐训练:
```bash
python scripts/train_pet_vlm_baseline.py --epochs 2 --batch-size 2
```
显存不够时:
```bash
python scripts/train_pet_vlm_baseline.py --epochs 2 --batch-size 1 --output-size 80 80 80
```
当前训练脚本默认读取:
- train:`metadata/splits/train.csv`
- val:`metadata/splits/val.csv`
test 集不参与调参,只用于最终评估。
## 8. 下一步决策
下一步应该做两件事:
1. 把当前小 3D CNN baseline 跑通完整 train/val,看 PET->SUVR 回归和对齐 loss 是否稳定下降。
2. 引入 MedicalNet 3D ResNet-50 作为正式 PET encoder,替换当前小 CNN。
如果之后拿到临床标签,再新增分类任务头,而不是推翻当前路线。