深度学习CV-图像数据增强方法

参考: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()

猜你喜欢

转载自blog.csdn.net/weixin_44474718/article/details/92581018
今日推荐