当需要对指定文件夹下的图片进行数据增广时,使用keras的ImageDataGenerator类的flow_from_directory()方法可快速的实现
1.首先实例化ImageDataGenerator对象以自己想要的属性
img_datagen = 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,
shear_range=0.0,
zoom_range=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None, )
对于数据增强主要可能用到的属性如下,按自己的需求设置即可:
featurewise_center: 布尔值。将输入数据的均值设置为 0,逐特征进行。
samplewise_center: 布尔值。将每个样本的均值设置为 0。
featurewise_std_normalization: Boolean. 布尔值。将输入除以数据标准差,逐特征进行。
samplewise_std_normalization: 布尔值。将每个输入除以其标准差。
zca_epsilon: ZCA 白化的 epsilon 值,默认为 1e-6。
zca_whitening: 布尔值。是否应用 ZCA 白化。
rotation_range: 整数。随机旋转的度数范围。
width_shift_range: 浮点数、一维数组或整数
height_shift_range: 浮点数、一维数组或整数
shear_range: 浮点数。剪切强度(以弧度逆时针方向剪切角度)。
zoom_range: 浮点数 或 [lower, upper]。随机缩放范围。
channel_shift_range: 浮点数。随机通道转换的范围。
horizontal_flip: 布尔值。随机水平翻转。
vertical_flip: 布尔值。随机垂直翻转。
2. 调用flow_from_directory()函数
train_generator = train_datagen.flow_from_directory(
directory = img_path,
target_size=(224, 224),
batch_size= batch_size,
save_to_dir= "./data/test_data/",
class_mode= class_mode)
可选参数如下
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 之一。对于只进行数据增强,设置为None.
batch_size: 一批数据的大小(默认 32)。
save_to_dir: None 或 字符串(默认 None)。图片保存目录!!!
save_prefix: 字符串。 保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
save_format: “png”, “jpeg” 之一(仅当 save_to_dir 设置时可用)。默认:“png”。
interpolation: 在目标大小与加载图像的大小不同时,用于重新采样图像的插值方法。
3.小例子
注意事项: 1:class_mode设置为None,只生成图像 2:一定要调用生成器,写了个for循环一直调用(但是好像不会停,可以写个计数让它停下啦)
import keras
from keras_preprocessing.image import ImageDataGenerator
def generate_from_derictory(img_path,batch_size,class_mode = None):
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
featurewise_center=True,
samplewise_center= True,
featurewise_std_normalization= True,
samplewise_std_normalization= True,
zca_whitening= True,
zca_epsilon=1e-06,
rotation_range=0.3,
width_shift_range=0.3,
height_shift_range=0.3,
brightness_range=None,
channel_shift_range=0.2,
fill_mode='nearest',
cval=0.0,
horizontal_flip=True,
vertical_flip= True,
validation_split=0.0
)
train_generator = train_datagen.flow_from_directory(
directory=img_path,
target_size=(224, 224),
batch_size= batch_size,
save_to_dir= "./data/aug_data/",
class_mode= class_mode)
return train_generator
data_gen = generate_from_derictory('./data/train_data/',64,None)
for im in data_gen:
print("do some thing")