【053】ImageDataGenerator() 介绍

内容目录

一、ImageDataGenerator() 介绍二、数据增强处理和类的构造函数参数1、数据增强处理(data augmentation)2、ImageDataGenerator类的构造函数参数三、一般的对图像的处理流程四、ImageDataGenerator的所有方法介绍1、fit方法2、flow方法3、flow_from_dataframe方法4、flow_from_directory5、get_random_transform6、random_transform7、standardize 方法和 apply_transform()方法

一、ImageDataGenerator() 介绍

  在Keras中,当数据量很多的时候我们需要使用model.fit_generator()方法,该方法接受的第一个参数就是一个生成器。简单来说就是:ImageDataGenerator()。
  ImageDataGenerator()是keras.preprocessing.image模块中的图片生成器,可以每一次给模型“喂”一个batch_size大小的样本数据,同时也可以在每一个批次中对这batch_size个样本数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。
  总结起来就是两个点

(1)图片生成器,负责生成一个批次一个批次的图片,以生成器的形式给模型训练;
(2)对每一个批次的训练图片,适时地进行数据增强处理(data augmentation);

import keras
keras.preprocessing.image.ImageDataGenerator(
    featurewise_center=False, #对输入的图片每个通道减去每个通道对应均值。
    samplewise_center=False, #每张图片减去样本均值, 使得每个样本均值为0。
    featurewise_std_normalization=False, #Boolean()
    samplewise_std_normalization=False, #Boolean()
    zca_whitening=False, #布尔值。是否应用 ZCA 白化。 去除样本之间的相关性
    zca_epsilon=1e-06, #ZCA 白化的 epsilon 值,默认为 1e-6。
    rotation_range=0.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, #垂直平移范围, 浮点数、一维数组或整数(同width_shift_range)
    brightness_range=None, # 两个浮点数组成的元组或者是列表,像素的亮度会在这个范围之类随机确定
    shear_range=0.0, #float, 透视变换的范围,所谓shear_range就是错切变换
    zoom_range=0.0, #缩放范围,参数大于0小于1时,执行的是放大操作,当参数大于1时,执行的是缩小操作。
    channel_shift_range=0.0, #随机通道转换的范围。channel_shift_range可以理解成改变图片的颜色,通过对颜色通道的数值偏移,改变图片的整体的颜色,这意味着是“整张图”呈现某一种颜色,像是加了一块有色玻璃在图片前面一样,即每一个通道上的每一个像素值都加上某一个数值。
    fill_mode='nearest', #填充模式, constant, nearest, reflect
    cval=0.0, #fill_mode == 'constant’的时候填充值
    horizontal_flip=False, #水平反转
    vertical_flip=False, #垂直反转
    rescale=None, #重缩放因子。默认为 None。如果是 None 或 0,不进行缩放,否则将数据乘以所提供的值(在应用任何其他转换之前)。
    #rescale的作用是对图片的每个像素值均乘上这个放缩因子,这个操作在所有其它变换操作之前执行,在一些模型当中,直接输入原图的像素值可能会落入激活函数的“死亡区”,因此设置放缩因子为1/255,把像素值放缩到0和1之间有利于模型的收敛,避免神经元“死亡”。

    preprocessing_function=None, #这是用户自定义的函数,应用于每个输入的函数。这个函数需要一个参数:一张图像(秩为 3 的 Numpy 张量),并且应该输出一个同尺寸的 Numpy 张量。
    data_format=None, #channels_first或者channels_last
    validation_split=0.0) #保留用于验证的图像的比例(严格在0和1之间)

方法:

  • apply_transform(x, transform_parameters):根据参数对x进行变换

  • fit(x, augment=False, rounds=1, seed=None): 将生成器用于数据x,从数据x中获得样本的统计参数, 只有featurewise_center, - featurewise_std_normalization或者zca_whitening为True才需要

  • 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) ):按batch_size大小从x,y生成增强数据

  • flow_from_directory()从路径生成增强数据,和flow方法相比最大的优点在于不用一次将所有的数据读入内存当中,这样减小内存压力,这样不会发生OOM,血的教训。

  • get_random_transform(img_shape, seed=None): 返回包含随机图像变换参数的字典

  • random_transform(x, seed=None): 进行随机图像变换, 通过设置seed可以达到同步变换。

  • standardize(x): 对x进行归一化

注意:flow_from_directory需要提供的路径下面需要有子目录

二、数据增强处理和类的构造函数参数

1、数据增强处理(data augmentation)

  数据增强的手段有非常多种,这里介绍一些代表性的。

  • 旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;

  • 翻转变换(flip): 沿着水平或者垂直方向翻转图像;

  • 缩放变换(zoom): 按照一定的比例放大或者缩小图像;

  • 平移变换(shift): 在图像平面上对图像以一定方式进行平移;可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;

  • 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;

  • 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;

  • 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;

  • 错切变换(shear):效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。

2、ImageDataGenerator类的构造函数参数

  所谓 featurewise指的是逐特征,它针对的是数据集dataset,而samplewise针对的是单个输入图片的本身。featurewise是从整个数据集的分布去考虑的,而samplewise只是针对自身图片 。

  • featurewise_center: 布尔值。将输入数据的均值设置为 0,逐特征进行,对输入的图片每个通道减去每个通道对应均值。

  • samplewise_center: 布尔值。将每个样本的均值设置为 0,每张图片减去样本均值, 使得每个样本均值为0

  • featurewise_std_normalization: Boolean. 布尔值。将每个输入(即每张图片)除以数据集(dataset)标准差,逐特征进行。

  • samplewise_std_normalization: 布尔值。将每个输入(即每张图片)除以其自身(图片本身)的标准差。

三、一般的对图像的处理流程

(1)第一步:数据集的划分,得到x_train,y_train,x_test,y_test;

(2)第二步:构造ImageDataGenerator对象,其中要进行某一些操作是通过在构造函数中的参数指定的,

datagen = ImageDataGenerator(……)

(3)第三步:对样本数据进行data augmentation处理,通过fit方法
注意:这一步并不是必须的,当ImageDataGenerator构造函数中需要使用以下几个参数时才需要使用fit方法,因为需要从fit方法中得到原始图形的统计信息,比如均值、方差等等,否则是不需要改步骤的。

  • featurewise_center:

  • samplewise_center:

  • featurewise_std_normalization:

  • samplewise_std_normalization:

datagen.fit(x_train) # 使用实时数据增益的批数据对模型进行拟合

(4)第四步:进行训练,通过flow方法

model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train) / 32, epochs=epochs)

四、ImageDataGenerator的所有方法介绍

1、fit方法

  将数据生成器用于某些样本数据。它基于一组样本数据,计算与数据转换相关的内部数据统计。当且仅当 featurewise_center 或 featurewise_std_normalization 或 zca_whitening 设置为 True 时才需要。

fit(x, augment=False, rounds=1, seed=None)

# x: 样本数据。秩应该为 4,即(batch,width,height,channel)的格式。对于灰度数据,通道轴的值应该为 1;对于 RGB 数据,值应该为 3。
# augment: 布尔值(默认为 False)。是否使用随机样本扩张。
# rounds: 整数(默认为 1)。如果数据数据增强(augment=True),表明在数据上进行多少次增强。
# seed: 整数(默认 None)。随机种子。
2、flow方法
flow(
x, #输入数据。秩为 4 的 Numpy 矩阵或元组。如果是元组,第一个元素应该包含图像,第二个元素是另一个 Numpy 数组或一列 Numpy 数组,它们不经过任何修改就传递给输出。可用于将模型杂项数据与图像一起输入。对于灰度数据,图像数组的通道轴的值应该为 1,而对于 RGB 数据,其值应该为 3。
y=None, #标签。
batch_size=32, #整数 (默认为 32)。
shuffle=True, #布尔值 (默认为 True)。
sample_weight=None, #样本权重。
seed=None, # 整数(默认为 None)。
save_to_dir=None, #None 或 字符串(默认为 None)。这使您可以选择指定要保存的正在生成的增强图片的目录(用于可视化您正在执行的操作)。
save_prefix='', #字符串(默认 '')。保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
save_format='png', #"png", "jpeg" 之一(仅当 save_to_dir 设置时可用)。默认:"png"。
subset=None) #数据子集 ("training" 或 "validation"),如果 在 ImageDataGenerator 中设置了 validation_split。

'''返回

一个生成元组 (x, y) 的 生成器Iterator,其中 x 是图像数据的 Numpy 数组
(在单张图像输入时),或 Numpy 数组列表(在额外多个输入时),y 是对应的标签的 Numpy 数组。
如果 'sample_weight' 不是 None,生成的元组形式为 (x, y, sample_weight)。
如果 y 是 None, 只有 Numpy 数组 x 被返回。

'''
3、flow_from_dataframe方法

  输入 dataframe 和目录的路径,并生成批量的增强/标准化的数据。

flow_from_dataframe(
dataframe,  #Pandas dataframe,一列为图像的文件名,另一列为图像的类别, 或者是可以作为原始目标数据多个列。
directory,  #字符串,目标目录的路径,其中包含在 dataframe 中映射的所有图像。
x_col='filename',  #字符串,dataframe 中包含目标图像文件夹的目录的列。
y_col='class',  #字符串或字符串列表,dataframe 中将作为目标数据的列。
has_ext=True,  #布尔值,如果 dataframe[x_col] 中的文件名具有扩展名则为 True,否则为 False。
target_size=(256, 256),  #整数元组 (height, width),默认为 (256, 256)。 所有找到的图都会调整到这个维度。
color_mode='rgb',  #"grayscale", "rbg" 之一。默认:"rgb"。 图像是否转换为 1 个或 3 个颜色通道。
classes=None,  #可选的类别列表 (例如, ['dogs', 'cats'])。默认:None。 如未提供,类比列表将自动从 y_col 中推理出来,y_col 将会被映射为类别索引)。 包含从类名到类索引的映射的字典可以通过属性 class_indices 获得。
class_mode='categorical',  #
'''
"categorical", "binary", "sparse", "input", "other" or None 之一。 默认:"categorical"。决定返回标签数组的类型:
"categorical" 将是 2D one-hot 编码标签,
"binary" 将是 1D 二进制标签,
"sparse" 将是 1D 整数标签,
"input" 将是与输入图像相同的图像(主要用于与自动编码器一起使用),
"other" 将是 y_col 数据的 numpy 数组,
None, 不返回任何标签(生成器只会产生批量的图像数据,这对使用 model.predict_generator(), model.evaluate_generator() 等很有用)。

'''
batch_size=32,  #批量数据的尺寸(默认:32)。
shuffle=True,  #是否混洗数据(默认:True)
seed=None,  #可选的混洗和转换的随即种子。
save_to_dir=None,  #None 或 str (默认: None). 这允许你可选地指定要保存正在生成的增强图片的目录(用于可视化您正在执行的操作)。
save_prefix='',  #字符串。保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
save_format='png',  #"png", "jpeg" 之一(仅当 save_to_dir 设置时可用)。默认:"png"。
subset=None,  #数据子集 ("training" 或 "validation"),如果在 ImageDataGenerator 中设置了 validation_split。
interpolation='nearest' #在目标大小与加载图像的大小不同时,用于重新采样图像的插值方法。 支持的方法有 "nearest", "bilinear", and "bicubic"。 如果安装了 1.1.3 以上版本的 PIL 的话,同样支持 "lanczos"。 如果安装了 3.4.0 以上版本的 PIL 的话,同样支持 "box" 和 "hamming"。 默认情况下,使用 "nearest"。
)
'''返回

一个生成 (x, y) 元组的 DataFrameIterator, 其中 x 是一个包含一批尺寸为 (batch_size, *target_size, channels) 的图像样本的 numpy 数组,y 是对应的标签的 numpy 数组。
'''
4、flow_from_directory
flow_from_directory(
directory, #目标目录的路径。每个类应该包含一个子目录。任何在子目录树下的 PNG, JPG, BMP, PPM 或 TIF 图像,都将被包含在生成器中。
target_size=(256, 256), #整数元组 (height, width),默认:(256, 256)。所有的图像将被调整到的尺寸。
color_mode='rgb',#  "grayscale", "rbg" 之一。默认:"rgb"。图像是否被转换成 1 或 3 个颜色通道。
classes=None, #可选的类的子目录列表(例如 ['dogs', 'cats'])。默认:None。如果未提供,类的列表将自动从 directory 下的 子目录名称/结构 中推断出来,其中每个子目录都将被作为不同的类(类名将按字典序映射到标签的索引)。包含从类名到类索引的映射的字典可以通过 class_indices 属性获得。

class_mode='categorical', #
'''
"categorical", "binary", "sparse", "input" 或 None 之一。默认:"categorical"。决定返回的标签数组的类型:
"categorical" 将是 2D one-hot 编码标签,
"binary" 将是 1D 二进制标签,"sparse" 将是 1D 整数标签,
"input" 将是与输入图像相同的图像(主要用于自动编码器)。
如果为 None,不返回标签(生成器将只产生批量的图像数据,对于 model.predict_generator(), model.evaluate_generator() 等很有用)。请注意,如果 class_mode 为 None,那么数据仍然需要驻留在 directory 的子目录中才能正常工作。
'''
batch_size=32, #一批数据的大小(默认 32)。
shuffle=True,# 是否混洗数据(默认 True)。
seed=None, #可选随机种子,用于混洗和转换。
save_to_dir=None, # None 或 字符串(默认 None)。这使你可以最佳地指定正在生成的增强图片要保存的目录(用于可视化你在做什么)。
save_prefix='', #字符串。 保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
save_format='png', #字符串。 保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
follow_links=False, #是否跟踪类子目录中的符号链接(默认为 False)。
subset=None, #数据子集 ("training" 或 "validation"),如果 在 ImageDataGenerator 中设置了 validation_split。
interpolation='nearest'#
'''
在目标大小与加载图像的大小不同时,用于重新采样图像的插值方法。 
支持的方法有 "nearest", "bilinear", and "bicubic"。 
如果安装了 1.1.3 以上版本的 PIL 的话,同样支持 "lanczos"。 
如果安装了 3.4.0 以上版本的 PIL 的话,同样支持 "box" 和 "hamming"。 
默认情况下,使用 "nearest"。

'''
)
'''返回

一个生成 (x, y) 元组的 DirectoryIterator,
其中 x 是一个包含一批尺寸为 (batch_size, *target_size, channels)的图像的 Numpy 数组,
y 是对应标签的 Numpy 数组。

'''
5、get_random_transform
get_random_transform(
img_shape, # 整数元组。被转换的图像的尺寸。
seed=None #随机种子
)
'''返回

包含随机选择的描述变换的参数的字典。返回的字典如下面的形式:
哪些变换使用了,就在字典中添加即可。

'''
transform_parameters = {'theta': theta,
                                'tx': tx,
                                'ty': ty,
                                'shear': shear,
                                'zx': zx,
                                'zy': zy,
                                'flip_horizontal': flip_horizontal,
                                'flip_vertical': flip_vertical,
                                'channel_shift_intensity': channel_shift_intensity,
                                'brightness': brightness}
return transform_parameters
6、random_transform

  将随机变换应用于图像。由于变换的种类很多,这里是随机使用某一种变换在图像上面。

random_transform(
x, #3D 张量,单张图像。(注意,这里是单张图片哦!)
seed=None #随机种子。
)

'''返回

输入的随机转换之后的版本(相同形状)。
'''
7、standardize 方法和 apply_transform()方法

  将标准化配置应用于一批输入。

standardize(x) #x是需要标准化的一批输入
#返回:标准化后的输入。

apply_transform(
x, #3D tensor, single image.这里也是针对单张图片的
transform_parameters 
'''它是一个字典形式的参数,表示要使用哪些变换,字典的键如下所示:
 `'theta'`: Float. Rotation angle in degrees.
 `'tx'`: Float. Shift in the x direction.
`'ty'`: Float. Shift in the y direction.
`'shear'`: Float. Shear angle in degrees.
`'zx'`: Float. Zoom in the x direction.
`'zy'`: Float. Zoom in the y direction.
`'flip_horizontal'`: Boolean. Horizontal flip.
`'flip_vertical'`: Boolean. Vertical flip. `'channel_shift_intencity'`: Float. Channel shift intensity.
`'brightness'`: Float. Brightness shift intensity.
'''
)
#返回值: 变换之后的数组,形状和输入的图片形状是一样的 (same shape)。

About Me:小婷儿

● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:tinghai87605025 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果你觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!

  • 18
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ImageDataGenerator` 是 Keras 中用于数据增强的工具,用于生成图像数据的增强版本以及相应的标签。它可以在训练期间实时生成经过增强的图像数据,并将其输入模型进行训练,从而增加数据的多样性,避免过拟合,提高模型的泛化能力。 `ImageDataGenerator` 可以执行以下图像增强操作: - 旋转、剪切、缩放、平移图像 - 翻转图像(水平或垂直) - 调整图像的亮度、对比度、饱和度等 - 对图像进行归一化处理 - ... 以下是一个简单的示例代码,演示如何使用 `ImageDataGenerator` 进行图像增强: ```python from keras.preprocessing.image import ImageDataGenerator # 创建 ImageDataGenerator 实例 datagen = ImageDataGenerator( rotation_range=20, # 随机旋转图像的角度范围 width_shift_range=0.2, # 随机水平平移图像的范围(相对于总宽度的比例) height_shift_range=0.2, # 随机垂直平移图像的范围(相对于总高度的比例) shear_range=0.2, # 随机剪切图像 zoom_range=0.2, # 随机缩放图像 horizontal_flip=True, # 随机水平翻转图像 fill_mode='nearest' # 图像增强时使用的填充模式 ) # 加载图像数据 X_train = ... y_train = ... # 将图像数据转换为增强数据 datagen.fit(X_train) gen = datagen.flow(X_train, y_train, batch_size=32) # 训练模型 model.fit_generator(generator=gen, epochs=50, ...) ``` 在上面的代码中,我们首先创建了一个 `ImageDataGenerator` 实例,并指定了一些常用的图像增强参数。然后,我们将训练数据 `X_train` 和标签 `y_train` 转换为增强数据,并使用 `fit_generator` 方法训练模型。 注意,这只是一个简单的示例代码,实际上在使用 `ImageDataGenerator` 进行图像增强时,您需要根据您的具体需求来调整参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值