首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对医学图像使用ImageDataGenerator()

对医学图像使用ImageDataGenerator()
EN

Stack Overflow用户
提问于 2019-07-30 18:55:40
回答 1查看 1.5K关注 0票数 0

我正在用改良的U-网做二维脑分割。

我想知道是否有人能提供/指出一个链接,说明如何在Keras中使用ImageDataGenerator()函数来处理一堆医学图像。目前,我所做的是将每个切片转换为.tiff格式(包括图像及其对应的掩码),并将它们放入不同的文件夹(例如训练、有效、测试)。这对我来说很好。

然而,我不想一直把每个切片从每一个磁共振量转换为.tiff图像(将有数千个核磁共振成像卷)。如果我能从每一卷图像和掩码中读取所有内容,那就太好了。

在使用ImageDataGenerator()函数时,我发现的所有示例都是文件夹(例如,列车),其中包含单独的图像。

我的图像数据在.img和.hdr中(每个卷有64片)。.img和.hdr中也有相应的掩码。

所以我的数据文件夹是这样的:

代码语言:javascript
复制
--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

非常感谢各位

EN

回答 1

Stack Overflow用户

发布于 2019-08-03 13:35:11

好的,我也有一个类似的问题(虽然我没有处理医学图像),并且找到了一个解决方案,所以我希望其他人也能发现它的用处。

  1. 我假设您需要一个自定义函数来批量检索图像,因为它们不能同时放入内存中,因为不支持*.hdr文件格式,而且现有的keras函数不使用回归。(如果你使用的是u-net,我猜你在做某种类型的分割?)
  2. 我还假设您需要ImageDataGenerator,因为您不希望自己实现数据增强。

因此,由于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代码。

如下所示:

代码语言:javascript
复制
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格式,尽管我个人从未使用过该库)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57278365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档