![](/img/trans.png)
[英]Use keras ImageDataGenerator.flow_from_directory() with Talos Scan()
[英]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.