python - Tensorflow DecodeJPEG : Expected image (JPEG, PNG 或 GIF),以 '\000\000\000\000\000\000\000\00' 开头的格式未知

标签 python tensorflow keras

我正在循环浏览图像文件夹,这种情况一直在发生。

tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected image (JPEG, PNG, or GIF), got unknown format starting with '\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

最佳答案

如果手头没有文件,很难确切知道发生了什么,但这里可能发生的情况是,您的数据集中的文件具有 .jpg.jpeg.png.gif 扩展名,但实际上不是 JPEG、PNG GIF 图像。因此,TensorFlow 无法正确加载它们。
解决这个问题的一种方法是检查你的文件,这些文件应该是图像,并删除那些不是实际的 JPEG、PNG 或 GIF 图像的文件。
检查文件是否为有效的 JPEG、PNG 或 GIF 图像肯定比看起来更复杂,但检查文件签名/魔数(Magic Number)(即文件的前几个字节)是一个好的开始,并且应该大部分时间解决你的问题。
因此,实际上,您可以通过多种不同的方式来执行此操作,其中一种方法是单独检查每张图片是否有效,并具有以下功能:

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 图像读取。这只是一个快速而肮脏的解决方案,可以消除绝大多数错误,但不是全部。

关于python - Tensorflow DecodeJPEG : Expected image (JPEG, PNG 或 GIF),以 '\000\000\000\000\000\000\000\00' 开头的格式未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62544528/

相关文章:

python - 为什么我在 Keras 中使用 multi_gpu_model 的训练速度比单 gpu 差?

tensorflow - 仅使用错误/损失指标进行训练时是否会产生负面影响?

tensorflow - 如何在 tensorflow 的 MLP 中实现最大范数约束?

Python SocketServer 通过线程本地存储将数据传递到主线程

python - pandas.to_sql 基于 'unique id' 用新数据替换旧数据

tensorflow - 如何在Tensorboard中更改功能图的颜色?

python - 如何在keras层中使用SVD?

python - 计算二维数组中出现的次数

python - 使用正则表达式检查并保存电话号码

python - 简单的 Tensorflow 架构而不是训练