我正在使用改良的U-Net进行2D脑分割。
我想知道是否有人可以提供/指出有关如何在Keras中使用ImageDataGenerator()函数获取医学图像堆栈的链接。目前,我完成的工作是将每个切片都转换为.tiff格式(图像及其对应的蒙版),然后将它们放到不同的文件夹中(例如,训练,有效,测试)。这对我来说很好。
但是,我不想继续将每个切片从每个MRI体积转换为.tiff图像(将会有成千上万的MRI体积出现)。如果我能从每个体积图像和蒙版中读取所有内容,那就太好了。
我在使用ImageDataGenerator()函数时发现的所有示例都是该文件夹(例如,火车)包含单个图像。
我的图像数据在.img和.hdr中(每个卷有64个切片)。 .img和.hdr中也有相应的掩码。
所以我的数据文件夹看起来像这样:
--Train
-img
-fetus1.img
-fetus1.hdr
-fetus2.img
-fetus2.hdr
-mask
-fetus1.img
-fetus1.hdr
-fetus2.img
-fetus2.hdr
--Valid
-img
-fetus3.img
-fetus3.hdr
-mask
-fetus3.img
-fetus3.hdr
--Test
-img
-fetus4.img
-fetus4.hdr
-mask
-fetus4.img
-fetus4.hdr
非常感谢提前
答案 0 :(得分:0)
好的,我有一个类似的问题(尽管我不使用医学图像),并且找到了解决方案,所以希望其他人也能找到有用的方法。
因此,由于1),您需要将fit_generator函数与IDG结合使用,唯一的问题是ImageDataGenerator(IDG)不支持自定义生成器。
实际上,在某些情况下,您可以将IDG与fit_generator函数一起使用:IDG flow函数返回类型为NumpyArrayIterator的Iterator。您不能使用它,因为它要求数据适合工作存储器。 使用/工作IDG.flow函数的方式是,首先创建IDG对象的实例,然后调用flow函数,该函数创建并返回一个NumpyArrayIterator,其中包含对IDG对象的引用。
一种解决方案是编写自定义的DataGenerator,该自定义的DataGenerator继承自keras.preprocessing.image.Iterator
类并实现_get_batches_of_transformed_samples
(请参见here)。
然后,扩展IDG类并编写一个flow_from_generator
函数,该函数返回自定义DataGenerator的实例。
这听起来比实际要麻烦得多,但请务必熟悉IDG,NumpyArrayIterator和Iterator代码。
这是下面的样子:
class DataGenerator(keras.preprocessing.image.Iterator):
def__init__(self, image_data_generator, *args, **kwargs):
#init whatever you need
self.image_data_generator = image_data_generator
#call Iterator constructor:
super(DataGenerator, self).__init__(number_of_datapoints, batch_size, shuffle, shuffle_seed)
def _get_batches_of_transformed_samples(self, index_array):
''' Here you retrieve the images and apply the image augmentation,
then return the augmented image batch.
index_array is just a list that takes care of the shuffling for you (see super class),
so this function is going to be called with index_array=[1, 6, 8]
if your batch size is 3
'''
x_transformed = np.zeros((batch_size, x_img_size, y_img_size, input_channel_num), dtype_float32)
y_transformed = np.zeros((batch_size, x_img_size, y_img_size, output_channel_num), dtype_float32)
for i, j in enumerate(index_array):
x = get_input_image_from_index(j)
y = get_output_image_from_index(j)
params = self.image_data_generator.get_random_transform(self.img_shape)
x = self.image_data_generator.apply_transform(x, params)
x = self.image_data_generator.standardize(x)
x_transformed[i] = x
y = self.image_data_generator.apply_transform(y, params)
y = self.image_data_generator.standardize(y)
y_transformed[i] = y
return(x_transformed, y_transformed)
class ImageDataGeneratorExtended(keras.preprocessing.image.ImageDataGenerator):
def flow_from_generator:(self, *args, **kwargs):
return DataGenerator(self, *args, **kwargs)
好的,我希望能有所帮助。我已经使用了我自己的上述代码版本,但尚未完全测试(尽管现在对我有用),因此请带着一点盐:P
对于* .hdr问题:您似乎可以使用ImageIO 包(它是supports HDR和DICOM格式,尽管我从未亲自使用过该库)。