【问题标题】: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 类)优于上述方法(当然,如果你抛开可能需要编写更多代码的事实)并且副作用更少(因为你可以丢弃单个图像而不是整个批次)。