【问题标题】:Tensorflow DecodeJPEG: Expected image (JPEG, PNG, or GIF), got unknown format starting with '\000\000\000\000\000\000\000\00'Tensorflow DecodeJPEG:预期的图像(JPEG、PNG 或 GIF),格式未知,以 '\000\000\000\000\000\000\000\00' 开头
【发布时间】:2020-10-14 02:11:41
【问题描述】:

我在一个图像文件夹中循环,这种情况一直在发生。

tensorflow.python.framework.errors_impl.InvalidArgumentError:预期的图像(JPEG、PNG 或 GIF),格式未知,以 '\000\000\000\000\000\000\000\000\000\000 开头\000\000\000\000\000\000' [[{{node DecodeJpeg}}]]

此文件夹中有不是图像的文件,但它们应该被我的上一步过滤掉。有人知道发生了什么吗?

test_files_ds = tf.data.Dataset.list_files(myFolder + '/*.jpg') 

AUTOTUNE = tf.data.experimental.AUTOTUNE


def process_unlabeled_img(file_path):
    img = tf.io.read_file(file_path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.float32)
    img = tf.image.resize(images=img, size=(224, 224))
    return file_path, img

【问题讨论】:

标签: python tensorflow keras


【解决方案1】:

如果没有手头的文件,很难确切知道发生了什么,但这里可能发生的情况是,您的数据集中的文件具有 .jpg.jpeg.png 或 @ 987654324@ 扩展名,但实际上不是 JPEG、PNG 的 GIF 图像。因此,TensorFlow 无法正确加载它们。

解决此问题的一种方法是检查您的文件是否属于图像,并删除那些不是实际 JPEG、PNG 或 GIF 图像的文件。

检查文件是否为 有效 JPEG、PNG 或 GIF 图像肯定比看起来要复杂,但检查文件签名/幻数(即您的文件的前几个字节)文件)是一个好的开始,应该可以在大多数情况下解决您的问题。

因此,实际上,您可以通过多种不同的方式来执行此操作,其中一种方法是单独检查每张图片是否有效,并使用此类功能:

def is_image(filename, verbose=False):

    data = open(filename,'rb').read(10)

    # check if file is JPG or JPEG
    if data[:3] == b'\xff\xd8\xff':
        if verbose == True:
             print(filename+" is: JPG/JPEG.")
        return True

    # check if file is PNG
    if data[:8] == b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a':
        if verbose == True:
             print(filename+" is: PNG.")
        return True

    # check if file is GIF
    if data[:6] in [b'\x47\x49\x46\x38\x37\x61', b'\x47\x49\x46\x38\x39\x61']:
        if verbose == True:
             print(filename+" is: GIF.")
        return True

    return False

然后您就可以通过执行以下操作摆脱您的无效图片(这将删除您的无效图片):

import os

# go through all files in desired folder
for filename in os.listdir(folder):
     # check if file is actually an image file
     if is_image(filename, verbose=False) == False:
          # if the file is not valid, remove it
          os.remove(os. path. join(folder, filename))

现在,正如我所说,这可能会解决您的问题,但请注意,is_image 函数将能够确定文件是否可以读取为 JPG 、JPEG、PNG 或 GIF 图像。它只是一种快速而肮脏的解决方案,可以消除绝大多数错误,但不是全部。

【讨论】:

  • 这看起来很有希望。有机会我会去看看的。
  • 你不会碰巧知道这是什么:Invalid argument: Invalid JPEG data or crop window, data size 103077?
  • 好吧,我想说这是另一种类型的数据损坏。我建议您尝试确定错误源自哪个文件,以便更好地了解问题出在哪里,以及最有可能的是所谓的 JPEG 文件是如何损坏的!
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多