ImageDataGenerator
ImageDataGenerator类的定义以及构造函数的参数详解
ImageDataGenerator类的简单介绍
Generate batches of tensor image data with real-time data augmentation.The data will be looped over (in batches).
这个类是做什么⽤的?
通过实时数据增强⽣成张量图像数据批次,并且可以循环迭代,
我们知道在Keras中,当数据量很多的时候我们需要使⽤model.fit_generator()⽅法,该⽅法接受的第⼀个参数就是⼀个⽣成器。
简单来说就是:ImageDataGenerator()是keras.preprocessing.image模块中的图⽚⽣成器,可以每⼀次给模型“喂”⼀个batch_size⼤⼩的样本数据,
同时也可以在每⼀个批次中对这batch_size个样本数据进⾏增强,扩充数据集⼤⼩,增强模型的泛化能⼒。⽐如进⾏旋转,变形,归⼀化等等。
总结起来就是两个点:
图⽚⽣成器,负责⽣成⼀个批次⼀个批次的图⽚,以⽣成器的形式给模型训练;
对每⼀个批次的训练图⽚,适时地进⾏数据增强处理(data augmentation);
数据增强处理(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轴)的垂直距离成正⽐。
ImageDataGenerator类的构造函数参数
featurewise_center: 布尔值。将输⼊数据的均值设置为 0,逐特征进⾏,对输⼊的图⽚每个通道减去每个通道对应均值。
samplewise_center: 布尔值。将每个样本的均值设置为 0,每张图⽚减去样本均值, 使得每个样本均值为0
featurewise_std_normalization: Boolean. 布尔值。将每个输⼊(即每张图⽚)除以数据集(dataset)标准差,逐特征进⾏。
samplewise_std_normalization: 布尔值。将每个输⼊(即每张图⽚)除以其⾃⾝(图⽚本⾝)的标准差。
这⾥需要注意两个概念,所谓 featurewise指的是逐特征,它针对的是数据集dataset,
⽽samplewise针对的是单个输⼊图⽚的本⾝。
featurewise是从整个数据集的分布去考虑的,⽽samplewise只是针对⾃⾝图⽚。
zca_epsilon: ZCA ⽩化的 epsilon 值,默认为 1e-6。
zca_whitening: 布尔值。是否应⽤ ZCA ⽩化。
rotation_range: 整数。随机旋转的度数范围。
width_shift_range: 它的值可以是浮点数、⼀维数组、整数
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: 浮点数、⼀维数组或整数(同width_shift_range)
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) 之间的浮点数。
shear_range: 浮点数。剪切强度(以弧度逆时针⽅向剪切⾓度)。
所谓shear_range就是错切变换,效果就是让所有点的x坐标(或者y坐标)保持不变,⽽对应的y坐标(或者x坐标)则按⽐例发⽣平移,且平移的⼤⼩和该点到x轴(或y轴)的垂直距离成正⽐。如下图所⽰,⼀个⿊⾊矩形图案变换为蓝⾊平⾏四边形图案。上⼀篇⽂章中也展⽰了shear变换的效果。
brightness_range: 两个浮点数组成的元组或者是列表,像素的亮度会在这个范围之类随机确定
zoom_range: 浮点数或 [lower, upper]。随机缩放范围。如果是浮点数,[lower, upper] = [1-zoom_ran
ge, 1+zoom_range]。zoom_range参数可以让图⽚在长或宽的⽅向进⾏放⼤,可以理解为某⽅向的resize,因此这个参数可以是⼀个数或者是⼀个list。当给出⼀个数时,图⽚同时在长宽两个⽅向进⾏同等程度的放缩操作;当给出⼀个list 时,则代表[width_zoom_range, height_zoom_range],即分别对长宽进⾏不同程度的放缩。⽽参数⼤于0⼩于1时,执⾏的是放⼤操作,当参数⼤于1时,执⾏的是缩⼩操作。
channel_shift_range: 浮点数。随机通道转换的范围。channel_shift_range可以理解成改变图⽚的颜⾊,通过对颜⾊通道的数值偏移,改变图⽚的整体的颜⾊,这意味着是“整张图”呈现某⼀种颜⾊,像是加了⼀块有⾊玻璃在图⽚前⾯⼀样,即每⼀个通道上的每⼀个像素值都加上某⼀个数值。
fill_mode: {"constant", "nearest", "reflect" or "wrap"} 之⼀。默认为 'nearest'。输⼊边界以外的点根据给定的模式填充:
'constant': kkkkkkkk|abcd|kkkkkkkk (当下⾯的cval=k)
'nearest': aaaaaaaa|abcd|dddddddd
'reflect': abcddcba|abcd|dcbaabcd
'wrap': abcdabcd|abcd|abcdabcd
cval: 浮点数或整数。⽤于边界之外的点的值,当 fill_mode = "constant" 时。
horizontal_flip: 布尔值。随机⽔平翻转。
vertical_flip: 布尔值。随机垂直翻转。
需要注意的是:既然是每次随机进⾏翻转,随机对图⽚执⾏⽔平或者是垂直翻转操作,意味着不⼀定对所有图⽚都会执⾏⽔平翻转或垂直翻转,每次⽣成均是随机选取图⽚进⾏翻转
rescale: 重缩放因⼦。默认为 None。如果是 None 或 0,不进⾏缩放,否则将数据乘以所提供的值(在应⽤任何其他转换之前)。
rescale的作⽤是对图⽚的每个像素值均乘上这个放缩因⼦,这个操作在所有其它变换操作之前执⾏,在⼀些模型当中,直接输⼊原图的像素值可能会落⼊激活函数
的“死亡区”,因此设置放缩因⼦为1/255,把像素值放缩到0和1之间有利于模型的收敛,避免神经元“死亡”。
preprocessing_function: 这是⽤户⾃定义的函数,应⽤于每个输⼊的函数。这个函数会在任何其他改变之前运⾏。这个函数需要⼀个参数:⼀张图像(秩为 3 的 Numpy 张
量),并且应该输出⼀个同尺⼨的 Numpy 张量。
data_format: 图像数据格式,{"channels_first", "channels_last"} 之⼀。"channels_last" 模式表⽰图像输⼊尺⼨应该为 (samples, height, width, channels),"channels_first"
模式表⽰输⼊尺⼨应该为 (samples, channels, height, width)。默认为在 Keras 配置⽂件 ~/.keras/keras.json 中的 image_data_format 值。如果你从未设置它,那它就是
"channels_last"。
validation_split: 浮点数。Float. 保留⽤于验证的图像的⽐例(严格在0和1之间)。
dtype: ⽣成数组使⽤的数据类型。
ImageDataGenerator类的⼀些⽅法以及处理流程
⼀般的对图像的处理流程(四步⾛)
第⼀步:数据集的划分,得到x_train,y_train,x_test,y_test;
第⼆步:构造ImageDataGenerator对象,其中要进⾏某⼀些操作是通过在构造函数中的参数指定的,
datagen = ImageDataGenerator(......)
第三步:对样本数据进⾏data augmentation处理,通过fit⽅法
注意:这⼀步并不是必须的,当ImageDataGenerator构造函数中需要使⽤featurewise_center: samplewise_center: featurewise_std_normalization:
samplewise_std_normalization:这⼏个参数时才需要使⽤fit⽅法,因为需要从fit⽅法中得到原始图形的统计信息,⽐如均值、⽅差等等,否则是不需要改步骤的。
datagen.fit(x_train) # 使⽤实时数据增益的批数据对模型进⾏拟合
第四步:进⾏训练,通过flow⽅法
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train) / 32, epochs=epochs)
上⾯是⼀般的处理流程,当然有时候会有更加灵活的处理⽅式,后⾯会有例⼦加以说明
ImageDataGenerator的所有⽅法介绍
fit⽅法
fit(x, augment=False, rounds=1, seed=None)
将数据⽣成器⽤于某些样本数据数据。它基于⼀组样本数据,计算与数据转换相关的内部数据统计。当且仅当 featurewise_center 或 featurewise_std_normalization 或
zca_whitening 设置为 True 时才需要。
参数
x: 样本数据。秩应该为 4,即(batch,width,height,channel)的格式。对于灰度数据,通道轴的值应该为 1;对于 RGB 数据,值应该为 3。
augment: 布尔值(默认为 False)。是否使⽤随机样本扩张。
rounds: 整数(默认为 1)。如果数据数据增强(augment=True),表明在数据上进⾏多少次增强。
seed: 整数(默认 None)。随机种⼦。
flow⽅法
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: 输⼊数据。秩为 4 的 Numpy 矩阵或元组。如果是元组,第⼀个元素应该包含图像,第⼆个元素是另⼀个 Numpy 数组或⼀列 Numpy 数组,它们不经过任何修改就
传递给输出。可⽤于将模型杂项数据与图像⼀起输⼊。对于灰度数据,图像数组的通道轴的值应该为 1,⽽对于 RGB 数据,其值应该为 3。
y: 标签。
batch_size: 整数 (默认为 32)。
shuffle: 布尔值 (默认为 True)。
sample_weight: 样本权重。
seed: 整数(默认为 None)。
save_to_dir: None 或字符串(默认为 None)。这使您可以选择指定要保存的正在⽣成的增强图⽚的⽬录(⽤于可视化您正在执⾏的操作)。
save_prefix: 字符串(默认 '')。保存图⽚的⽂件名前缀(仅当 save_to_dir 设置时可⽤)。
save_format: "png", "jpeg" 之⼀(仅当 save_to_dir 设置时可⽤)。默认:"png"。
subset: 数据⼦集 ("training" 或 "validation"),如果在 ImageDataGenerator 中设置了 validation_split。
返回
⼀个⽣成元组 (x, y) 的⽣成器Iterator,其中 x 是图像数据的 Numpy 数组(在单张图像输⼊时),
或 Numpy 数组列表(在额外多个输⼊时),y 是对应的标签的 Numpy 数组。如果 'sample_weight' 不是 None,⽣成的元组形式为 (x, y, sample_weight)。如果 y 是 None,
只有 Numpy 数组 x 被返回。
flow_from_dataframe⽅法
flow_from_dataframe(dataframe, directory, x_col='filename', y_col='class', has_ext=True, target_size=(256, 256), color_mode='rgb', classes=None, class_mode='categorical', batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_pre 输⼊ dataframe 和⽬录的路径,并⽣成批量的增强/标准化的数据。
参数
dataframe: Pandas dataframe,⼀列为图像的⽂件名,另⼀列为图像的类别,或者是可以作为原始⽬标数据多个列。
directory: 字符串,⽬标⽬录的路径,其中包含在 dataframe 中映射的所有图像。
x_col: 字符串,dataframe 中包含⽬标图像⽂件夹的⽬录的列。
y_col: 字符串或字符串列表,dataframe 中将作为⽬标数据的列。
has_ext: 布尔值,如果 dataframe[x_col] 中的⽂件名具有扩展名则为 True,否则为 False。
target_size: 整数元组 (height, width),默认为 (256, 256)。所有到的图都会调整到这个维度。
color_mode: "grayscale", "rbg" 之⼀。默认:"rgb"。图像是否转换为 1 个或 3 个颜⾊通道。
classes: 可选的类别列表 (例如, ['dogs', 'cats'])。默认:None。如未提供,类⽐列表将⾃动从 y_col 中推理出来,y_col 将会被映射为类别索引)。包含从类名到类
索引的映射的字典可以通过属性 class_indices 获得。
class_mode: "categorical", "binary", "sparse", "input", "other" or None 之⼀。默认:"categorical"。决定返回标签数组的类型:
"categorical" 将是 2D one-hot 编码标签,
splitwise"binary" 将是 1D ⼆进制标签,
"sparse" 将是 1D 整数标签,
"input" 将是与输⼊图像相同的图像(主要⽤于与⾃动编码器⼀起使⽤),
"other" 将是 y_col 数据的 numpy 数组,
None, 不返回任何标签(⽣成器只会产⽣批量的图像数据,这对使⽤ model.predict_generator(), mod
el.evaluate_generator() 等很有⽤)。
batch_size: 批量数据的尺⼨(默认:32)。
shuffle: 是否混洗数据(默认:True)
seed: 可选的混洗和转换的随即种⼦。
save_to_dir: None 或 str (默认: None). 这允许你可选地指定要保存正在⽣成的增强图⽚的⽬录(⽤于可视化您正在执⾏的操作)。
save_prefix: 字符串。保存图⽚的⽂件名前缀(仅当 save_to_dir 设置时可⽤)。
save_format: "png", "jpeg" 之⼀(仅当 save_to_dir 设置时可⽤)。默认:"png"。
follow_links: 是否跟随类⼦⽬录中的符号链接(默认:False)。
subset: 数据⼦集 ("training" 或 "validation"),如果在 ImageDataGenerator 中设置了 validation_split。
interpolation: 在⽬标⼤⼩与加载图像的⼤⼩不同时,⽤于重新采样图像的插值⽅法。⽀持的⽅法有 "n
earest", "bilinear", and "bicubic"。如果安装了 1.1.3 以上版本的
PIL 的话,同样⽀持 "lanczos"。如果安装了 3.4.0 以上版本的 PIL 的话,同样⽀持 "box" 和 "hamming"。默认情况下,使⽤ "nearest"
Returns
⼀个⽣成 (x, y) 元组的 DataFrameIterator,其中 x 是⼀个包含⼀批尺⼨为 (batch_size, *target_size, channels) 的图像样本的 numpy 数组,y 是对应的标签的 numpy
数组。
flow_from_directory
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 参数
directory: ⽬标⽬录的路径。每个类应该包含⼀个⼦⽬录。任何在⼦⽬录树下的 PNG, JPG, BMP, PPM 或 TIF 图像,都将被包含在⽣成器中。
target_size: 整数元组 (height, width),默认:(256, 256)。所有的图像将被调整到的尺⼨。
color_mode: "grayscale", "rbg" 之⼀。默认:"rgb"。图像是否被转换成 1 或 3 个颜⾊通道。
classes: 可选的类的⼦⽬录列表(例如 ['dogs', 'cats'])。默认:None。如果未提供,类的列表将⾃动从 directory 下的⼦⽬录名称/结构中推断出来,其中每个⼦⽬录
都将被作为不同的类(类名将按字典序映射到标签的索引)。包含从类名到类索引的映射的字典可以通过 class_indices 属性获得。
class_mode: "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)。
shuffle: 是否混洗数据(默认 True)。
seed: 可选随机种⼦,⽤于混洗和转换。
save_to_dir: None 或字符串(默认 None)。这使你可以最佳地指定正在⽣成的增强图⽚要保存的⽬录(⽤于可视化你在做什么)。
save_prefix: 字符串。保存图⽚的⽂件名前缀(仅当 save_to_dir 设置时可⽤)。
save_format: "png", "jpeg" 之⼀(仅当 save_to_dir 设置时可⽤)。默认:"png"。
follow_links: 是否跟踪类⼦⽬录中的符号链接(默认为 False)。
subset: 数据⼦集 ("training" 或 "validation"),如果在 ImageDataGenerator 中设置了 validation_split。
interpolation: 在⽬标⼤⼩与加载图像的⼤⼩不同时,⽤于重新采样图像的插值⽅法。⽀持的⽅法有 "n
earest", "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 数组。
get_random_transform()
get_random_transform(img_shape, seed=None)
为转换⽣成随机参数。什么意思呢?因为变换的种类很多,实际上就是堆⼀批图⽚到底进⾏了那些变换操作呢?可以通过这个⽅法获得。
参数
seed: 随机种⼦
img_shape: 整数元组。被转换的图像的尺⼨。
返回
包含随机选择的描述变换的参数的字典。返回的字典如下⾯的形式:哪些变换使⽤了,就在字典中添加即可。
random_transform
random_transform(x, seed=None)
将随机变换应⽤于图像。由于变换的种类很多,这⾥是随机使⽤某⼀种变换在图像上⾯
参数
x: 3D 张量,单张图像。(注意,这⾥是单张图⽚哦!)
seed: 随机种⼦。
返回
输⼊的随机转换之后的版本(相同形状)。
standardize⽅法
将标准化配置应⽤于⼀批输⼊。
参数
x: 需要标准化的⼀批输⼊。
返回
标准化后的输⼊。
apply_transform()⽅法
apply_transform(x, transform_parameters)
参数
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.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。