keras如何批量读取图片_在图像分割任务中Keras读取大量数据的方法

最近经常使用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对不上号的情况。

你可能感兴趣的:(keras如何批量读取图片)