python - 如何检索 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)
解决方案
您正面临这个问题,因为数据集是延迟加载的(仅在需要时进行评估)。
本质上,如果 tf 读取文件或者我们作为开发人员告诉它,它只能“知道”图像的大小。这似乎是一个显而易见的观点,但值得牢记。
因此,鉴于 tfDataset
对象可以表示任意大的数据序列(事实上,以这种方式表示无限数据集是完全合理的),按照设计它不会预先读取文件。而是在每次我们的下游代码需要新示例或批处理时读取它们。
恐怕我们要么知道图像的大小,要么预先针对所有可能的大小进行编码。
PS您可以使第二种方法起作用的原因是它正在急切地评估(单个)张量示例。
PPS 您可能已经知道您可以在执行时“评估”任何张量的形状tf.shape()
(并在数据集预处理管道中使用此结果),但您无法预先检查它
推荐阅读
- jmockit - Jmockit - 如何调试
- c++ - 在下面给出的示例中,我如何在向量的向量中 push_back?
- python - 大型 NumPy 数组的成对距离(分块?)
- r - 通过 read.csv 在 r 的列中读取“NA”值
- emacs - 无法在现有 leiningen 项目中添加依赖项或库
- mysql - 如何在 MySQL 中使用数组
- google-maps - 在运行地图时遇到问题,无一例外 googleMaps&Flutter
- javafx - 在窗格上测试 setOnKeyPressed 时,TestFX 不起作用
- reactjs - 反应 onClick 事件不起作用
- java - java中的RestAPI返回Json和CSR文件