使用ImageDataGenerator()获得医学图像

时间:2019-07-30 18:55:40

标签: python-3.x keras deep-learning conv-neural-network

我正在使用改良的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

非常感谢提前

1 个答案:

答案 0 :(得分:0)

好的,我有一个类似的问题(尽管我不使用医学图像),并且找到了解决方案,所以希望其他人也能找到有用的方法。

  1. 我假设您需要一个自定义函数来批量检索图像,因为它们不能一次全部放入内存中,因为不支持* .hdr文件格式,并且现有的keras helper函数不支持不要使用回归。 (如果您使用的是u-net,我想您正在进行某种类型的细分?)
  2. 我还假设您需要ImageDataGenerator,因为您不想自己实现数据扩充。

因此,由于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格式,尽管我从未亲自使用过该库)。