【问题标题】:Handle invalid/corrupted image files in ImageDataGenerator.flow_from_directory in Keras在 Keras 的 ImageDataGenerator.flow_from_directory 中处理无效/损坏的图像文件
【发布时间】:2018-09-20 21:10:39
【问题描述】:

我将 Python 与 Keras 一起使用并运行 ImageDataGenerator 并使用 flow_from_directory。我有一些有问题的图像文件,我可以使用数据生成器来处理读取错误吗?

我在一小部分图像上得到了一些“无效的 jpg 文件”,我希望在不让我的代码崩溃的情况下处理这个问题。

【问题讨论】:

    标签: python image machine-learning keras deep-learning


    【解决方案1】:

    嗯,一种解决方案是修改ImageDataGenerator代码,并在其中放入错误处理机制(即try/except)。

    但是,一种替代方法是将您的生成器包装在另一个生成器中并在那里使用 try/except。此解决方案的缺点是,即使该批次中的一个图像已损坏,它也会丢弃整个生成的批次(这可能意味着某些样本可能根本不用于训练):

    data_gen = ImageDataGenerator(...)
    
    train_gen = data_gen.flow_from_directory(...)
    
    def my_gen(gen):
        while True:
            try:
                data, labels = next(gen)
                yield data, labels
            except:
                pass
    
    # ... define your model and compile it
    
    # fit the model
    model.fit_generator(my_gen(train_gen), ...)
    

    此解决方案的另一个缺点是,由于您需要指定生成器的步骤数(即steps_per_epoch),并考虑到一个批次可能在一个步骤中被丢弃,而在同一步骤中取而代之的是一个新批次,您最终可能会在一个时期内对某些样本进行多次训练。这可能会或可能不会有显着影响,具体取决于有多少批次包含损坏的图像(即,如果有几个,那么没有什么可担心的)。

    最后,请注意,您可能希望使用较新的 Keras 数据生成器,即 Sequence 类在每批中的 __getitem__ 方法中一张一张地读取图像并丢弃损坏的图像。但是,前一种方法的问题,即对某些图像进行多次训练,这种方法仍然存在,因为您还需要实现 __len__ 方法,它本质上等同于 steps_per_epoch 参数。虽然在我看来,这种方法(即子类化Sequence 类)优于上述方法(当然,如果你抛开可能需要编写更多代码的事实)并且副作用更少(因为你可以丢弃单个图像而不是整个批次)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多