参考:https://mp.weixin.qq.com/s/OjKQBRwXL4xsBdehzRWDKg
总结:
利用keras ImageDataGenerator
:做一些简单的旋转、变形、归一化等
ImageDataGenerator()
是keras.preprocessing.image
模块中的图片生成器,同时也可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等。(不像GAN系列从无到有生成新图像)
它所能实现的功能且看下面的详细部分吧:
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, #浮点数 或 [lower, upper]。随机缩放范围
channel_shift_range=0.0, #浮点数。随机通道转换的范围。
fill_mode='nearest', # {"constant", "nearest", "reflect" or "wrap"} 之一。默认为 'nearest'。输入边界以外的点根据给定的模式填充:
cval=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=None,
validation_split=0.0,
dtype=None)
单幅图像的增强代码:
import os
from keras.preprocessing.image import ImageDataGenerator,load_img,img_to_array,array_to_img
class Augmentation(object):
def __init__(self,img_type="png"):
self.datagen=ImageDataGenerator(
#rotation_range=1.2,
#width_shift_range=0.05,
height_shift_range=0.05,
# shear_range=0.05,
# zoom_range=0.05,
# horizontal_flip=True,
fill_mode='nearest')
def augmentation(self):
# 读入3通道的train和label, 分别转换成矩阵, 然后将label的第一个通道放在train的第2个通处, 做数据增强
print("运行 Augmentation")
# Start augmentation.....
img_t = load_img("../one/img/0.png") # 读入train
img_l = load_img("../one/label/0.png") # 读入label
x_t = img_to_array(img_t) # 转换成矩阵
x_l = img_to_array(img_l)
x_t[:, :, 2] = x_l[:, :, 0] # 把label当做train的第三个通道
#x_t = x_t[..., [2,0,1]]#image-102,120,210
img_tmp = array_to_img(x_t)
img_tmp.save("../one/merge/0.png") # 保存合并后的图像
img = x_t
img = img.reshape((1,) + img.shape) # 改变shape(1, 512, 512, 3)
savedir = "../one/aug_merge" # 存储合并增强后的图像
if not os.path.lexists(savedir):
os.mkdir(savedir)
print("running %d doAugmenttaion" % 0)
self.do_augmentate(img, savedir, str(0)) # 数据增强
def do_augmentate(self, img, save_to_dir, save_prefix, batch_size=1, save_format='png', imgnum=30):
# augmentate one image
datagen = self.datagen
i = 0
for _ in datagen.flow(
img,
batch_size=batch_size,
save_to_dir=save_to_dir,
save_prefix=save_prefix,
save_format=save_format):
i += 1
if i > imgnum:
break
if __name__=="__main__":
aug=Augmentation()
aug.augmentation()