如何识别带有“可能损坏的 EXIF 数据”的图像

新手上路,请多包涵

我正在进行图像分类 Kaggle 竞赛,并从 Kaggle.com 下载一些训练图像。然后我在 Keras 2.0 和 Tensorflow 作为背景(和 Python 3)中使用 ResNet50 的迁移学习来处理这些图像。

但是,总共 1281 个火车图像中有 258 个具有“可能损坏的 EXIF 数据”,并且在加载到 ResNet 模型时被忽略,很可能是由于 Pillow 问题

输出消息如下:

 /home/shi/anaconda3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data.  Expecting to read 524288 bytes but only got 0. Skipping tag 3
  "Skipping tag %s" % (size, len(data), tag))
/home/shi/anaconda3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data.  Expecting to read 393216 bytes but only got 0. Skipping tag 3
  "Skipping tag %s" % (size, len(data), tag))
/home/shi/anaconda3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data.  Expecting to read 33554432 bytes but only got 0. Skipping tag 4
  "Skipping tag %s" % (size, len(data), tag))
/home/shi/anaconda3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data.  Expecting to read 25165824 bytes but only got 0. Skipping tag 4
  "Skipping tag %s" % (size, len(data), tag))
/home/shi/anaconda3/lib/python3.6/site-packages/PIL/TiffImagePlugin.py:692: UserWarning: Possibly corrupt EXIF data.  Expecting to read 131072 bytes but only got 0. Skipping tag 3
  "Skipping tag %s" % (size, len(data), tag))
(more to come ...)

根据输出消息,我只知道它们在那里,但不知道它们是哪些……

我的问题是:如何识别这 258 张图像,以便我可以手动将它们从数据集中删除?

原文由 user3768495 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

想到的最简单的方法是修改代码以一次处理一张图像,然后遍历每张图像并检查哪一张生成警告。

原文由 Salvador Dali 发布,翻译遵循 CC BY-SA 3.0 许可协议

编辑:要将警告作为您可以捕获的错误提出,请查看下面的 Justas 评论。


即使这个问题已经存在一年多了,我还是想展示我的解决方案,因为我遇到了同样的问题。

我正在编辑错误消息。输出显示在系统上的何处可以找到该文件以及行号。例如我改变了以下内容:

 if len(data) != size:
    warnings.warn("Possibly corrupt EXIF data.  "
                  "Expecting to read %d bytes but only got %d."
                  " Skipping tag %s" % (size, len(data), tag))
    continue

if len(data) != size:
    raise ValueError('Corrupt Exif data')
    warnings.warn("Possibly corrupt EXIF data.  "
                  "Expecting to read %d bytes but only got %d."
                  " Skipping tag %s" % (size, len(data), tag))
    continue

我捕获 ValueError 的代码如下所示。该代码为您提供了 PIL 被中断并且不显示无用消息的优势。您也可以捕获并使用它,例如通过“except”部分删除相应的文件。

 import os
from PIL import Image

imageFolder = /Path/To/Image/Folder
listImages = os.listdir(imageFolder)

for img in listImages:
    imgPath = os.path.join(imageFolder,img)

    try:
        img = Image.open(imgPath)
        exif_data = img._getexif()
    except ValueError as err:
        print(err)
        print("Error on image: ", img)

我知道添加 ValueError 部分既快又脏,但总比面对所有无用的警告消息要好。

原文由 Clown77 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进