Keras非常便捷的提供了图片预处理的类--ImageDataGenerator 可以用这个图片生成器生成一个batch周期内的数据,它支持实时的数据扩展,训练的时候会无限生成数据,一直到达设定的epoch次数才停止。
- ImageDataGeneoator()常用参数:
- rotation_range:整数,数据扩展时图片随机转动的角度
- width_shift_range:浮点数,图片宽度的某个比例,数据扩展时图片水 平偏移的幅度
- height_shift_range:浮点数,图片高度的某个比例,数据扩展时图片 竖直偏移的幅度
- shear_range:浮点数,剪切强度(按逆时针方向的剪切变换角度)
- zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度。若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1 zoom_range]
- horizontal_flip:布尔值,进行随机水平翻转
- vertical_flip:布尔值,进行随机竖直翻转
- rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
- fill_mode:‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
- ImageDataGeneoator()的方法:
- fit():计算依赖于数据的变换所需要的统计信息(均值方差等),只有使用featurewise_center,featurewise_std_normalization或zca_whitening参数时需要此函数。
- flow(): 接收numpy数组和标签为参数,生成经过数据扩展或标准化后的batch数据,并在一个无限循环中不断的返回数据
- flow_from_directory() :以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生数据
- 图片数据扩展举例: 在数据集不够多的情况下,可以使用ImageDataGenerator()来扩大数据集防止搭建的网络出现过拟合现象。
from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array
from glob import glob
import matplotlib.pyplot as plt
import cv2
import numpy as np
# 图片生成器
datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
# 打印转换前的图片
img = load_img('dog-project-master/kaggle/train/cat/cat.4.jpg')
plt.imshow(img)
plt.title('Before:')
plt.show()
# 将图片转换为数组,并重新设定形状
x = img_to_array(img)
x = x.reshape((1,) x.shape)
# x的形状重组为(1,width,height,channels),第一个参数为batch_size
# 这里人工设置停止生成, 并保存图片用于可视化
i = 0
for batch in datagen.flow(x,batch_size=1,save_to_dir='E://udacity-dl/transform_cat',save_prefix='cat',save_format='png'):
i =1
if i > 3 :
break # 如果不设置,生成器会不断的生成图片
# 打印转换后的图片
cat_images = np.array(glob("transform_cat/*"))
cat_image = cv2.imread(cat_images[1])
plt.imshow(cat_image)
plt.title("After1")
plt.show()
cat_image2 = cv2.imread(cat_images[2])
plt.imshow(cat_image2)
plt.title("After2")
plt.show()
cat_image3 = cv2.imread(cat_images[3])
plt.imshow(cat_image3)
plt.title("After3")
plt.show()
- 实时生成数据集用于训练 经常会和函数式模型Model()的API---.fit_generator()配合使用,在训练中实时地生成数据。
1)和.flow()配合使用
代码语言:javascript复制(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
datagen = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)
# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(x_train)
# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
steps_per_epoch=len(x_train), epochs=epochs)
# here's a more "manual" example
for e in range(epochs):
print 'Epoch', e
batches = 0
for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
loss = model.train(x_batch, y_batch)
batches = 1
if batches >= len(x_train) / 32:
# we need to break the loop by hand because
# the generator loops indefinitely
break
2)和.flow_from_directory() 配合使用
代码语言:javascript复制train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(150, 150),
batch_size=32,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
'data/validation',
target_size=(150, 150),
batch_size=32,
class_mode='binary')
model.fit_generator(
train_generator,
steps_per_epoch=2000,
epochs=50,
validation_data=validation_generator,
validation_steps=800)
参考资料:
- Keras中文文档--图片预处理
- glob文件路径查找模块
- Building powerful image classification models using very little data By Francois Chollet