最近經常使用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對不上號的情況。

推薦閱讀:

相关文章