在调试densenet进行分类任务的代码时,在图像预处理的过程中遇到下列错误:
RuntimeError: stack expects each tensor to be equal size, but got [640, 640] at entry 0 and [560, 560] at entry 2
意思是我加载的张量大小不一致。
经过查找发现应该是我在加载图像时的预处理过程中出现了问题。
以下是训练数据预处理的实例化部分。
train_transform = Compose(
[
LoadImaged(keys=keys),
AddChanneld(keys=keys),
CropForegroundd(keys=keys[:-1], source_key="tumor"),
ScaleIntensityd(keys=keys[:-1]),
# # Orientationd(keys=keys[:-1], axcodes="RAI"),
Resized(keys=keys[:-1], spatial_size=(64, 64), mode='bilinear'),
ConcatItemsd(keys=keys[:-1], name="image"),
RandGaussianNoised(keys=["image"], std=0.01, prob=0.15),
RandFlipd(keys=["image"], prob=0.5), # , spatial_axis=[0, 1]
RandAffined(keys=["image"], mode='bilinear', prob=1.0, spatial_size=[64, 64], # 这里的3是因为不知道三个模态的图像拼接之后的尺寸如何,因此先使用
rotate_range=(0, 0, np.pi / 15), scale_range=(0.1, 0.1)),
ToTensord(keys=keys),
]
)
我的keys为[“T2_img”, “DWI_img”, “ADC_img”, “tumor”]
报错显示加载之后的tensor存在尺寸 [640, 640]和 [560, 560],这是我原图像的尺寸,那就说明我的裁剪步骤或者resize步骤很可能出现了问题。最后经过筛选发现,是我的resize步骤出现了问题,我在resize那一步,选择的keys是keys=keys[:-1],即不包含"tumor",所以在resize的时候我的tumor图像仍然会保持原图大小,而这一个字典中包含的数据在载入的时候仍然是一个整体,这个整体的各个维度的尺寸会自动的扩展为其中所有对象相应尺寸中最大的一个,所以我加载后的数据仍然会是原图大小,进行以下改正:
train_transform = Compose(
[
LoadImaged(keys=keys),
AddChanneld(keys=keys),
CropForegroundd(keys=keys[:-1], source_key="tumor"),
ScaleIntensityd(keys=keys[:-1]),
# # Orientationd(keys=keys[:-1], axcodes="RAI"),
Resized(keys=keys, spatial_size=(64, 64), mode='bilinear'), # 将[:-1]去掉
ConcatItemsd(keys=keys[:-1], name="image"),
RandGaussianNoised(keys=["image"], std=0.01, prob=0.15),
RandFlipd(keys=["image"], prob=0.5), # , spatial_axis=[0, 1]
RandAffined(keys=["image"], mode='bilinear', prob=1.0, spatial_size=[64, 64], # 这里的3是因为不知道三个模态的图像拼接之后的尺寸如何,因此先使用
rotate_range=(0, 0, np.pi / 15), scale_range=(0.1, 0.1)),
ToTensord(keys=keys),
]
)
运行成功!