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 行,其中
Background1 行,真实脑区 120 行。
已经固定的数据划分:
| split | samples | subjects |
|---|---|---|
| train | 710 | 710 |
| val | 152 | 152 |
| test | 153 | 153 |
划分文件保存在:
metadata/pet_fdg_manifest.csvmetadata/splits/train.csvmetadata/splits/val.csvmetadata/splits/test.csvmetadata/splits/split_summary.csvmetadata/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. 当前可训练任务
在没有临床标签的条件下,可以做以下任务:
PET -> SUVR 回归
- 输入:3D FDG-PET。
- 输出:120 个脑区 SUVR。
- 目的:验证 image encoder 是否真正学到区域代谢分布。
PET-SUVR 对比学习
- 同一扫描的 PET embedding 和 SUVR embedding 作为正样本。
- 不同扫描作为负样本。
- 目的:把 3D 图像表示和区域结构化表示对齐。
高低代谢脑区预测
- 预测 top-k 高 SUVR 脑区和 top-k 低 SUVR 脑区。
- 目的:形成可解释的区域级输出。
相似病例检索
- 用 PET embedding 或 PET-SUVR fused embedding 检索相似代谢模式病例。
- 目的:验证表示空间是否有实际用途。
规则报告生成
- 基于真实或预测 SUVR 生成结构化文本摘要。
- 目的:为后续 VLM/LLM 接入准备可控文本接口。
4. 后续可扩展任务
补充临床标签后,才建议做:
- CN / MCI / AD 三分类。
- AD vs CN 二分类。
- pMCI vs sMCI 转化预测。
- MMSE / ADAS-Cog 回归。
- 脑龄或疾病风险评分。
- PET 图像问答。
- 自动报告生成。
这些是下游任务,不是当前数据本身直接支持的第一任务。
5. Backbone 与 VLM 路线
不建议从头训练完整 VLM。1015 个 3D 样本太少,直接训练大模型会过拟合。推荐路线是:
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
推荐阶段:
流程基线
- 使用当前
scripts/train_pet_vlm_baseline.py里的小型 3D CNN。 - 目的只是验证数据读取、预处理、loss、训练循环。
- 使用当前
正式第一版 encoder
- 推荐 MedicalNet 3D ResNet-50。
- 原因:轻量、稳定、3D 医学影像预训练,适合作为 PET encoder 起点。
架构对照
- SwinUNETR 或 SAM-Med3D image encoder。
- 目的:验证 Transformer-style encoder 是否比 ResNet 更适合区域代谢建模。
VLM 接入
- 不让 LLM 直接读 NIfTI。
- 先由 3D encoder 把 PET 压成 embedding/token。
- 再通过 projector 或 Q-Former 接到语言模型。
6. 当前保留文件
项目根目录保留:
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. 当前代码入口
安装依赖:
pip install -r requirements.txt
运行最小 PET-SUVR 对齐训练:
python scripts/train_pet_vlm_baseline.py --epochs 2 --batch-size 2
显存不够时:
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. 下一步决策
下一步应该做两件事:
- 把当前小 3D CNN baseline 跑通完整 train/val,看 PET->SUVR 回归和对齐 loss 是否稳定下降。
- 引入 MedicalNet 3D ResNet-50 作为正式 PET encoder,替换当前小 CNN。
如果之后拿到临床标签,再新增分类任务头,而不是推翻当前路线。