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

图像数据加载

[source]

image_dataset_from_directory function

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. 动画 gif 被截断为第一帧.

参数: directory: 数据所在的目录. 如果 labels"inferred",它应该包含 子目录,每个子目录包含一个类的图像. 否则,目录结构将被忽略. labels: 要么是 "inferred" (标签从目录结构生成), None(无标签), 或一个整数标签的列表/元组,其大小与目录中找到的图像文件数量相同.标签应根据图像文件路径的字母数字顺序排序 (通过 Python 中的 os.walk(directory) 获得). label_mode: 描述 labels 编码的字符串.选项有: - "int":表示标签编码为整数 (例如用于 sparse_categorical_crossentropy 损失). - "categorical" 表示标签编码为分类向量 (例如用于 categorical_crossentropy 损失). - "binary" 表示标签(只能有 2 个) 编码为 float32 标量,值为 0 或 1 (例如用于 binary_crossentropy). - None(无标签). class_names: 仅在 labels"inferred" 时有效. 这是类名的显式列表 (必须与子目录名称匹配).用于控制类的顺序(否则使用字母数字顺序). color_mode: 其中一个 "grayscale""rgb""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",标签是形状为 (batch_size, 1)float32 张量,值为 1 和 0.
  • 如果 label_mode"categorical",标签是形状为 (batch_size, num_classes)float32 张量,表示类索引的独热编码.

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

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

[source]

load_img function

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])  # 将单张图像转换为批次.
predictions = model.predict(input_arr)

参数: path: 图像文件的路径. color_mode: 可以是 "grayscale", "rgb", "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实例.


[source]

img_to_array function

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 数组.


[source]

save_img function

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()的额外关键字参数.


[source]

array_to_img function

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实例.