在tf.keras.utils.image_dataset_from_directory之后访问图像

0s7z1bwu  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(198)

我正在使用tf.keras.utils.image_dataset_from_directory将我的图像加载到一个用于tensorflow 的数据集中。但是,我对它的工作原理感到困惑。我只是希望能够imshow数据集中的每一张图像。

data = tf.keras.utils.image_dataset_from_directory('/content/gdrive/MyDrive/Skyrmion Vision/testFiles/train/',batch_size=1,image_size=(171,256))
data_iterator = data.as_numpy_iterator()
batch = data_iterator.next()
batch[0].shape
for image in batch:
  print(type(image))

这是我的尝试,但它只是显示2 numpy.ndarrays作为类型,我希望它将所有12个图像显示为numpy数组(数据集中只有12个图像)。
在图像进入tensorflow数据集中后,如何访问它们?

deikduxw

deikduxw1#

您通过设置batch_size=1创建了批处理,每个批处理包含一个元素。
因此,如果您这样做:

data_iterator = data.as_numpy_iterator()
batch = data_iterator.next()

您只访问了一个图像,因为您的批处理中只有一个图像。要获取下一个批处理,也就是下一个图像,您可以再次调用data_iterator.next()
但是,如果您只想遍历数据集并打印图像,则可以执行以下操作:

data = tf.keras.utils.image_dataset_from_directory('img',batch_size=1,image_size=(171,256))
for x, y in data:
  print("image: {}, label: {}".format(x,y))

当然,您也可以设置更高的batch_size值,以便一次访问更多的图像。
如果要一次访问一个映像,您可以:

方法1(建议):迭代批处理以及批处理中的图像:

import numpy as np
from google.colab.patches import cv2_imshow

data = tf.keras.utils.image_dataset_from_directory('img',batch_size=1,image_size=(171,256))
for batch_x, batch_y in data:
    for i, x in enumerate(batch_x):
       x = np.asarray(x)
       cv2_imshow(x)

内部循环允许您分别访问批处理中的图像。使用for batch_x, batch_y in data,您可以获得两个数组,其中第一维是批处理中的样本数。因此,如果您添加一个内部循环,您可以迭代批处理中的元素。在这种情况下,只有一个元素,但该循环使该方法更加通用。

**方法2:**使用索引访问批处理中的图像。

设置batch_size=1后,每个批处理只有一个图像。因此循环的每个batch_x元素都是(1, 171, 256, 3)形状的数组。假设您设置了batch_size=2。这将为您提供(2, 171, 256, 3)batch_x形状。此时,如果您想显示每个批处理的第二个(即索引1)图像,您可以通过直接索引图像来实现:

import numpy as np
from google.colab.patches import cv2_imshow

data = tf.keras.utils.image_dataset_from_directory('img', batch_size=2, image_size=(171,256))
for batch_x, batch_y in data:
    x = np.asarray(batch_x[1])  # access second image of batch
    cv2_imshow(x)

方法cv2_imshow用于在Google Colab中显示图像。

相关问题