我正在用改良的U-网做二维脑分割。
我想知道是否有人能提供/指出一个链接,说明如何在Keras中使用ImageDataGenerator()函数来处理一堆医学图像。目前,我所做的是将每个切片转换为.tiff格式(包括图像及其对应的掩码),并将它们放入不同的文件夹(例如训练、有效、测试)。这对我来说很好。
然而,我不想一直把每个切片从每一个磁共振量转换为.tiff图像(将有数千个核磁共振成像卷)。如果我能从每一卷图像和掩码中读取所有内容,那就太好了。
在使用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非常感谢各位
发布于 2019-08-03 13:35:11
好的,我也有一个类似的问题(虽然我没有处理医学图像),并且找到了一个解决方案,所以我希望其他人也能发现它的用处。
因此,由于1)您将需要与IDG一起使用生成器函数,唯一的问题是ImageDataGenerator不支持自定义生成器。
实际上,在某些情况下,您可以在fit_generator函数中使用IDG : IDG 流函数返回NumpyArrayIterator类型的Iterator。您不能使用这个,因为它需要数据才能适应工作内存。使用/工作IDG.flow函数的方式是,首先创建IDG对象的实例,然后调用flow函数,该函数创建并返回包含对IDG对象的引用的NumpyArrayIterator。
现在,一个解决方案是编写自定义DataGenerator,它继承了keras.preprocessing.image.Iterator类并实现了_get_batches_of_transformed_samples (参见这里)。然后扩展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包(它使用支座和DICOM格式,尽管我个人从未使用过该库)。
https://stackoverflow.com/questions/57278365
复制相似问题