大きなデータ セットには破損したイメージが含まれています OSError: イメージ ファイルが切り詰められており、PIL.UnidentifiedImageError: イメージ ファイルの解決策を識別できません

破損したイメージとエラー メッセージを含む大規模なデータ セットの解決策 OSError: イメージ ファイルが切り詰められており、PIL.UnidentifiedImageError: イメージ ファイルを識別できません

プロジェクトのシナリオ:

深層学習ネットワーク モデルをトレーニングする場合、使用される大規模な画像データ セット (10,000 レベル、100,000 レベル、100 万レベルなど) には破損した画像が含まれており、最初の反復の数時間後、データ セットの読み込みの問題や突然の中断により、非常に時間がかかります。発生した問題のトラブルシューティングと解決には、次の方法を使用できます。参考になれば幸いです~


問題 1 OSError: 画像ファイルが切り詰められています 原因分析と解決策

报错问题:OSError: image file is truncated

原因分析: Python が PIL を使用して画像を処理する場合、不可解なデータ操作によって画像データに小さな問題が発生することがあります。後で画像データを使用すると、このエラー OSError: image file is truncated が表示されます。画像データには独自の基本形式があり、ff d8 で始まり ff d9 で終わるバイナリ データの文字列です。「OSError: image file is truncated」というエラーが報告される場合、ほとんどの場合、末尾が切り詰められています。つまり、末尾の ff d9 が欠落しており、識別ポイントが欠落しており、エラーが報告されます。

解決策は 2 つあります。

方法 1: 破損したデータを破棄します。コードの先頭にコンテンツを追加するだけです。このようにして、切り詰められたデータを含むピクチャに遭遇した場合、PIL は直接中断して関数を抜け出し、エラーを報告せずに次のステップに進みます。

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

方法 2: データを完成させて再度使用します。場合によっては、破損したデータが大量にあり、データ損失のコストが高すぎ、切り捨て部分の影響がほとんどない場合は、データを完成させてデータの後に ff d9 を追加することを検討できます。コードは次のとおりです。独自のデータセットに対してそれを走査するだけです。

from PIL import Image
from io import BytesIO
ori_img='001.jpg'
with open(ori_img, 'rb') as f:
    # 二进制读取
    f = f.read()

# 补全数据的
f = f + B'\xff' + B'\xd9'

img = Image.open(BytesIO(f))
if img.mode != "RGB":
    img = im.convert('RGB')

問題 2 PIL.UnidentifiedImageError: 画像ファイルを識別できません 原因分析と解決策

报错问题:‘PIL.UnidentifiedImageError: cannot identify image file ‘001.jpg’

原因分析: オペレーティング システムが指定されたタスク (ファイルを開くなど) を実行できない場合に発生します。ここでエラー画像をダブルクリックしても開きません。これらの写真は削除できます。

私のプロジェクトでは、モデルのトレーニングに使用されるデータ セットは 100,000 レベルです。データ セットのプロバイダーから、開けない写真が数十枚あると連絡がありました。データ セットの txt ディレクトリは初期段階で生成されているため、簡単なトラバーサルが必要です開けない画像やディレクトリの行数を出力し、手動で削除してください。コードは以下のように表示されます。

from PIL import Image

txt_path = '/home/yy/dataset/train.txt'
fh = open(txt_path, 'r')
i = 0 
for line in fh:
	i += 1
	line = line.rstrip()
	words = line.split()
	img = words[0]
	try:
		flag = Image.open(img)
	except Exception as e:
		print(img, i)

このエラーは PIL ライブラリに問題がある可能性もあるため、自分で確認する必要があります。開けない画像ファイルが多数ある場合は、コード内で直接画像を削除できます。次のブログ投稿を参照してください。

Python が PIL 経由でイメージを読み取ると、次のエラーが報告されます: OSError: イメージ ファイルを識別できません


その他の参考文献:

最初のエラー「OSError: image file is truncated」については 2 つのブログ投稿があり、詳細な分析と解決策が記載されていますので、ご参照ください~

Python プログラム
OSError: image file is truncated の PIL 画像「画像ファイルが切り詰められています」問題の分析と解決策のアイデアと解決策。

おすすめ

転載: blog.csdn.net/qq_39691492/article/details/124468857