【问题标题】:How to retrieve with and height of an image tensor returned by tf.image.decode_jpeg?如何检索 tf.image.decode_jpeg 返回的图像张量和高度?
【发布时间】:2019-10-26 16:04:38
【问题描述】:

我尝试设置一个图像管道,为用于裁剪图像的 Tensorflow 构建图像数据集。 我遵循了tutorial,但我想将文件裁剪为正方形,并且在不保留纵横比的情况下不调整大小。 我不知道如何获得它们的尺寸。

#
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
#

import glob


AUTOTUNE = tf.data.experimental.AUTOTUNE
IMAGE_SIZE = 192


def preprocess_image(path):
    img_raw = tf.io.read_file(path)
    img_tensor = tf.image.decode_jpeg(img_raw, channels=3)
    print("img_tensor")
    print(img_tensor)
    height = img_tensor.shape[0]
    print("height")
    print(height)
    return img_tensor


files_path = glob.glob('./images/*.jpeg')
image_count = len(files_path)
path_ds = tf.data.Dataset.from_tensor_slices(files_path)
path_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)

tf.image.decode_jpeg 返回的张量形状为:

Tensor("DecodeJpeg:0", shape=(None, None, 3), dtype=uint8)

如何获取 jpg 图像的大小?

当我以这种方式访问​​它时,它可以工作:

#
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
#

image = tf.io.read_file('./images/4c34476047bcbbfd10b1fd3342605659.jpeg/')
image = tf.image.decode_jpeg(image, channels=3)

print("image.shape")
print(image.shape)


打印出来:

image.shape
(700, 498, 3)

【问题讨论】:

  • 它仍然显示 (None,None,3) 你有什么想法吗/?

标签: python tensorflow


【解决方案1】:

您正面临这个问题,因为数据集是延迟加载的(仅在需要时进行评估)。

本质上,如果 tf 读取文件或者我们作为开发人员告诉它,它只能“知道”图像的大小。这似乎是一个显而易见的观点,但值得牢记。

因此,鉴于 tf Dataset 对象可以表示任意大的数据序列(事实上,以这种方式表示无限数据集是完全合理的),按照设计它不会预先读取文件。而是在我们的下游代码每次需要新示例或批处理时读取它们。

恐怕我们真的要知道图像的大小或预先针对所有可能的大小进行编码。

附:您可以使第二种方法起作用的原因是它正在急切地评估(单个)张量示例。

附言您可能已经知道您可以在执行时使用tf.shape()“评估”任何张量的形状(并在您的数据集预处理管道中使用此结果),但您无法检查在前面

【讨论】:

  • 很好的解释。谢谢 !由于我有一个相当大的数据集,我将在 Tensorflow 之外进行处理。再次感谢!
  • 不客气-我应该澄清一下....您仍然可以在 tf.您只需要使用执行时间操作 (tf.shape) 等。问题是在“填充”之前尝试预先检查张量的形状,使用 tensorflow 进行预处理工作没有问题
  • 您只需要确保数据集预处理操作考虑了所有可能的图像尺寸(这就是我所说的“预先针对所有可能的尺寸进行编码”的意思)
  • 这是一个开放式问题,但实际上。 tf.shape(img_tensor) 将在每次需要从数据集中获取新图像时进行评估,而 img_tensor.shape 甚至在读取任何数据之前就存在。因此,我们可以将img_tensor.shape 视为设计时属性,而tf.shape(img_tensor) 是仅在数据传递给它时才评估的操作。一个更常见的例子是 tensorflow 操作具有未知的第一维,它表示批量大小(仅在执行时知道)
  • 我明白了。非常感谢。我试试这个
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
相关资源
最近更新 更多