如何在ImageDataGenerator中修改flow_from_directory或preprocessing_function?

时间:2019-07-10 14:12:49

标签: python numpy tensorflow image-processing keras

根据keras文档:

preprocessing_function:每个输入将隐含的函数。该功能将在调整图像大小和扩大后运行。该函数应采用一个参数:一张图像(秩为3的Numpy张量),并输出具有相同形状的Numpy张量。

我的numpy张量为5级,因为我的输入图像具有3个维度(高度,宽度,深度)。

from keras.preprocessing.image import ImageDataGenerator
label_datagen = ImageDataGenerator()

train_label_generator = label_datagen.flow_from_directory(
    directory="some_directory",
    target_size=(32, 32, 32),
    color_mode='grayscale',
    class_mode=None,
    batch_size=4)

当我检查第一批时,我得到了5D numpy张量:

first_item = train_image_generator.__getitem__(0)

>>>print('first_item.shape')
(4, 32, 32, 32, 1)

现在我首先要对每个输入图像进行简单的操作,我还要通过打印来检查输入形状:

def some_function(arr):
    print(arr.shape)
    arr += 1
    return arr

在这里,我将此函数添加到ImageDataGenerator中:

label_datagen = FixedImageDataGenerator(preprocessing_function=some_function)

这就是我得到的输入形状

(32, 32, 1)

这意味着它实际上仅限于等级3。您知道如何修改它,以使输入形状为(32, 32, 32)吗?

我的目标是对ImageDataGenerator中的每个输入使用to_categorical函数。我不能在进行语义分割(不是图像分类)时简单地说class_mode="categorical"。我知道我可以为此目的为生成器编写一些自定义代码,但是我想知道修改keras ImageDataGenerator是否困难。

2 个答案:

答案 0 :(得分:1)

ImageDataGenerator是图片的generator

这意味着,要使其正常工作,您的数据应为具有1(灰度)或3通道(rgb)的图像。我认为这不适用于您的4-D图像(除非深度等于1或3)。

答案 1 :(得分:1)

您可以像平常一样使用ImageDataGenerator,但是在最后一步,不要传递preprocessing_function,而是将生成器包装在自己的生成器中。这样,您就可以完全控制预处理功能。这意味着其输出不再必须具有与输入相同的形状。请注意,此包装器函数将批量获取数据,而不是单个图像。

例如:

def preprocess(generator):
  for batch in generator:
    yield batch[:,1:-1,1:-1] # example: crop 1 px of each border

现在改为使用preprocess(label_datagen)。我希望您可以使用它来规避限制。