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

the*_*ter 5 python image machine-learning deep-learning keras

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

我在一小部分图像上收到了一些“无效的 jpg 文件”,并希望在没有我的代码崩溃的情况下处理它。

tod*_*day 8

那么,一种解决方案是修改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), ...)
Run Code Online (Sandbox Code Playgroud)

该解决方案的另一个缺点是,因为你需要指定的发电机(即步数steps_per_epoch),并考虑到一批可能在一个步骤中扔掉了新一批被取出相反在同一步骤中,你可能最终培训在一个时期内对某些样本不止一次。这可能会或可能不会产生显着影响,具体取决于包含损坏图像的批次数量(即,如果有几个批次,则无需担心那么多)。

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