python - 如何检索 tf.image.decode_jpeg 返回的图像张量的高度和高度?

标签 python tensorflow

我尝试设置一个图像管道,为 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)

最佳答案

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

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

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

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

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

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

关于python - 如何检索 tf.image.decode_jpeg 返回的图像张量的高度和高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56557151/

相关文章:

Python 字典更新和细化循环

python - 如何在使用 QuTiP 绘制 Bloch 球体时给出绘图标题

python - 如何将 'instance keys' 添加到 keras 模型输入以在 gcloud ai-platform 中进行批量预测?

python - Tensorflow 无法正确识别列表中的数字

python - 将切片的 numpy 矩阵保存到另一个 numpy 数组中

python - 关于在 Numpy 中向量化 block 操作的建议

python - 编译加载模型时 Keras ValueError

tensorflow - tensorflow 失败前提条件错误

python - 在 DataFrame 中创建新列

tensorflow - LSTM 或任何其他层的 TimeDistributed 包装器有什么用途