【问题标题】:How can I use ImageDataGenerator class to generate either train and label as image for a keras model?如何使用 ImageDataGenerator 类生成训练和标签作为 keras 模型的图像?
【发布时间】:2019-07-05 00:11:21
【问题描述】:

我想训练一个模型来使用 Keras 生成新图像,我会使用 ImageDataGenerator 类来生成批量图像。

问题是我找不到使用此类生成训练和标签批次作为图像的方法。我想将一些图像作为训练图像和一些其他图像的标签传递给模型。

此外,我需要从硬盘驱动器读取每批图像,因为数据集太大而无法加载到内存中。

还可以使用 ImageDataGenerator 方法的替代方法。

我希望问题很清楚,希望您能帮助我。

【问题讨论】:

  • 欢迎来到 StackOverflow。你能提供更多细节吗?也许添加一些代码,以便我们可以了解您到目前为止所尝试的内容。即使是错误消息也会很有帮助。

标签: python image-processing keras generator


【解决方案1】:

您可以将ImageDataGenerator 类与您喜欢的任何类型的标签一起使用,也可以是图像,它们只是多维数组。这是一个使用虚拟 numpy 图像的示例:

from keras.preprocessing.image import ImageDataGenerator
import numpy as np

# Create fake images
n, width, height = 1000, 28, 28
images_data = np.random.randint(low=0, high=256, size=(n, height, width, 3))
images_labels = np.random.randint(low=0, high=256, size=(n, height, width, 3))

image_gen = ImageDataGenerator()
batch_size = 100
batch_gen = image_gen.flow(images_data, images_labels, batch_size=batch_size)

然后,您可以将batch_gen 传递给fit_generator,例如,它将产生(images_data, images_labels) 的元组,两者都具有(batch_size, height, width, 3) 的形状。您可以通过以下方式进行检查:

batch = batch_gen.next()
print(len(batch))
print(batch[0].shape)
print(batch[1].shape)

如果您的数据集不适合内存并存储为文件,您也可以使用flow_from_directory。 Keras 官方文档中有examples

如果您编写自己的批处理生成器函数,您还可以在生成批处理之前对它们进行一些操作:

def _generate_batches(image_gen, images_data, images_labels, batch_size):
    for batch in image_gen.flow(images_data, images_labels,
                                batch_size=batch_size):
        # Here you can do whatever you like to your batch
        yield (batch[0], batch[1])

最后,如果您需要 ImageDataGenerator 的特定功能,您可以随时构建您的自定义 ImageDataGenerator 类:

class ImageDataGeneratorCustom(ImageDataGenerator): 
...

特别是,您可能想要覆盖flow() 函数,甚至构建自定义Iterator

【讨论】:

  • 这可能是做我需要的最好的方法,但它首先假设图像数据加载到内存中,images_data 和 images_labels 是 numpy 数组。我需要在运行时分批加载从硬盘读取的图像,所以@xashru 答案here 可能适合这部分,但我希望它更容易。对不起,我是 python 和 keras 代码的初学者。谢谢。
  • 此外,如果不清楚,如果有给定路径的东西会在路径中生成一批图像,那将是完美的。类似于 flow_from_directory 方法的东西,但它让我可以指定标签。
  • 我的回答解决了您问题的标题“如何使用 ImageDataGenerator 类为 keras 模型生成训练和标签作为图像?”数据集不适合内存的问题是另一回事,我建议一次问一个问题。也就是说,我提出的解决方案并不假定图像已加载到内存中。这是为了说明和便于复制和粘贴以测试代码。您可以使用ImageDataGenerator 中的flow_from_directory 直接从磁盘生成批次。我已经编辑了我的答案以明确说明。
【解决方案2】:

您可以构建您的自定义数据生成器类。这个链接应该很有帮助data generators with Keras。您可以将图像标签存储在一个大的 csv 文件中,然后根据需要在每批中加载所需的图像。

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2018-01-30
    相关资源
    最近更新 更多