畅游人工智能之海--Keras教程之图像数据预处理(一)

畅游人工智能之海--Keras教程之图像数据预处理(一)

上周我们结束了优化器的学习,这周我们将要展开数据预处理中关于图像数据预处理函数的学习。数据预处理的函数可以帮助我们将原始数据转换成可用于训练模型的对象,这也是训练神经网络的过程中非常重要的一步,让我们一起来看看吧。

image_dataset_from_directory函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tf.keras.preprocessing.image_dataset_from_directory(
directory, #数据所在的目录。如果labels="inferred",则它应包含子目录,每个子目录都包含一个类的图像。否则,目录结构将被忽略。
labels="inferred", #“inferred”(标签是从目录结构生成的),或者是整数标签的列表/元组,其大小与目录中找到的图像文件的数量相同。标签应根据图像文件路径的字母数字顺序排序
label_mode="int", #'int': 表示标签被编码为整数;'categorical' 是指标签被编码为分类矢量;'binary' 表示将标签(只能有2个)编码为float32标量,其值为0或1;None 无标签
class_names=None, #仅在labels="inferred"时有效。这是类名称的明确列表(必须与子目录的名称匹配)。用于控制类的顺序(否则使用字母数字顺序)
color_mode="rgb", #“灰度”,“ rgb”,“ rgba”之一。默认值:“ rgb”。图像是否将转换为具有1、3或4个通道。
batch_size=32, #数据批处理的大小。默认值:32
image_size=(256, 256), #从磁盘读取图像后将图像调整大小的大小。默认为(256, 256)。由于流水线处理一批必须全部具有相同大小的图像,因此必须提供这些图像
shuffle=True, #是否随机播放数据。默认值:True。如果设置为False,则按字母数字顺序对数据进行排序
seed=None, #用于随机排列和转换的可选随机种子
validation_split=None, #可选的介于0和1之间的浮点数,可保留一部分数据供验证
subset=None, #仅在validation_split设置时使用
interpolation="bilinear", #字符串,调整图像大小时使用的插值方法。默认为bilinear。支持bilinear,nearest,bicubic, area,lanczos3,lanczos5,gaussian,mitchellcubic。
follow_links=False, #是否访问符号链接指向的子目录。默认为False
)

该函数会从目录中的图像文件生成 tf.data.Dataset 。

如果目录结构如下:

1
2
3
4
5
6
7
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_a和生成批次图像class_b,以及标签0和1(0对应于class_a和1对应于class_b)。

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

返回值:

一个tf.data.Dataset对象。如果label_mode为None,它将生成形状为(batch_size,image_size[0],image_size[1],num_channels)的float32张量,对图像进行编码。否则,将生成一个元组 (images, labels),其images 形状为(batch_size, image_size[0], image_size[1], num_channels),有可能为int、binary和categorial。如果label_modeint,标签是形如(batch_size,)的int32张量;如果label_modebinary,,标签是形如(batch_size, 1)的0s和1s的float32张量;如果label_modecategorial,标签是形如(batch_size, num_classes)的float32张量,表示类索引的单次编码。

如果color_modegrayscale,则图像张量中有1个通道。如果color_modergb,则图像张量中有3个通道。如果color_modergba,则图像张量中有4个通道。

load_img函数

1
2
3
4
5
6
7
tf.keras.preprocessing.image.load_img(
path, #图像文件的路径
grayscale=False, #灰度,不推荐使用color_mode="grayscale"
color_mode="rgb", #所需的图像格式。“灰度”,“ rgb”,“ rgba”之一。默认值:“ rgb”。
target_size=None, #(None默认为原始大小)或int元组(img_height, img_width)
interpolation="nearest" #如果目标尺寸与加载的图像不同,则使用插值方法对图像重新采样。 支持"nearest", "bilinear", and "bicubic". 默认情况下,使用“nearest”。
)

将图像加载为PIL格式。

例子:

1
2
3
4
image = tf.keras.preprocessing.image.load_img(image_path)
input_arr = keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr]) # 将单个图像转换为批处理
predictions = model.predict(input_arr)

返回:

PIL实例

注意:

ImportError:如果PIL不可用。

ValueError:如果不支持插值方法。

img_to_array函数

1
2
3
4
5
tf.keras.preprocessing.image.img_to_array(
img, #输入PIL图像实例
data_format=None, #图像数据格式,可以是“ channels_first”或“ channels_last”。默认为None,在这种情况下将使用全局设置 tf.keras.backend.image_data_format()(除非更改了它,否则默认为“ channels_last”)。
dtype=None #默认为None,在这种情况下,使用全局设置 tf.keras.backend.floatx()(除非您更改了它,否则默认为“ float32”)
)

返回值:

3D的numpy阵列

注意:

ValueError:如果无效imgdata_format已通过。

ImageDataGenerator类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
tf.keras.preprocessing.image.ImageDataGenerator(
featurewise_center=False, #布尔值。将输入数据的均值设置为 0,逐特征进行
samplewise_center=False, #布尔值。将每个样本的均值设置为 0
featurewise_std_normalization=False, #布尔值。将输入除以数据标准差,逐特征进行
samplewise_std_normalization=False, #布尔值。将每个输入除以其标准差
zca_whitening=False, #ZCA 白化的 epsilon 值,默认为 1e-6
zca_epsilon=1e-06, #布尔值。是否应用 ZCA 白化
rotation_range=0, #整数。随机旋转的度数范围
width_shift_range=0.0, #浮点数、一维数组或整数。
'''
float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
1-D 数组: 数组中的随机元素。
int: 来自间隔 (-width_shift_range, +width_shift_range) 之间的整数个像素。
width_shift_range=2 时,可能值是整数 [-1, 0, +1],与 width_shift_range=[-1, 0, +1] 相同;而 width_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
'''
height_shift_range=0.0, #浮点数、一维数组或整数
'''
float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
1-D array-like: 数组中的随机元素。
int: 来自间隔 (-height_shift_range, +height_shift_range) 之间的整数个像素。
height_shift_range=2 时,可能值是整数 [-1, 0, +1],与 height_shift_range=[-1, 0, +1] 相同;而 height_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
'''
brightness_range=None, #元组或两个浮点数的列表。从中选择亮度偏移值的范围
shear_range=0.0, #浮点数。剪切强度(以弧度逆时针方向剪切角度)
zoom_range=0.0, #浮点数 或 [lower, upper]
channel_shift_range=0.0, #浮点数。随机通道转换的范围
fill_mode="nearest", # {"constant", "nearest", "reflect" or "wrap"} 之一。默认为 'nearest'
cval=0.0, #浮点数或整数。用于边界之外的点的值,当 fill_mode = "constant" 时
horizontal_flip=False, #布尔值。随机水平翻转
vertical_flip=False, #布尔值。随机垂直翻转
rescale=None, #重缩放因子。默认为 None。如果是 None 或 0,不进行缩放,否则将数据乘以所提供的值(在应用任何其他转换之前)
preprocessing_function=None, #应用于每个输入的函数。这个函数会在任何其他改变之前运行。这个函数需要一个参数:一张图像(秩为 3 的 Numpy 张量),并且应该输出一个同尺寸的 Numpy 张量。
data_format=None, #图像数据格式,{"channels_first", "channels_last"} 之一。"channels_last" 模式表示图像输入尺寸应该为 (samples, height, width, channels),"channels_first" 模式表示输入尺寸应该为 (samples, channels, height, width).如果你从未设置它,那它就是 "channels_last"
validation_split=0.0, #浮点数。Float. 保留用于验证的图像的比例(严格在0和1之间)
dtype=None, #生成数组使用的数据类型
)

使用实时数据增强生成一批张量图像数据。数据将被循环(分批)。

该类有多种API,如flow、flow_from_directory等等,明天我们将进行相关的讲解。

今天我们学习了一部分图像数据预处理的函数和类,大家可以动手尝试将它们运用到代码当中,及时巩固,谢谢大家的阅读,明天见!