内容目录
一、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, reflectcval=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_lastvalidation_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和高可用最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
如果你觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!