我尝试设置一个图像管道,该管道为裁剪图像的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)
答案 0 :(得分:0)
您正面临这个问题,因为数据集是缓慢加载的(仅根据需要进行评估)。
从本质上讲,如果tf读取了文件或者我们(作为开发人员)告诉了文件,则tf只能“知道”图像的大小。这看似很明显,但值得牢记。
因此,鉴于tf Dataset
对象可以表示任意大的数据序列(实际上,以这种方式表示无限的数据集是完全合理的),因此从设计上讲,它不会预先读取文件。而是每当我们的下游代码需要一个新的示例或批处理时,它就会读取它们。
恐怕要知道图像的大小或预先针对所有可能的大小进行编码是我们的责任。
P.S。之所以可以使用第二种方法,是因为它急切地评估了(单个)张量示例。
P.P.S。您可能已经知道,您可以使用tf.shape()
在执行时“评估”任何张量的形状(并在数据集预处理管道中使用其结果),但是您可以t预先检查