在使用keras 进行图像分割时,当数据量不大时,我们需要进行图像增加。在keras 中有专门的函数可以进行增强。这里进行简单的介绍一下。
keras 中图像增强的函数是ImageDataGenerator 类
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,
brightness_range=None,
shear_range=0.0,
zoom_range=0.0,
channel_shift_range=0.0,
fill_mode='nearest',
cval=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=None,
validation_split=0.0,
dtype=None)
通过实时数据增强生成张量图像数据批次。数据将不断循环(按批次)。这里如果是其他的问题我们可以直接使用这个函数来进行增强很方便。但是在进行图像分割时需要一个问题,那就是有data 和 label 两类。你需要同时对这个数据进行处理。比如旋转什么的。因此在这里简单的介绍一下。
IMAGE_LIB = '../input/2d_images/'
MASK_LIB = '../input/2d_masks/'
SEED=42
all_images = [x for x in sorted(os.listdir(IMAGE_LIB)) if x[-4:] == '.tif']
x_data = np.empty((len(all_images), IMG_HEIGHT, IMG_WIDTH), dtype='float32')
for i, name in enumerate(all_images):
im = cv2.imread(IMAGE_LIB + name, cv2.IMREAD_UNCHANGED).astype("int16").astype('float32')
#im = cv2.resize(im, dsize=(IMG_WIDTH, IMG_HEIGHT), interpolation=cv2.INTER_LANCZOS4)
im = (im - np.min(im)) / (np.max(im) - np.min(im))
x_data[i] = im
y_data = np.empty((len(all_images), IMG_HEIGHT, IMG_WIDTH), dtype='float32')
for i, name in enumerate(all_images):
im = cv2.imread(MASK_LIB + name, cv2.IMREAD_UNCHANGED).astype('float32')/255.
#im = cv2.resize(im, dsize=(IMG_WIDTH, IMG_HEIGHT), interpolation=cv2.INTER_NEAREST)
y_data[i] = im
这样就把数据读入进去了也进行简单的处理。当然你可以看一下这个数据是什么样。
fig, ax = plt.subplots(1,2, figsize = (8,4))
ax[0].imshow(x_data[0], cmap='gray')
ax[1].imshow(y_data[0], cmap='gray')
plt.show()
下面进行数据的增强
def my_generator(x_train, y_train, batch_size):
data_generator = ImageDataGenerator(
width_shift_range=0.1,
height_shift_range=0.1,
rotation_range=10,
zoom_range=0.1).flow(x_train, x_train, batch_size, seed=SEED)
mask_generator = ImageDataGenerator(
width_shift_range=0.1,
height_shift_range=0.1,
rotation_range=10,
zoom_range=0.1).flow(y_train, y_train, batch_size, seed=SEED)
while True:
x_batch, _ = data_generator.next()
y_batch, _ = mask_generator.next()
yield x_batch, y_batch
当然这里具体的增强方法,你可以参考上面的函数,具体的添加一下方法。
当然你也可以具体看一下是什么样。
image_batch, mask_batch = next(my_generator(x_train, y_train, 8))
fix, ax = plt.subplots(8,2, figsize=(8,20))
for i in range(8):
ax[i,0].imshow(image_batch[i,:,:,0])
ax[i,1].imshow(mask_batch[i,:,:,0])
plt.show()
最后在keras中呢整个网络设计好了以后。可以直接调用
hist = model.fit_generator(my_generator(x_train, y_train, 8),
steps_per_epoch = 200,
validation_data = (x_val, y_val),
epochs=10, verbose=2,
callbacks = [weight_saver, annealer])
这样就可以调用了。这里的一些具体的参数。你可以按照自己的要求进行设置。