Keras 3 API 文档 / 数据加载 / 图像数据加载

图像数据加载

[源代码]

image_dataset_from_directory 函数

keras.utils.image_dataset_from_directory(
    directory,
    labels="inferred",
    label_mode="int",
    class_names=None,
    color_mode="rgb",
    batch_size=32,
    image_size=(256, 256),
    shuffle=True,
    seed=None,
    validation_split=None,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
    crop_to_aspect_ratio=False,
    pad_to_aspect_ratio=False,
    data_format=None,
    verbose=True,
)

从目录中的图像文件生成 tf.data.Dataset 对象。

如果您的目录结构是

main_directory/
...class_a/
......a_image_1.jpg
......a_image_2.jpg
...class_b/
......b_image_1.jpg
......b_image_2.jpg

然后调用 image_dataset_from_directory(main_directory, labels='inferred') 将返回一个 tf.data.Dataset 对象,该对象会从子目录 class_aclass_b 中产生图像批次,并带有标签 0 和 1(0 对应于 class_a,1 对应于 class_b)。

支持的图像格式:.jpeg.jpg.png.bmp.gif。动图会被截断到第一帧。

参数

  • directory:数据所在的目录。如果 labels"inferred",它应该包含子目录,每个子目录包含一个类的图像。否则,目录结构将被忽略。
  • labels:可以是 "inferred"(标签从目录结构推断生成)、None(无标签),或者一个列表/元组的整数标签,其大小与目录中找到的图像文件数量相同。标签应按图像文件路径的字母数字顺序排序(通过 Python 中的 os.walk(directory) 获取)。
  • label_mode:描述 labels 编码的字符串。选项有
    • "int":表示标签编码为整数(例如用于 sparse_categorical_crossentropy 损失)。
    • "categorical":表示标签编码为分类向量(例如用于 categorical_crossentropy 损失)。
    • "binary":表示标签(只能有两个)编码为 float32 标量,值为 0 或 1(例如用于 binary_crossentropy)。
    • None(无标签)。
  • class_names:仅当 labels"inferred" 时有效。这是类名的显式列表(必须与子目录名称匹配)。用于控制类的顺序(否则使用字母数字顺序)。
  • color_mode:选项之一:"grayscale"(灰度)、"rgb"(RGB)、"rgba"(RGBA)。表示图像是否会转换为 1、3 或 4 个通道。默认为 "rgb"
  • batch_size:数据批次的大小。默认为 32。如果为 None,数据将不会分批(数据集将生成单个样本)。
  • image_size:从磁盘读取图像后要调整到的尺寸,指定为 (height, width)。由于管道处理的图像批次必须都具有相同的大小,因此必须提供此参数。默认为 (256, 256)
  • shuffle:是否打乱数据。默认为 True。如果设置为 False,则按字母数字顺序对数据进行排序。
  • seed:用于打乱和变换的可选随机种子。
  • validation_split:可选的介于 0 和 1 之间的浮点数,表示用于验证的数据比例。
  • subset:要返回的数据子集。选项之一:"training"(训练集)、"validation"(验证集)或 "both"(两者)。仅在设置了 validation_split 时使用。当 subset="both" 时,该实用工具返回包含两个数据集的元组(分别是训练集和验证集)。
  • interpolation:字符串,调整图像大小时使用的插值方法。支持 "bilinear""nearest""bicubic""area""lanczos3""lanczos5""gaussian""mitchellcubic"。默认为 "bilinear"
  • follow_links:是否访问符号链接指向的子目录。默认为 False
  • crop_to_aspect_ratio:如果为 True,则在不失真宽高比的情况下调整图像大小。当原始宽高比与目标宽高比不同时,输出图像将被裁剪,以便返回图像中与目标宽高比匹配的、尺寸最大的可能窗口(尺寸为 image_size)。默认情况下(crop_to_aspect_ratio=False),可能不会保留宽高比。
  • pad_to_aspect_ratio:如果为 True,则在不失真宽高比的情况下调整图像大小。当原始宽高比与目标宽高比不同时,输出图像将被填充,以便返回图像中与目标宽高比匹配的、尺寸最大的可能窗口(尺寸为 image_size)。默认情况下(pad_to_aspect_ratio=False),可能不会保留宽高比。
  • data_format:如果为 None,则使用 keras.config.image_data_format(),否则为 'channel_last' 或 'channel_first'。
  • verbose:是否显示关于类和找到的文件数量的信息。默认为 True

返回

一个 tf.data.Dataset 对象。

  • 如果 label_modeNone,则生成形状为 (batch_size, image_size[0], image_size[1], num_channels)float32 张量,编码图像(关于 num_channels 的规则见下文)。
  • 否则,它会生成一个元组 (images, labels),其中 images 的形状为 (batch_size, image_size[0], image_size[1], num_channels),而 labels 遵循下文描述的格式。

关于标签格式的规则

  • 如果 label_mode"int",标签是一个形状为 (batch_size,)int32 张量。
  • 如果 label_mode"binary",标签是一个由 1 和 0 组成的 float32 张量,形状为 (batch_size, 1)
  • 如果 label_mode"categorical",标签是一个形状为 (batch_size, num_classes)float32 张量,表示类别的独热编码。

关于生成的图像通道数的规则

  • 如果 color_mode"grayscale",图像张量有 1 个通道。
  • 如果 color_mode"rgb",图像张量有 3 个通道。
  • 如果 color_mode"rgba",图像张量有 4 个通道。

[源代码]

load_img 函数

keras.utils.load_img(
    path,
    color_mode="rgb",
    target_size=None,
    interpolation="nearest",
    keep_aspect_ratio=False,
)

将图像加载为 PIL 格式。

示例

image = keras.utils.load_img(image_path)
input_arr = keras.utils.img_to_array(image)
input_arr = np.array([input_arr])  # Convert single image to a batch.
predictions = model.predict(input_arr)

参数

  • path:图像文件的路径。
  • color_mode:选项之一:"grayscale"(灰度)、"rgb"(RGB)、"rgba"(RGBA)。默认值:"rgb"。所需的图像格式。
  • target_size:可以是 None(默认为原始尺寸)或整数元组 (img_height, img_width)
  • interpolation:如果目标尺寸与加载图像的尺寸不同,用于重新采样图像的插值方法。支持的方法有 "nearest""bilinear""bicubic"。如果安装了 PIL 1.1.3 或更高版本,也支持 "lanczos"。如果安装了 PIL 3.4.0 或更高版本,也支持 "box""hamming"。默认使用 "nearest"
  • keep_aspect_ratio:布尔值,是否在不失真宽高比的情况下将图像调整到目标尺寸。调整大小前,会根据目标宽高比在图像中心进行裁剪。

返回

一个 PIL Image 实例。


[源代码]

img_to_array 函数

keras.utils.img_to_array(img, data_format=None, dtype=None)

将 PIL Image 实例转换为 NumPy 数组。

示例

from PIL import Image
img_data = np.random.random(size=(100, 100, 3))
img = keras.utils.array_to_img(img_data)
array = keras.utils.image.img_to_array(img)

参数

  • img:输入的 PIL Image 实例。
  • data_format:图像数据格式,可以是 "channels_first"(通道优先)或 "channels_last"(通道靠后)。默认为 None,在这种情况下使用全局设置 keras.backend.image_data_format()(除非您更改过,否则默认为 "channels_last")。
  • dtype:要使用的数据类型。None 表示使用全局设置 keras.backend.floatx()(除非您更改过,否则默认为 "float32")。

返回

一个 3D NumPy 数组。


[源代码]

save_img 函数

keras.utils.save_img(
    path, x, data_format=None, file_format=None, scale=True, **kwargs
)

将存储为 NumPy 数组的图像保存到路径或文件对象。

参数

  • path:路径或文件对象。
  • x:NumPy 数组。
  • data_format:图像数据格式,可以是 "channels_first"(通道优先)或 "channels_last"(通道靠后)。
  • file_format:可选的文件格式覆盖。如果省略,使用的格式将从文件名扩展名确定。如果使用文件对象而不是文件名,应始终使用此参数。
  • scale:是否将图像值缩放到 [0, 255] 范围内。
  • **kwargs:传递给 PIL.Image.save() 的额外关键字参数。

[源代码]

array_to_img 函数

keras.utils.array_to_img(x, data_format=None, scale=True, dtype=None)

将 3D NumPy 数组转换为 PIL Image 实例。

示例

from PIL import Image
img = np.random.random(size=(100, 100, 3))
pil_img = keras.utils.array_to_img(img)

参数

  • x:输入数据,可以是任何可以转换为 NumPy 数组的形式。
  • data_format:图像数据格式,可以是 "channels_first"(通道优先)或 "channels_last"(通道靠后)。默认为 None,在这种情况下使用全局设置 keras.backend.image_data_format()(除非您更改过,否则默认为 "channels_last")。
  • scale:是否缩放图像,使其最小值和最大值分别为 0 和 255。默认为 True
  • dtype:要使用的数据类型。None 表示使用全局设置 keras.backend.floatx()(除非您更改过,否则默认为 "float32")。默认为 None

返回

一个 PIL Image 实例。