前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ImageDataGenerator

ImageDataGenerator

作者头像
Dean0731
发布2020-05-11 09:58:07
1.6K0
发布2020-05-11 09:58:07
举报
文章被收录于专栏:blog-技术博客blog-技术博客

一、ImageDataGenerator类的定义以及构造函数的参数详解

1.1 ImageDataGenerator类的简单介绍

class ImageDataGenerator(object):

代码语言:javascript
复制
"""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个样本数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。

总结起来就是两个点:

(1)图片生成器,负责生成一个批次一个批次的图片,以生成器的形式给模型训练;

(2)对每一个批次的训练图片,适时地进行数据增强处理(data augmentation);

1.2 数据增强处理(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轴)的垂直距离成正比。

1.3 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: 浮点数。剪切强度(以弧度逆时针方向剪切角度)。

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

brightness_range: 两个浮点数组成的元组或者是列表,像素的亮度会在这个范围之类随机确定

zoom_range: 浮点数 或 [lower, upper]。随机缩放范围。如果是浮点数,[lower, upper] = [1-zoom_range, 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: 布尔值。随机垂直翻转。

代码语言:javascript
复制
    需要注意的是:既然是每次随机进行翻转,随机对图片执行水平或者是垂直翻转操作,意味着不一定对所有图片都会执行水平翻转或垂直翻转,每次生成均是随机选取图片进行翻转

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类的一些方法以及处理流程

2.1 ImageDataGenerator的一些方法概览

def init(self,

def flow(self, x,

def flow_from_directory(self, directory,

def flow_from_dataframe(self, dataframe, directory,

def standardize(self, x):

def get_random_transform(self, img_shape, seed=None):

def apply_transform(self, x, transform_parameters):

def random_transform(self, x, seed=None):

def fit(self, x,

2.2 一般的对图像的处理流程(四步走)

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

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

代码语言:javascript
复制
                      datagen = ImageDataGenerator(......)

(3)第三步:对样本数据进行data augmentation处理,通过fit方法

注意:这一步并不是必须的,当ImageDataGenerator构造函数中需要使用

featurewise_center:

samplewise_center:

featurewise_std_normalization:

samplewise_std_normalization:

这几个参数时才需要使用fit方法,因为需要从fit方法中得到原始图形的统计信息,比如均值、方差等等,否则是不需要改步骤的。

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) 上面是一般的处理流程,当然有时候会有更加灵活的处理方式,后面会有例子加以说明

2.3 ImageDataGenerator的所有方法介绍

(1)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)。随机种子。

(2)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 被返回。

(3)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_prefix='', save_format='png', subset=None, interpolation='nearest')

输入 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 编码标签,

"binary" 将是 1D 二进制标签,

"sparse" 将是 1D 整数标签,

"input" 将是与输入图像相同的图像(主要用于与自动编码器一起使用),

"other" 将是 y_col 数据的 numpy 数组,

None, 不返回任何标签(生成器只会产生批量的图像数据,这对使用 model.predict_generator(), model.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: 在目标大小与加载图像的大小不同时,用于重新采样图像的插值方法。 支持的方法有 "nearest", "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 数组。

(4)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, interpolation='nearest')

参数

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: 在目标大小与加载图像的大小不同时,用于重新采样图像的插值方法。 支持的方法有 "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)

为转换生成随机参数。什么意思呢?因为变换的种类很多,实际上就是堆一批图片到底进行了那些变换操作呢?可以通过这个方法获得。

参数

seed: 随机种子

img_shape: 整数元组。被转换的图像的尺寸。

返回

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

transform_parameters = {'theta': theta,

代码语言:javascript
复制
                            '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, seed=None)

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

参数

x: 3D 张量,单张图像。(注意,这里是单张图片哦!)

seed: 随机种子。

返回

输入的随机转换之后的版本(相同形状)。

(7)standardize方法

standardize(x)

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

参数

x: 需要标准化的一批输入。

返回

标准化后的输入。

(8)apply_transform()方法

apply_transform(x, transform_parameters)

参数:

x: 3D tensor, single image.这里也是针对单张图片的

transform_parameters:它是一个字典形式的参数,表示要使用哪些变换,字典的键如下所示:

代码语言:javascript
复制
            - `'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.
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档