繁体   English   中英

处理Keras的ImageDataGenerator.flow_from_directory中的无效/损坏的图像文件

[英]Handle invalid/corrupted image files in ImageDataGenerator.flow_from_directory in Keras

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

我在图像的一小部分上得到一些“无效的jpg文件”,并且希望在不导致代码崩溃的情况下进行处理。

嗯,一种解决方案是修改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 ),并考虑到可能在一个步骤中丢弃一个批处理,而在同一步骤中steps_per_epoch一个新的批处理,因此您可能最终在某个时期不只一次对某些样本进行训练。 这可能会或可能不会产生重大影响,具体取决于有多少批次包含损坏的图像(即,如果有少量,则不必担心那么多)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM