簡體   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