TorchIO 是一个非常重要的医学影像深度学习工具包,尤其在 MRI、CT、PET 等三维医学影像数据的预处理、增强和建模 中应用广泛。它基于 PyTorch 构建,因此能无缝集成到你的神经网络训练流程中。
文章目录
-
- [1. 基础信息介绍](#1. 基础信息介绍)
- [2. TorchIO 的主要功能模块](#2. TorchIO 的主要功能模块)
-
- [2.1 图像加载与组织](#2.1 图像加载与组织)
- [2.2 数据预处理](#2.2 数据预处理)
- [2.3 数据增强](#2.3 数据增强)
- [2.4 数据加载与批处理](#2.4 数据加载与批处理)
- [2.5 Patch-based训练✨](#2.5 Patch-based训练✨)
- [3. 安装与基本使用](#3. 安装与基本使用)
- [4. 数据增强使用场景](#4. 数据增强使用场景)
-
- [4.1 CT](#4.1 CT)
- [4.2 MRI](#4.2 MRI)
- [4.3 PET](#4.3 PET)
- [4.4 多模态策略(PET/CT或PET/MRI)](#4.4 多模态策略(PET/CT或PET/MRI))
1. 基础信息介绍
TorchIO 是一个开源的 Python 库,专为 三维医学影像(3D medical imaging) 的预处理、数据增强(augmentation)和深度学习工作流程而设计。TorchIO 的设计理念是:
"让医学影像能像普通图像那样轻松被 PyTorch 使用。"
项目主页
👉 https://torchio.readthedocs.io
👉 GitHub: https://github.com/fepegar/torchio
2. TorchIO 的主要功能模块
2.1 图像加载与组织
- 支持格式:NIFTI(.nii/.nii.gz格式),DICOM,Numpy等
- 核心结构:
torchio.Image表示单个影像通道(例如一张T1 MRI或PET)
torchio.Subject表示一个完整的个体数据,可以包含多个模态影像数据和标签
python
import torchio as tio
subject = tio.Subject(
t1=tio.ScalarImage('subj1_T1.nii.gz'),
pet=tio.ScalarImage('subj1_PET.nii.gz'),
label=tio.LabelMap('subj1_label.nii.gz')
)
2.2 数据预处理
TorchIO 支持一系列常见的医学影像预处理操作:
- 重采样(Resample):统一体素大小
- 归一化(ZNormalization, RescaleIntensity)
- 裁剪或填充(CropOrPad, Pad, Crop)
- 仿射对齐(Affine)
python
transform = tio.Compose([
tio.Resample((1, 1, 1)), # 重采样为1mm³体素
tio.ZNormalization(), # z-score标准化
tio.CropOrPad((128, 128, 128)) # 统一尺寸
])
processed = transform(subject)
2.3 数据增强
TorchIO 支持各种空间变换与强度变换:
| 类型 | 示例 | 说明 |
|---|---|---|
| 空间变换 | RandomAffine,RandomElasticDeformation,RandomFlip | 随机旋转、弹性形变、翻转 |
| 强度变换 | RandomNoise, RandomBlur, RandomGamma, RandomBiasField | 模拟噪声、对比度变化 |
| 病灶模拟 | RandomSwap, RandomMotion, RandomSpike, RandomBiasField | 模拟病灶或扫描伪影 |
python
augmentation = tio.Compose([
tio.RandomFlip(axes=(0,)), # 左右翻转
tio.RandomAffine(scales=(0.9, 1.1)), # 随机缩放
tio.RandomNoise(std=0.01), # 加噪声
])
augmented = augmentation(subject)
2.4 数据加载与批处理
TorchIO 能与 PyTorch 的 DataLoader 无缝衔接:
python
subjects = [subject1, subject2, subject3]
dataset = tio.SubjectsDataset(subjects, transform=augmentation)
loader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=True)
2.5 Patch-based训练✨
医学影像通常非常大(512×512×512体素),直接输入模型显存会爆。TorchIO 提供 patch-based sampling 工具:
- tio.data.GridSampler: 自动将3D图像分块
- tio.data.GridAggregator: 把模型输出的patch拼回原图
python
sampler = tio.data.GridSampler(subject, patch_size=64)
aggregator = tio.data.GridAggregator(sampler)
→ 用于 patch-based segmentation 或 classification 模型的训练。
3. 安装与基本使用
- 安装
bash
pip install torchio
- 测试
python
import torchio as tio
print(tio.__version__)
基本操作
python
t1 = tio.ScalarImage('t1.nii.gz')
pet = tio.ScalarImage('pet.nii.gz')
subject = tio.Subject(t1=t1, pet=pet)
4. 数据增强使用场景
| 模态 | 成像机制 | 增强重点 | 不宜操作 |
|---|---|---|---|
| CT | 组织密度 → 灰度线性关系明显 | 空间变换 + 轻度噪声/伽马调整 | 不能大幅更改强度范围(HU值) |
| MRI | T1/T2等加权,强度非线性 | 空间形变 + 偏置场 + 对比度变化 | 不能直接线性归一化到0--1 |
| PET(如PSMA PET/CT) | 放射性浓度定量(SUV) | 保留SUV相对比例 + 噪声增强 | 禁止大幅伽马或bias变换 |
4.1 CT
| 增强类型 | TorchIO 方法 | 说明 |
|---|---|---|
| 空间翻转 | RandomFlip |
模拟左右或前后位置差异 |
| 仿射变换 | RandomAffine |
轻度旋转与缩放 |
| 弹性形变 | RandomElasticDeformation |
模拟组织弹性差异 |
| 噪声增强 | RandomNoise |
模拟扫描噪声 |
| 对比度增强 | RandomGamma |
模拟CT窗宽窗位变化 |
python
ct_transform = tio.Compose([
tio.RandomFlip(axes=(0, 1)),
tio.RandomAffine(scales=(0.9, 1.1), degrees=5),
tio.RandomElasticDeformation(max_displacement=4),
tio.RandomNoise(std=0.01),
tio.RandomGamma(log_gamma=(-0.3, 0.3)),
])
4.2 MRI
| 增强类型 | TorchIO 方法 | 说明 |
|---|---|---|
| 空间翻转 | RandomFlip |
模拟扫描体位差 |
| 仿射变换 | RandomAffine |
模拟姿势变化 |
| 弹性形变 | RandomElasticDeformation |
模拟软组织弹性差 |
| 偏置场 | RandomBiasField |
模拟MRI强度不均 |
| 对比度变化 | RandomGamma |
模拟T1/T2扫描差异 |
| 噪声 | RandomNoise |
模拟设备噪声 |
| 运动伪影 | RandomMotion |
模拟扫描中头动/体动 |
| 模糊伪影 | RandomBlur |
模拟低分辨率扫描 |
python
mri_transform = tio.Compose([
tio.RandomFlip(axes=(0, 1)),
tio.RandomAffine(scales=(0.9, 1.1), degrees=10),
tio.RandomElasticDeformation(max_displacement=5),
tio.RandomBiasField(coefficients=0.3),
tio.RandomGamma(log_gamma=(-0.4, 0.4)),
tio.RandomNoise(std=0.02),
tio.RandomMotion(degrees=5, translation=3),
tio.RandomBlur(std=(0, 1)),
])
4.3 PET
| 增强类型 | TorchIO 方法 | 说明 |
|---|---|---|
| 空间翻转 | RandomFlip |
模拟扫描方向变化 |
| 仿射变换 | RandomAffine |
模拟轻微配准误差 |
| 噪声 | RandomNoise |
模拟低统计计数噪声 |
| 模糊 | RandomBlur |
模拟分辨率差 |
| 强度缩放 | RescaleIntensity |
归一化SUV值 |
| 对比度轻度调整 | RandomGamma |
小幅增强对比 |
| 弹性形变 | RandomElasticDeformation |
模拟小尺度器官位移 |
python
pet_transform = tio.Compose([
tio.RescaleIntensity(out_min_max=(0, 1)),
tio.RandomFlip(axes=(0, 1)),
tio.RandomAffine(scales=(0.95, 1.05), degrees=5),
tio.RandomElasticDeformation(max_displacement=2),
tio.RandomNoise(std=0.03),
tio.RandomBlur(std=(0, 1)),
tio.RandomGamma(log_gamma=(-0.2, 0.2)),
])
💡 PET增强注意事项:
- 不能使用 RandomBiasField(会破坏SUV定量)
- 不建议使用强烈的 RandomGamma 或大范围 Affine
- 若模型以SUV特征为输入,应保持线性关系(建议仅用噪声、模糊类)
4.4 多模态策略(PET/CT或PET/MRI)
可以使用联合空间增强,模态独立强度增强
python
shared_spatial = tio.Compose([
tio.RandomFlip(axes=(0, 1)),
tio.RandomAffine(scales=(0.95, 1.05), degrees=5),
tio.RandomElasticDeformation(max_displacement=3),
])
pet_only = tio.Compose([
tio.RandomNoise(std=0.03),
tio.RandomBlur(std=(0, 1)),
])
mri_only = tio.Compose([
tio.RandomBiasField(coefficients=0.3),
tio.RandomGamma(log_gamma=(-0.4, 0.4)),
])
ct_only = tio.Compose([
tio.RandomGamma(log_gamma=(-0.3, 0.3)),
tio.RandomNoise(std=0.01),
])
subject_transform = tio.Compose([
shared_spatial,
tio.OneOf({pet_only: 0.4, mri_only: 0.4, ct_only: 0.2}),
])