Tensorflow Keras 错误:未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一

Posted

技术标签:

【中文标题】Tensorflow Keras 错误:未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一【英文标题】:Tensorflow Keras error: Unknown image file format. One of JPEG, PNG, GIF, BMP required 【发布时间】:2021-04-02 21:30:03 【问题描述】:

我正在训练一个分类器,我确保所有图片都是 jpg,但仍然会发生此错误: InvalidArgumentError:未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一。 [[node decode_image/DecodeImage]] [[IteratorGetNext]] [Op:__inference_train_function_1481]

我尝试在较小的数据集上进行训练,而且它们都是 jpg 并且没有问题

这是代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras

dataset = keras.preprocessing.image_dataset_from_directory(
  '/content/drive/MyDrive/fi_dataset/train', batch_size=64, image_size=(200, 200))

dense = keras.layers.Dense(units=16)
inputs = keras.Input(shape=(None, None, 3))

from tensorflow.keras import layers

x = CenterCrop(height=150, width=150)(inputs)
x = Rescaling(scale=1.0 / 255)(x)

x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)
x = layers.MaxPooling2D(pool_size=(3, 3))(x)
x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)

x = layers.GlobalAveragePooling2D()(x)

num_classes = 1
outputs = layers.Dense(num_classes, activation="sigmoid")(x)

model = keras.Model(inputs=inputs, outputs=outputs)

data = np.random.randint(0, 256, size=(64, 200, 200, 3)).astype("float32")
processed_data = model(data)

model.compile(optimizer='adam',
              loss='binary_crossentropy',
               metrics=[keras.metrics.binary_accuracy],)

history=model.fit(dataset, epochs=10)

【问题讨论】:

【参考方案1】:

实际上它可能有一个扩展名 jpg 但在说 tiff 格式。为了更进一步,您可以添加一些代码...

如果您想检查图像类型,而不是扩展名,请尝试上面的代码修改版本:

import os
import cv2
import imghdr

def check_images( s_dir, ext_list):
    bad_images=[]
    bad_ext=[]
    s_list= os.listdir(s_dir)
    for klass in s_list:
        klass_path=os.path.join (s_dir, klass)
        print ('processing class directory ', klass)
        if os.path.isdir(klass_path):
            file_list=os.listdir(klass_path)
            for f in file_list:               
                f_path=os.path.join (klass_path,f)
                tip = imghdr.what(f_path)
                if ext_list.count(tip) == 0:
                  bad_images.append(f_path)
                if os.path.isfile(f_path):
                    try:
                        img=cv2.imread(f_path)
                        shape=img.shape
                    except:
                        print('file ', f_path, ' is not a valid image file')
                        bad_images.append(f_path)
                else:
                    print('*** fatal error, you a sub directory ', f, ' in class directory ', klass)
        else:
            print ('*** WARNING*** you have files in ', s_dir, ' it should only contain sub directories')
    return bad_images, bad_ext

source_dir =r'c:\temp\people\storage'
good_exts=['jpg', 'png', 'jpeg', 'gif', 'bmp' ] # list of acceptable extensions
bad_file_list, bad_ext_list=check_images(source_dir, good_exts)
if len(bad_file_list) !=0:
    print('improper image files are listed below')
    for i in range (len(bad_file_list)):
        print (bad_file_list[i])
else:
    print(' no improper image files were found')

Python 的标准库中有许多模块,其中一个有帮助的是 imghdr。它使您可以识别文件、字节流或类似路径的对象中包含的图像类型。 imghdr 可以识别以下图像类型:rgbgifpbmpgmppm、tiffrastxbmjpeg / jpgbmppngwebpexr

【讨论】:

非常感谢,这个库(imghdr)运行良好【参考方案2】:

当您说您确定它们是 jpg 时,您是如何验证的?仅仅因为扩展名是 .jpg 并不意味着该文件是真正的 jpg 图像。我建议你运行下面的代码,看看哪个图像可能有缺陷。

import os
import cv2
def check_images( s_dir, ext_list):
    bad_images=[]
    bad_ext=[]
    s_list= os.listdir(s_dir)
    for klass in s_list:
        klass_path=os.path.join (s_dir, klass)
        print ('processing class directory ', klass)
        if os.path.isdir(klass_path):
            file_list=os.listdir(klass_path)
            for f in file_list:               
                f_path=os.path.join (klass_path,f)
                index=f.rfind('.')
                ext=f[index+1:].lower()
                if ext not in ext_list:
                    print('file ', f_path, ' has an invalid extension ', ext)
                    bad_ext.append(f_path)
                if os.path.isfile(f_path):
                    try:
                        img=cv2.imread(f_path)
                        shape=img.shape
                    except:
                        print('file ', f_path, ' is not a valid image file')
                        bad_images.append(f_path)
                else:
                    print('*** fatal error, you a sub directory ', f, ' in class directory ', klass)
        else:
            print ('*** WARNING*** you have files in ', s_dir, ' it should only contain sub directories')
    return bad_images, bad_ext

source_dir =r'c:\temp\people\storage'
good_exts=['jpg', 'png', 'jpeg', 'gif', 'bmp' ] # list of acceptable extensions
bad_file_list, bad_ext_list=check_images(source_dir, good_exts)
if len(bad_file_list) !=0:
    print('improper image files are listed below')
    for i in range (len(bad_file_list)):
        print (bad_file_list[i])
else:
    print(' no improper image files were found')

即使这样可能还不够,因为它会检查文件的扩展名。 实际上它可能有一个扩展名 jpg,但它是 tiff 格式。 为了更进一步,您可以添加一些代码,如果扩展名不在 您可以读取图像的良好扩展名列表,如果它有效,请使用 cv2 将其转换为 jpg,然后将其写回文件。

【讨论】:

谢谢你的代码,但我运行了它,它说没有找到不正确的图像文件,可能是什么问题 我使用此代码转换图像格式并解决了问题再次感谢您! from PIL import Image img = Image.open('error p/norm418.jpg') img.save('error p/norm418.jpeg') 太棒了!谢谢。我在处理 ~1500 JPG 时遇到了问题,得到了同样的错误。戳各种 JPG,没有一个看起来很糟糕。原来我没有手动检查足够近。但是,运行您的代码发现文件以某种方式损坏。再次感谢。

以上是关于Tensorflow Keras 错误:未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 2.0 Keras:如何为 TensorBoard 编写图像摘要

TensorFlow 2.0 Keras:如何为TensorBoard编写图像摘要

keras/tensorflow中语义图像分割的多类加权损失

keras和tensorflow猫狗图像分类

深度学习keras + tensorflow 实现猫和狗图像分类

保存和加载图像生成器 (Tensorflow Keras)