最近经常使用keras进行图像分割,小数据量时很方便,直接准备好image和mask,然后
model.fit(x_train, y_train, batch_size=32, epochs=10)
比较简单,但是这只是在小数据量的情况下使用。遇到大数据量,一次存入所有图像和mask会内存不够。在keras中文文档中写到了利用图片生成器ImageDataGenerator的方法,但是第一个例子和第二个例子是关于图像分类的,在最后一个例子和图像分割有关,放上代码:
# we create two instances with the same arguments
data_gen_args = dict(featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=90.,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.2)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
# Provide the same seed and keyword arguments to the fit and flow methods
seed = 1
image_datagen.fit(images, augment=True, seed=seed)
mask_datagen.fit(masks, augment=True, seed=seed)
image_generator = image_datagen.flow_from_directory(
'data/images',
class_mode=None,
seed=seed)
mask_generator = mask_datagen.flow_from_directory(
'data/masks',
class_mode=None,
seed=seed)
# combine generators into one which yields image and masks
train_generator = zip(image_generator, mask_generator)
model.fit_generator(
train_generator,
steps_per_epoch=2000,
epochs=50)
这段代码在用的时候会有问题,首先是image_datagen.flow_from_directory和mask_datagen.flow_from_directory的文件位置不行,一定要在后面加一个/0文件夹,图像和mask分别放入两个/0文件夹中,我这次是二分类任务,所以/0就够了,多分类没试过。/0的问题可能就是.flow_from_directory()的要求,但是图像分割时不是很方便。
二是zip那里会载入过慢,因为是大数据量,所以使用itertools.izip(),这样这段代码应该就能用了。
还有一些方法,一个是生成器全部自己写,写好后放到train_generator()那里,因为train_generator()本身就是一个生成器。
但是想用ImageDataGenerator()扩充数据的话可以利用.flow()方法
data_gen_args = dict(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
#zca_epsilon=1e-6,
rotation_range=0.,
width_shift_range=0,
height_shift_range=0,
shear_range=0.1,
zoom_range=0.1,
channel_shift_range=0.,
fill_mode='constant',
cval=0,
horizontal_flip=True,
vertical_flip=True,
rescale=None,
preprocessing_function=None,
data_format=KTF.image_data_format()
)
seed=102
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
result_generator = itertools.izip(image_datagen.flow(X_train, batch_size=BATCH_SIZE,seed=seed), mask_datagen.flow(Y_train, batch_size=BATCH_SIZE,seed=seed))
有个地方注意,一定要加seed,否则会出现image和mask对不上号的情况。