Tensorflow2 图像预处理部分详解
本文基于Tensorflow2官方文档(https://tensorflow.google.cn/api_docs/python/tf/keras/preprocessing/image )编写并配合相应的测试代码。
tensorflow2提供了一系列实时的图像增强方法。
TF提供了4个类和14个方法。四个类主要是批量的获取图像数据以及数据增强:
DirectoryIterator:能够迭代的从硬盘中读取图片(可以使用增强器)
Iterator
:基本图片数据迭代器(不可以使用增强器)
NumpyArrayIterator:从Numpy数据格式迭代生成数据
(可以使用图像增强器)
ImageDataGenerator
:进行数据增强后生成批量数据
本篇博客中主要介绍“tf.keras.preprocessing.image.ImageDataGenerator”的用法。
这个类用于图像数据增强,可以进行以batch为单位,实时图像增强。这个也是个人在图像预处理部分最为常用的。
官网提供的参数有
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. 对输入的图片每个通道减去每个通道对应均值。
- samplewise_center: Boolan. 每张图片减去样本均值, 使得每个样本均值为0。
- featurewise_std_normalization(): Boolean()
- samplewise_std_normalization(): Boolean()
- zca_epsilon(): Default 12-6
- zca_whitening: Boolean. 去除样本之间的相关性
- rotation_range(): 旋转范围
- width_shift_range(): 水平平移范围
- height_shift_range(): 垂直平移范围
- shear_range(): float, 透视变换的范围
- zoom_range(): 缩放范围
- fill_mode: 填充模式, constant, nearest, reflect
- cval: fill_mode == 'constant’的时候填充值
- horizontal_flip(): 水平反转
- vertical_flip(): 垂直翻转
- preprocessing_function(): user提供的处理函数
- data_format(): channels_first或者channels_last
- validation_split(): 多少数据用于验证集
利用初始化参数生成一个ImageDataGenerator对象,通过调用对象中的方法可以帮助我们简单的完成图像预处理以及传入model.fit中。
ImageDataGenerator对象有8个方法。分别是:
apply_transform:根据给定参数转换图像
输入数据为图像,输出数据为转换后的图像。其中参数给定时使用字典形式
test_img="7.jpg"
img=cv.imread(test_img)
cv.imshow("org",img)
transform=datagen.apply_transform(img, {'flip_vertical' : True})
cv.imshow("res",transform)
cv.waitKey(0)
fit:计算中间数据,仅当对象使用featurewise_center
或featurewise_std_normalization
或 zca_whitening时使用。
flow:根据图像数据和标签数据进行批次数据增强。代码如下:
for x_batch,y_batch in datagen.flow(train_img,train_label,batch_size=2):
print(y_batch[0])
cv.imshow("img",x_batch[0])
cv.waitKey(0)
batches += 1
if batches >= len(train_img) / 2:
# we need to break the loop by hand because
# the generator loops indefinitely
break
这里需要注意的是,如果不break的话,会一直迭代下去,不会自动结束。
flow_from_dataframe:根据文件获取图像和标签。这里需要注意的是,返回值一个生成 (x, y) 元组的 DataFrameIterator, 其中
x 是一个包含一批尺寸为 (batch_size, *target_size, channels) 的图像样本的 numpy 数组,
y 是对应的标签的 numpy 数组。
flow_from_directory:这个方法最为常用,因此详细解析每个参数的作用,如下(参考https://blog.csdn.net/qq_31119155/article/details/90170755):
返回值一个生成 (x, y) 元组的 DataFrameIterator, 其中
x 是一个包含一批尺寸为 (batch_size, *target_size, channels) 的图像样本的 numpy 数组,
y 是对应的标签的 numpy 数组。
flow_from_directory(self,
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', "png", "jpeg" 之一(仅当 save_to_dir 设置时可用)。默认:"png"。
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"。)
get_random_transform:随机生成参数,返回字典
random_transform:输入图片,返回随机生成的图片
standazdize:直接修改原图进行归一化
后面简单介绍一下14个方法,
apply_affine_transform(...)
: 根据参数使用线性变换
apply_brightness_shift(...)
: 亮度转换
apply_channel_shift(...)
: 通道转换
array_to_img(...)
: 3d数组转PIL图像
img_to_array(...)
: PIL转Numpy数组
load_img(...)
: 图像加载为PIL格式
random_brightness(...)
: 随机亮度偏移
random_channel_shift(...)
: 随机通道切换
random_rotation(...)
: 随机旋转
random_shear(...)
:随机剪裁
random_shift(...)
: 随机偏移
random_zoom(...)
: 随即缩放
save_img(...)
: 将图片作为np数组存放
smart_resize(...)
: 将图像调整为目标尺寸,智能剪裁,不会造成宽高比失真