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
posted @ 2022-10-28 17:20  等一轮明月yue  阅读(232)  评论(0)    收藏  举报