首页 > 解决方案 > tf.image.decode_jpeg 经常需要永远加载文件

问题描述

以下代码是我的 tf 图读取图像代码的一部分。tf.io.read_file(path)当我使用此代码遍历数据时,程序在几百张图像之后永远卡住并且什么也不做。更具体地说,代码甚至无法暂停,我每次都必须重新启动会话。

@tf.function()
def read_image(path):
  image = tf.io.read_file(path)
  image = tf.image.decode_jpeg(image)
  return image

...

div8k_list=[os.path.join(div8k_save_path, x) for x in os.listdir(div8k_save_path)]
train_path = tf.data.Dataset.from_tensor_slices(div8k_list)

train_images = train_path.map(read_image, num_parallel_calls=tf.data.AUTOTUNE)

我首先怀疑数据中有一些损坏的图像或错误的路径导致了这个问题,并测试了以下代码。

for path in train_path:
  print(path)
  
  image = tf.io.read_file(path)
  image = tf.image.decode_jpeg(image)

令人惊讶的是,循环卡住的图像路径没有共同特征。这不是图像的问题,因为循环曾经卡住1056.png但是当我明确加载时1056.png,没有问题。

这个问题的原因可能是什么?

编辑:总而言之,程序read_image永远卡在了,而我在数据集中找不到问题。

我的数据集是 DIV8K 数据集,我在 COLAB 中运行。

编辑使我的代码变慢的功能是decode_jpeg,因为以下定义read_image多次工作。

@tf.function()
def read_image(path):
  image = tf.io.read_file(path)
  image = tf.image.decode_jpeg(image)
  return image

标签: pythontensorflowkeras

解决方案


如评论中所述,请尝试以下功能来解码图像文件,因为它可以处理混合扩展文件格式(jpgpngref

tf.io.decode_image(image, expand_animations = False)

但是,现在decode_jpeg应该也可以处理.png文件格式了。如果没有图像文件,很难分解导致这种情况发生的原因。很可能该文件以某种方式损坏或不是 的有效扩展名decode_jpeg,尽管它是这样命名的,但请检查解决方案。


推荐阅读