【问题标题】:tf.image.decode_jpeg often taking forever to load filetf.image.decode_jpeg 经常需要永远加载文件
【发布时间】:2021-04-23 08:55:28
【问题描述】:

以下代码是我的 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 中运行。

EDIT 使我的代码变慢的函数是decode_jpeg,因为read_image 的以下定义多次工作。

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

【问题讨论】:

  • 我愿意分享我的 COLAB 环境,但不幸的是,数据在我的 Google Drive 帐户中并且太大(~50GB)。
  • 你能用tf.io.decode_image(image, expand_animations = False)代替tf.image.decode_jpeg吗?
  • @M.Innat 谢谢!我会试试看。多亏了你,我认为问题出在 tf.image.decode_jpeg
  • @M.Innat 非常感谢!你救了我的命!我仍然不明白为什么tf.image.decode_jpeg 有问题,而tf.io.decode_image 工作得很好。请发布答案,以便您获得赏金。

标签: python tensorflow keras


【解决方案1】:

正如评论中提到的,尝试以下函数来解码图像文件,因为它可以处理混合扩展文件格式(jpgpng 等)、ref

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

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

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多