python - Tensorflow DecodeJPEG:预期的图像(JPEG、PNG 或 GIF),格式未知,以 '\000\000\000\000\000\000\000\00' 开头
问题描述
我正在循环浏览一个图像文件夹,这种情况一直在发生。
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
解决方案
如果没有手头的文件,很难确切知道发生了什么,但这里可能发生的情况是,您的数据集中的文件具有.jpg
、或扩展名.jpeg
,但实际上不是 JPEG、PNG 的 GIF 图像。因此,TensorFlow 无法正确加载它们。.png
.gif
解决此问题的一种方法是检查您的文件,这些文件应该是图像,并删除那些不是实际 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 图像。它只是一个快速而肮脏的解决方案,可以消除绝大多数错误,但不是全部。
推荐阅读
- python - 我无法发送消息
- r - 如何修改多级嵌套 R 列表中的元素?
- apache - 从 HTTP 基本身份验证中排除特定 URL - mod_rewrite 导致问题
- next.js - 使用 WebAuth 和 nextjs-auth0 时响应中缺少 auth0 状态
- apache-spark - 我们如何强制数据帧重新分区在火花中平衡?
- react-native - 如何在 TextInput React Native 中键入时隐藏标签
- android-studio - 如何从列表视图播放音乐文件
- angular - 如何对 ngx-formly 进行单元测试?
- java - 为什么我看到一条消息,找不到名为生成测试的运行配置
- json - .Net 6 和 RenderFragment 中的 Blazor DynamicComponent