tf.keras.preprocessing.image.ImageDataGenerator

 

 

API:

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更新为符合需要的数据类型。

Methods:

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测试:

假设有猫狗图片文件夹(图片内容为随机添加,与猫狗无关):

tf.keras.preprocessing.image.ImageDataGenerator_第1张图片

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)
"""

 

tf.keras.preprocessing.image.ImageDataGenerator_第2张图片

 

 

 

 

 

 

你可能感兴趣的:(tensorflow,tensorflow)