首页 > 解决方案 > 如何检索 tf.image.decode_jpeg 返回的图像张量和高度?

问题描述

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

#
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)

标签: pythontensorflow

解决方案


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

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

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

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

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

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


推荐阅读