tf.keras.preprocessing.image.ImageDataGenerator(
featurewise_center=False, samplewise_center=False,
featurewise_std_normalization=False, samplewise_std_normalization=False,
zca_whitening=False, zca_epsilon=1e-06, rotation_range=0, width_shift_range=0.0,
height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0,
channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False,
vertical_flip=False, rescale=None, preprocessing_function=None,
data_format=None, validation_split=0.0, dtype=None
)
featurewise_center:
Boolean. Set input mean to 0 over the dataset, feature-wise.
布尔值,将整个输入数据集的特征值设置为均值为0的分布
samplewise_center:
Boolean. Set each sample mean to 0.
布尔值,将每个样本的特征值设置为均值为0的分布
featurewise_std_normalization:
Boolean. Divide inputs by std of the dataset, feature-wise.
布尔值,将数据集除以整体数据的标准差
samplewise_std_normalization:
Boolean. Divide each input by its std.
布尔值,将每个样本除以自身的标准差
zca_epsilon:
epsilon for ZCA whitening. Default is 1e-6.
ZCA白化中的参数epsilon,默认1e-6
zca_whitening:
Boolean. Apply ZCA whitening.
布尔值,应用ZCA白化
rotation_range:
Int. Degree range for random rotations.
随机旋转的角度范围
width_shift_range:
浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
height_shift_range:
浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
brightness_range:
Tuple or list of two floats. Range for picking a brightness shift value from.
元组或两个浮点数列表。 从中选择亮度偏移值的范围。
shear_range:
Float. Shear Intensity (Shear angle in counter-clockwise direction in degrees)
浮点数, 剪切强度(逆时针剪切角,以度为单位)
zoom_range:
Float or [lower, upper]. Range for random zoom. If a float, [lower, upper] = [1-zoom_range, 1+zoom_range]
.
浮点数或形如[lower,upper]
的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
channel_shift_range:
Float. Range for random channel shifts.
浮点数,随机通道偏移的幅度
fill_mode:
‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
cval:
浮点数或整数,当fill_mode=constant
时,指定要向超出边界的点填充的值
horizontal_flip:
布尔值,进行随机水平翻转
vertical_flip:
布尔值,进行随机竖直翻转
rescale:
重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
preprocessing_function:
将被应用于每个输入的函数。该函数将在图片缩放和数据提升之后运行。该函数接受一个参数,为一张图片(秩为3的numpy array),并且输出一个具有相同shape的numpy array
data_format:
字符串,“channel_first”或“channel_last”之一,代表图像的通道维的位置。该参数是Keras 1.x中的image_dim_ordering,“channel_last”对应原本的“tf”,“channel_first”对应原本的“th”。以128x128的RGB图像为例,“channel_first”应将数据组织为(3,128,128),而“channel_last”应将数据组织为(128,128,3)。该参数的默认值是~/.keras/keras.json
中设置的值,若从未设置过,则为“channel_last”
validation_split:
浮点数,保留用于验证的图像部分(在0和1之间)。
dtype:
用于生成的数组的dtype。
从参数设置来看,ImageDataGenerator是一个处理数据的一个工具,里面封装了许多关于图像的一些常见的处理方法(翻转、增强等),ImageDataGenerator并不涉及数据引入,而只是一个处理已有数据的一个方法(没有数据输入的一个接口存在)。则需要实例化后,应用到其他的函数中。
例如,我们现在生成一个ImageDataGenerator:
# 导入tensorflow里keras.perprocessing.image关于图片的处理方法-图片数据生成器
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
datagen = ImageDataGenerator(
# 图片随机翻转角度
rotation_range=10,
# 图片随机水平偏移幅度
width_shift_range=0.2,
# 图片随机竖直偏移幅度
height_shift_range=0.2,
# 执行其他处理前,乘到图像上
rescale=1./255,
# 剪切强度
shear_range=0.2,
# 随机水平翻转
horizontal_flip=True,
fill_mode="nearest"
)
现在也仅仅是做好了模具,并没有材料供我们生产,我们需要能够与ImageDataGenerator配合的数据。
ps:如果指定了( if featurewise_center
or featurewise_std_normalization
or zca_whitening
are set to True.)为True,则在进行数据使用的时候,需要对Generator进行fit操作,使Generator更新为符合需要的数据类型。
flow:Takes data & label arrays, generates batches of augmented data.
flow(
x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None,
save_to_dir=None, save_prefix='', save_format='png', subset=None
)
这个相对来说比较简单了,导入数据流:
x:input,ndarray(4)
y:label,ndarray
sample_weight:这批数据的权重
save_to_dir:随机化后的保存路径
save_prefix:保存名字的前缀
save_format:保存的格式
subset:
Subset of data ("training"
or "validation"
) if validation_split
is set in ImageDataGenerator
.
如果,在ImageDataGenerator中设置了分离训练集,则将此部分设置为"training"
or "validation"
flow_from_directory:
Takes the path to a directory & generates batches of augmented data.
flow_from_directory(
directory, target_size=(256, 256), color_mode='rgb', classes=None,
class_mode='categorical', batch_size=32, shuffle=True, seed=None,
save_to_dir=None, save_prefix='', save_format='png', follow_links=False,
subset=None, interpolation='nearest'
)
directory:
包含不同类别的图片文件夹
target_size:
希望引入的图片大小,resize
color_mode:
希望引入的图片色彩模式:One of "grayscale", "rgb", "rgba". Default: "rgb". Whether the images will be converted to have 1, 3, or 4 channels.
classes:
[class1,class2...],如果不指定,文件夹下的全部类别,如果指定,则只选择指定的类别添加至Iter
class_mode:
分类模式:One of "categorical", "binary", "sparse", "input", or None. Default: "categorical".
interpolation:
若指定引入图片的大小与原图不同,所采用的的差值方法:"nearest", "bilinear", and "bicubic".
return:A DirectoryIterator
yielding tuples of (x, y)
[从这里又返回了tf.keras.preprocessing.iamge的另一个方法的生成结果:DirectoryIterator]
[这里就认为算是:ImageDataGenerator,调用的flow_from_dirctory,就是DirectoryIterator的方法]
[另外,在DirectoryItertaror的方法中,也需要指定ImageDataGenerator这个方法]
[所以,二者可以互相调用~]
返回的是一个可迭代的对象
(x,y)
x:(batch,*size,channel)-4
y:(batch,label)-2
现对ImageDataGenerator进行flow_from_directory测试:
假设有猫狗图片文件夹(图片内容为随机添加,与猫狗无关):
1.生成ImageDataGenerator:
# 导入tensorflow里keras.perprocessing.image关于图片的处理方法-图片数据生成器
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
datagen = ImageDataGenerator(
# 图片随机翻转角度
rotation_range=10,
# 图片随机水平偏移幅度
width_shift_range=0.2,
# 图片随机竖直偏移幅度
height_shift_range=0.2,
# 执行其他处理前,乘到图像上
rescale=1./255,
# 剪切强度
shear_range=0.2,
# 随机水平翻转
horizontal_flip=True,
# 水机竖直翻转
vertical_flip=True,
# 验证集分割/要符合分配比例,如果不能够准确分配(整除),将不起作用
validation_split=0.25,
# 填充模式
fill_mode="nearest",
)
train_iter = datagen.flow_from_directory(
# 种类文件夹的路径
'./data/cats_vs_dogs',
# 目标图片大小
target_size=(256,256),
# 目标颜色模式
color_mode="rgb",
# 种类名字
classes=None,
# 种类模式:分类
class_mode='categorical',
# batch_size
batch_size=2,
# shuffle
shuffle=True,
# seed
seed=None,
# # 变换后的保存路径
save_to_dir="/Users/mac/code/tips/data/cats_vs_dogs_c",
# 保存的前缀
save_prefix="c",
# 保存的格式
save_format="png",
# 验证分离的设置
subset="training"
)
print(train_iter.__len__())
# 3
print(train_iter.classes)
# [0 0 0 1 1 1]
print(train_iter.labels)
# [0 0 0 1 1 1]
print(train_iter.subset)
# training
# next生成图片,并存储图片
# 只有执行过后,才算成功引入
for i in range(train_iter.__len__()):
train, label = next(train_iter)
print(np.asarray(train).shape)
print(np.asarray(label).shape)
"""
(2, 256, 256, 3)
(2, 2)
(2, 256, 256, 3)
(2, 2)
(2, 256, 256, 3)
(2, 2)
"""
"""
网上找的一段伪代码:
xm,y=getDataIndex()#获取所有文件夹中所有图片索引,以及文件夹名也即标签
if shuffle==True:
shuffle(xm,y)#打乱图片索引及其标签
while(True):
for i in range(0,len(x),batch_size):
xm_batch=xm[i:i+batch_size]#文件索引
y_batch=y[i:i+batch_size]
x_batch=getImg(xm_batch)#根据文件索引,获取图像数据
ImagePro(x_batch)#数据增强
#保存提升后的图片
#saveToFile()
yield (x_batch,y_batch)
"""