Torchio学习随笔(2)-Subject&Dataset
1.Subject
Subject是一种用于存储与Subject相关联的图像以及处理所需的任何其他元数据的数据结构。
1.1 torchio.Subject类
储存Subject相关Image信息
import torchio as tio
# One way:
subject = tio.Subject(
one_image=tio.ScalarImage('path_to_image.nii.gz'),
a_segmentation=tio.LabelMap('path_to_seg.nii.gz'),
age=45,
name='John Doe',
hospital='Hospital Juan Negrín',
)
# If you want to create the mapping before, or have spaces in the keys:
subject_dict = {
'one image': tio.ScalarImage('path_to_image.nii.gz'),
'a segmentation': tio.LabelMap('path_to_seg.nii.gz'),
'age': 45,
'name': 'John Doe',
'hospital': 'Hospital Juan Negrín',
}
subject = tio.Subject(subject_dict)
data = tio.datasets.mni.Colin27()
Downloading http://packages.bic.mni.mcgill.ca/mni-models/colin27/mni_colin27_1998_nifti.zip to /root/.cache/torchio/mni_colin27_1998_nifti/mni_colin27_1998_nifti.zip
0it [00:00, ?it/s]
data.brain
LabelMap(shape: (1, 181, 217, 181); spacing: (1.00, 1.00, 1.00); orientation: RAS+; path: "/root/.cache/torchio/mni_colin27_1998_nifti/colin27_t1_tal_lin_mask.nii.gz")
1.1.1 实例的创建
- 直接创建
- 通过字典创建
#直接创建
subject = tio.Subject(
image=data.t1,
labelmap1=data.head,
labelmap2=data.brain,
age=45,
name='Test man',
hospital='Hospital Bj',
)
print(subject)
Subject(Keys: ('image', 'labelmap1', 'labelmap2', 'age', 'name', 'hospital'); images: 3)
#通过字典创建
subject_dict = {
'image': data.t1,
'labelmap1': data.head,
'age': 45,
'name': 'Test man',
'hospital': 'Hospital Bj',
}
subject2 = tio.Subject(subject_dict)
print(subject2)
Subject(Keys: ('image', 'labelmap1', 'age', 'name', 'hospital'); images: 2)
1.1.2 实例的调用
通过Keys调用实例中的图像
subject2.image,subject2.age
(ScalarImage(shape: (1, 181, 217, 181); spacing: (1.00, 1.00, 1.00); orientation: RAS+; dtype: torch.FloatTensor; memory: 27.1 MiB),
45)
#向实例中添加图像
subject2.add_image(data.brain,'labelmap2')
print(subject2)
Subject(Keys: ('image', 'labelmap1', 'age', 'name', 'hospital', 'labelmap2'); images: 3)
#对实例应用逆变换
subject3 = subject2.apply_inverse_transform()
2.Dataset

将多个Subject组成Subjects list构成SubjectsDataset
2.1 torchio.SubjectDataset类
直接从 PyTorch 数据集继承的 3D 医学图像的读取器。它可以与 PyTorch DataLoader 一起使用,以实现高效的加载和扩充。
2.1.1 参数
- subjects - 由Subject实例组成的list
- transform - 对每个subject实例都应用的Transform实例
- load_getitem - 在返回__getitem__()中之前,加载所有的主题图像。如果在训练中不需要某些图像,则将其设置为False。
2.1.2 创建
#定义subjects参数
subjects_list = [subject,subject2]
#定义transform参数
transform = tio.Compose([
tio.RescaleIntensity(out_min_max=(0, 1)),
tio.RandomAffine(),
])
#创建SubjectDataset
subjects_dataset = tio.SubjectsDataset(subjects_list, transform=transform)
#通过索引调用每个subject实例
subjects_dataset[1]
Subject(Keys: ('image', 'labelmap1', 'age', 'name', 'hospital'); images: 2)
2.1.2 方法
1.dry_iter()
使用dry_iter()方法,在不加载图像的情况下,快速遍历subject
ages = [subject.age for subject in subjects_dataset.dry_iter()]
print('dataset中subject的年龄为:',ages)
dataset中subject的年龄为: [45, 45]
2.from_batch()
从dataloader生成的batch中实例化一个数据集。
3. set_transform()
trans = tio.RandomFlip()
newdataset = subjects_dataset.set_transform(trans)
type(newdataset)
NoneType

浙公网安备 33010602011771号