def randomDataAugument(self, num_trans): # 以下で定義する変換処理の内ランダムに幾つかの処理を選択 seq = iaa.SomeOf(num_trans, [ iaa.Affine(rotate=(-90, 90), order=1, mode="edge"), iaa.Fliplr(1.0), iaa.OneOf([ # 同じ系統の変換はどれか1つが起きるように 1つにまとめる iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge") ]), iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, order=1, mode="edge"), iaa.OneOf([ iaa.AdditiveGaussianNoise(scale=[0.05 * 255, 0.2 * 255]), iaa.AdditiveLaplaceNoise(scale=[0.05 * 255, 0.2 * 255]), iaa.AdditivePoissonNoise(lam=(16.0, 48.0), per_channel=True) ]), iaa.OneOf([ iaa.LogContrast((0.5, 1.5)), iaa.LinearContrast((0.5, 2.0)) ]), iaa.OneOf([ iaa.GaussianBlur(sigma=(0.5, 1.0)), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)) ]), iaa.Invert(1.0) ], random_order=True) return seq
def data_aug(images): seq = iaa.Sometimes( 0.5, iaa.Identity(), iaa.Sometimes( 0.5, iaa.Sequential([ iaa.Sometimes( 0.5, iaa.OneOf([ iaa.AdditiveGaussianNoise(scale=(0, 0.1 * 255)), iaa.AdditiveLaplaceNoise(scale=(0, 0.1 * 255)), iaa.ReplaceElementwise(0.03, [0, 255]), iaa.GaussianBlur(sigma=(0.0, 3.0)), iaa.BilateralBlur(d=(3, 10), sigma_color=(10, 250), sigma_space=(10, 250)) ])), iaa.OneOf([ iaa.Add((-40, 40)), iaa.AddElementwise((-20, 20)), iaa.pillike.EnhanceBrightness() ]), iaa.OneOf([ iaa.GammaContrast((0.2, 2.0)), iaa.SigmoidContrast(gain=(3, 10), cutoff=(0.4, 0.6)), iaa.LogContrast(gain=(0.6, 1.4)), iaa.AllChannelsCLAHE(), iaa.Sharpen(alpha=(0.0, 1.0), lightness=(0.75, 2.0)), ]) ]))) images = seq(images=images) return images
def imgaugRGB(img): print(img.shape) seq = iaa.Sequential( [ # blur iaa.SomeOf((0, 2), [ iaa.GaussianBlur((0.0, 2.0)), iaa.AverageBlur(k=(3, 7)), iaa.MedianBlur(k=(3, 7)), iaa.BilateralBlur(d=(1, 7)), iaa.MotionBlur(k=(3, 7)) ]), #color iaa.SomeOf( (0, 2), [ #iaa.WithColorspace(), iaa.AddToHueAndSaturation((-20, 20)), #iaa.ChangeColorspace(to_colorspace[], alpha=0.5), iaa.Grayscale(alpha=(0.0, 0.2)) ]), #brightness iaa.OneOf([ iaa.Sequential([ iaa.Add((-10, 10), per_channel=0.5), iaa.Multiply((0.5, 1.5), per_channel=0.5) ]), iaa.Add((-10, 10), per_channel=0.5), iaa.Multiply((0.5, 1.5), per_channel=0.5), iaa.FrequencyNoiseAlpha(exponent=(-4, 0), first=iaa.Multiply( (0.5, 1.5), per_channel=0.5), second=iaa.ContrastNormalization( (0.5, 2.0), per_channel=0.5)) ]), #contrast iaa.SomeOf((0, 2), [ iaa.GammaContrast((0.5, 1.5), per_channel=0.5), iaa.SigmoidContrast( gain=(0, 10), cutoff=(0.25, 0.75), per_channel=0.5), iaa.LogContrast(gain=(0.75, 1), per_channel=0.5), iaa.LinearContrast(alpha=(0.7, 1.3), per_channel=0.5) ]), #arithmetic iaa.SomeOf((0, 3), [ iaa.AdditiveGaussianNoise(scale=(0, 0.05), per_channel=0.5), iaa.AdditiveLaplaceNoise(scale=(0, 0.05), per_channel=0.5), iaa.AdditivePoissonNoise(lam=(0, 8), per_channel=0.5), iaa.Dropout(p=(0, 0.05), per_channel=0.5), iaa.ImpulseNoise(p=(0, 0.05)), iaa.SaltAndPepper(p=(0, 0.05)), iaa.Salt(p=(0, 0.05)), iaa.Pepper(p=(0, 0.05)) ]), #iaa.Sometimes(p=0.5, iaa.JpegCompression((0, 30)), None), ], random_order=True) return seq.augment_image(img)
def load_aug(): sometimes = lambda aug: iaa.Sometimes(0.3, aug) seq[0] = iaa.Sequential( [ # execute 0 to 5 of the following (less important) augmenters per image # don't execute all of them, as that would often be way too strong iaa.SomeOf( (0, 5), [ iaa.CropAndPad(percent=(-0.2, 0.2), pad_mode=ia.ALL, pad_cval=(0, 255)), iaa.Crop(percent=0.25, keep_size=True), iaa.OneOf([ iaa.GaussianBlur( (0, 0.2 )), # blur images with a sigma between 0 and 2.0 iaa.AverageBlur(k=(2, 3)), # blur image using local means iaa.MedianBlur( k=(1, 3)), # blur image using local medians ]), iaa.Sharpen(alpha=(0, 0.5), lightness=(0.75, 1.5)), # sharpen images iaa.Emboss(alpha=(0, 0.5), strength=(0, 0.5)), # emboss images # search either for all edges or for directed edges, iaa.AdditiveGaussianNoise( loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5), # add gaussian noise to images iaa.Add( (-10, 10), per_channel=0.5 ), # change brightness of images (by -10 to 10 of original value) iaa.AddToHueAndSaturation( (-10, 10)), # change hue and saturation # either change the brightness of the whole image (sometimes # per channel) or change the brightness of subareas iaa.contrast.LinearContrast( (0.5, 2.0), per_channel=0.5), # improve or worsen the contrast iaa.Grayscale(alpha=(0.0, 0.5)), iaa.AdditiveLaplaceNoise(scale=0.05 * 255), iaa.AdditivePoissonNoise(lam=2), iaa.Multiply(mul=(0.5, 1.5)), iaa.Dropout(p=(0.1, 0.2)), iaa.CoarseDropout(p=0.1, size_percent=0.05), iaa.MotionBlur(k=3), iaa.LinearContrast(), iaa.AveragePooling(2) ], random_order=True) ], random_order=True)
def __init__(self): sometimes = lambda aug: iaa.Sometimes(0.3, aug) self.aug = iaa.Sequential( iaa.SomeOf( (1, 5), [ # blur sometimes( iaa.OneOf([ iaa.GaussianBlur(sigma=(0, 1.0)), iaa.MotionBlur(k=3), iaa.AdditiveGaussianNoise(scale=(0, .1 * 255)), iaa.AdditiveLaplaceNoise(scale=(0, .1 * 255)) ])), # color sometimes( iaa.AddToHueAndSaturation(value=(-10, 10), per_channel=True)), sometimes( iaa.SigmoidContrast(gain=(3, 10), cutoff=(0.4, 0.6), per_channel=True)), sometimes(iaa.Invert(0.25, per_channel=0.5)), sometimes(iaa.Solarize(0.5, threshold=(32, 128))), sometimes(iaa.Dropout2d(p=0.5)), sometimes(iaa.Multiply((0.5, 1.5), per_channel=0.5)), sometimes(iaa.Add((-40, 40), per_channel=0.5)), sometimes(iaa.JpegCompression(compression=(5, 80))), # distort sometimes( iaa.Crop(percent=(0.01, 0.05), sample_independently=True)), sometimes(iaa.PerspectiveTransform(scale=(0.01, 0.01))), sometimes( iaa.Affine( scale=(0.7, 1.3), translate_percent=(-0.1, 0.1), # rotate=(-5, 5), shear=(-5, 5), order=[0, 1], cval=(0, 255), mode=ia.ALL)), sometimes(iaa.ElasticTransformation(alpha=50, sigma=20)), sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.02))), sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.01))), sometimes( iaa.OneOf([ iaa.Dropout(p=(0, 0.1)), iaa.CoarseDropout(p=(0, 0.1), size_percent=(0.02, 0.25)) ])), ], random_order=True), random_order=True)
def __call__(self, data): tensor = data[self.type].astype(np.float32) tensor = tensor[:, :, np.newaxis] additive_guasian = iaa.AdditiveGaussianNoise( scale=(0.01, 0.04)).augment_image additive_laplacian = iaa.AdditiveLaplaceNoise( scale=(0.01, 0.04)).augment_image dropout = iaa.Dropout(p=(0.0, 0.1)).augment_image random_blur = transforms.RandomChoice( [additive_guasian, additive_laplacian, dropout]) data[self.type] = random_blur(tensor).squeeze(2) return data
def __init__(self, ): import imgaug.augmenters as ia self.default_deg_templates = { 'sr4x': ia.Sequential([ # It's almost like a 4x bicubic downsampling ia.Resize((0.25000, 0.25001), cv2.INTER_AREA), ia.Resize({ 'height': 512, 'width': 512 }, cv2.INTER_CUBIC), ]), 'sr4x8x': ia.Sequential([ ia.Resize((0.125, 0.25), cv2.INTER_AREA), ia.Resize({ 'height': 512, 'width': 512 }, cv2.INTER_CUBIC), ]), 'denoise': ia.OneOf([ ia.AdditiveGaussianNoise(scale=(20, 40), per_channel=True), ia.AdditiveLaplaceNoise(scale=(20, 40), per_channel=True), ia.AdditivePoissonNoise(lam=(15, 30), per_channel=True), ]), 'deblur': ia.OneOf([ ia.MotionBlur(k=(10, 20)), ia.GaussianBlur((3.0, 8.0)), ]), 'jpeg': ia.JpegCompression(compression=(50, 85)), '16x': Mosaic16x(), } rand_deg_list = [ self.default_deg_templates['deblur'], self.default_deg_templates['denoise'], self.default_deg_templates['jpeg'], self.default_deg_templates['sr4x8x'], ] self.default_deg_templates['face_renov'] = ia.Sequential( rand_deg_list, random_order=True)
def do_all_aug(image): do_aug(image, iaa.Noop(name="origin")) do_aug(image, iaa.Crop((0, 10))) # 切边 do_aug(image, iaa.GaussianBlur((0, 3))) do_aug(image, iaa.AverageBlur(1, 7)) do_aug(image, iaa.MedianBlur(1, 7)) do_aug(image, iaa.Sharpen()) do_aug(image, iaa.BilateralBlur()) # 既噪音又模糊,叫双边 do_aug(image, iaa.MotionBlur()) do_aug(image, iaa.MeanShiftBlur()) do_aug(image, iaa.GammaContrast()) do_aug(image, iaa.SigmoidContrast()) do_aug(image, iaa.Affine(shear={ 'x': (-10, 10), 'y': (-10, 10) }, mode="edge")) # shear:x轴往左右偏离的像素书,(a,b)是a,b间随机值,[a,b]是二选一 do_aug(image, iaa.Affine(shear={ 'x': (-10, 10), 'y': (-10, 10) }, mode="edge")) # shear:x轴往左右偏离的像素书,(a,b)是a,b间随机值,[a,b]是二选一 do_aug(image, iaa.Rotate(rotate=(-10, 10), mode="edge")) do_aug(image, iaa.PiecewiseAffine()) # 局部点变形 do_aug(image, iaa.Fog()) do_aug(image, iaa.Clouds()) do_aug(image, iaa.Snowflakes(flake_size=(0.1, 0.2), density=(0.005, 0.025))) do_aug( image, iaa.Rain( nb_iterations=1, drop_size=(0.05, 0.1), speed=(0.04, 0.08), )) do_aug( image, iaa.ElasticTransformation(alpha=(0.0, 20.0), sigma=(3.0, 5.0), mode="nearest")) do_aug(image, iaa.AdditiveGaussianNoise(scale=(0, 10))) do_aug(image, iaa.AdditiveLaplaceNoise(scale=(0, 10))) do_aug(image, iaa.AdditivePoissonNoise(lam=(0, 10))) do_aug(image, iaa.Salt((0, 0.02))) do_aug(image, iaa.Pepper((0, 0.02)))
def randomTestAugument(self, NUM_TRANS): # 本番環境の危機から取得したデータにノイズが乗っていた状態を想定して変換 seq = iaa.SomeOf( NUM_TRANS, [ iaa.Affine(rotate=(-90, 90), order=1, mode="edge"), iaa.Fliplr(1.0), iaa.OneOf([ # 同じ系統の変換はどれか1つが起きるように 1つにまとめる iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge") ]), iaa.Affine(scale={ "x": (0.8, 1.2), "y": (0.8, 1.2) }, order=1, mode="edge"), iaa.OneOf([ iaa.AdditiveGaussianNoise(scale=[0.05 * 255, 0.2 * 255]), iaa.AdditiveLaplaceNoise(scale=[0.05 * 255, 0.2 * 255]), iaa.AdditivePoissonNoise(lam=(16.0, 48.0), per_channel=True) ]), iaa.OneOf([ iaa.LogContrast((0.5, 1.5)), iaa.LinearContrast((0.5, 2.0)) ]), iaa.OneOf([ iaa.GaussianBlur(sigma=(0.5, 1.0)), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)) ]), # iaa.Invert(1.0) # 色反転は故障しすぎでしょう.. ], random_order=True) return seq
def get_augmenter(): sometimes = lambda aug: iaa.Sometimes(0.7, aug) augmenter = iaa.Sequential([ sometimes( iaa.OneOf([ iaa.GaussianBlur((0.8, 1.2)), iaa.AdditiveGaussianNoise( loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5), iaa.AveragePooling([2, 2]), iaa.Sharpen(alpha=(0.0, 0.5), lightness=(0.75, 2.0)), iaa.AdditiveLaplaceNoise(scale=0.05 * 255, per_channel=True), iaa.LinearContrast((0.5, 2.0), per_channel=True), iaa.Clouds(), iaa.Fog(), iaa.PiecewiseAffine(scale=0.02), iaa.Affine(scale={ "x": (0.8, 1), "y": (0.8, 1) }, translate_percent={ "x": (-0.1, 0.1), "y": (-0.1, 0.1) }, rotate=(-10, 10), shear=(-5, 5), order=[0, 1], cval=(0, 255), mode='constant'), ])), sometimes( iaa.OneOf([ iaa.Crop(px=(2, 6)), iaa.CoarseDropout((0.0, 0.01), size_percent=(0.02, 0.1)), ])), sometimes(iaa.PerspectiveTransform(scale=(0.01, 0.08), keep_size=False)) ], random_order=True) return augmenter
def __init__(self, train_list, test_list, database_root, store_memory=True, data_aug=False, new_aug=False): """Initialize the Dataset object Args: train_list: TXT file or list with the paths of the images to use for training (Images must be between 0 and 255) test_list: TXT file or list with the paths of the images to use for testing (Images must be between 0 and 255) database_root: Path to the root of the Database store_memory: True stores all the training images, False loads at runtime the images Returns: """ if not store_memory and data_aug: sys.stderr.write('Online data augmentation not supported when the data is not stored in memory!') sys.exit() # Define types of data augmentation data_aug_scales = [0.5, 0.8, 1] data_aug_flip = True #checking aug bool value print('new augmentation value is : ') print(new_aug) if(new_aug): #extra augmentation data_aug_brightness = True data_aug_addnoise = False else: data_aug_brightness = False data_aug_addnoise = False # Load training images (path) and labels print('Started loading files...') if not isinstance(train_list, list) and train_list is not None: with open(train_list) as t: train_paths = t.readlines() elif isinstance(train_list, list): train_paths = train_list else: train_paths = [] if not isinstance(test_list, list) and test_list is not None: with open(test_list) as t: test_paths = t.readlines() elif isinstance(test_list, list): test_paths = test_list else: test_paths = [] self.images_train = [] self.images_train_path = [] self.labels_train = [] self.labels_train_path = [] for idx, line in enumerate(train_paths): if store_memory: img = Image.open(os.path.join(database_root, str(line.split()[0]))) img.load() label = Image.open(os.path.join(database_root, str(line.split()[1]))) label.load() label = label.split()[0] j = 0 if data_aug: if idx == 0: sys.stdout.write('Performing the data augmentation') for scale in data_aug_scales: img_size = tuple([int(img.size[0] * scale), int(img.size[1] * scale)]) img_sc = img.resize(img_size) label_sc = label.resize(img_size) self.images_train.append(np.array(img_sc, dtype=np.uint8)) self.labels_train.append(np.array(label_sc, dtype=np.uint8)) if(data_aug_addnoise): im_lap_noise = img_to_array(img_sc) seq = iaa.Sequential([iaa.AdditiveLaplaceNoise(scale=0.9*255)]) #scale was 11 before image_noise_np = seq.augment_image(im_lap_noise).astype('uint8') # im_lap_noise_sq = Image.fromarray(seq.augment_image(im_lap_noise)) # im_lap_noise_sq.save('./aug_image/test_save/aug-im-noise' + str(j), "JPEG") self.images_train.append(np.array(image_noise_np, dtype=np.uint8)) self.labels_train.append(np.array(label_sc, dtype=np.uint8)) if data_aug_flip: img_sc_fl = img_sc.transpose(Image.FLIP_LEFT_RIGHT) label_sc_fl = label_sc.transpose(Image.FLIP_LEFT_RIGHT) self.images_train.append(np.array(img_sc_fl, dtype=np.uint8)) self.labels_train.append(np.array(label_sc_fl, dtype=np.uint8)) if data_aug_brightness: data_img = img_to_array(img_sc) br_samples = np.expand_dims(data_img, 0) datagen = ImageDataGenerator(brightness_range=[0.2,1.7]) it = datagen.flow(br_samples, batch_size=1) for i in range(9): batch = it.next() image_np = batch[0].astype('uint8') aug_im = Image.fromarray(image_np) aug_im.save('./aug_image/test_save/aug-im-' + str(j), "JPEG") self.images_train.append(np.array(image_np, dtype=np.uint8)) self.labels_train.append(np.array(label_sc, dtype=np.uint8)) j = j+1 else: if idx == 0: sys.stdout.write('Loading the data') self.images_train.append(np.array(img, dtype=np.uint8)) self.labels_train.append(np.array(label, dtype=np.uint8)) if (idx + 1) % 50 == 0: sys.stdout.write('.') self.images_train_path.append(os.path.join(database_root, str(line.split()[0]))) self.labels_train_path.append(os.path.join(database_root, str(line.split()[1]))) sys.stdout.write('\n') self.images_train_path = np.array(self.images_train_path) self.labels_train_path = np.array(self.labels_train_path) # Load testing images (path) and labels self.images_test = [] self.images_test_path = [] for idx, line in enumerate(test_paths): if store_memory: self.images_test.append(np.array(Image.open(os.path.join(database_root, str(line.split()[0]))), dtype=np.uint8)) if (idx + 1) % 1000 == 0: print('Loaded ' + str(idx) + ' test images') self.images_test_path.append(os.path.join(database_root, str(line.split()[0]))) print('Done initializing Dataset') # Init parameters self.train_ptr = 0 self.test_ptr = 0 self.train_size = max(len(self.images_train_path), len(self.images_train)) self.test_size = len(self.images_test_path) self.train_idx = np.arange(self.train_size) np.random.shuffle(self.train_idx) self.store_memory = store_memory
def imgaug_augment(self, TARGET_DIR, INPUT_SIZE, NORMALIZE=False, AUGMENTATION='native'): data, label = self.img2array(TARGET_DIR, INPUT_SIZE, NORMALIZE) if AUGMENTATION == 'native': return data, label elif AUGMENTATION == 'rotation': imgaug_aug = iaa.Affine(rotate=(-90, 90), order=1, mode="edge") # 90度 "まで" 回転 elif AUGMENTATION == 'hflip': imgaug_aug = iaa.Fliplr(1.0) # 左右反転 elif AUGMENTATION == 'width_shift': imgaug_aug = iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge") # 1/8 平行移動(左右) elif AUGMENTATION == 'height_shift': imgaug_aug = iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge") # 1/8 平行移動(上下) # imgaug_aug = iaa.Crop(px=(0, 40)) <= 平行移動ではなく、切り抜き elif AUGMENTATION == 'zoom': imgaug_aug = iaa.Affine(scale={ "x": (0.8, 1.2), "y": (0.8, 1.2) }, order=1, mode="edge") # 80~120% ズーム # これも keras と仕様が違って、縦横独立に拡大・縮小されるようである。 elif AUGMENTATION == 'logcon': imgaug_aug = iaa.LogContrast((0.5, 1.5)) elif AUGMENTATION == 'linecon': imgaug_aug = iaa.LinearContrast((0.5, 2.0)) # 明度変換 elif AUGMENTATION == 'gnoise': imgaug_aug = iaa.AdditiveGaussianNoise( scale=[0.05 * 255, 0.2 * 255]) # Gaussian Noise elif AUGMENTATION == 'lnoise': imgaug_aug = iaa.AdditiveLaplaceNoise( scale=[0.05 * 255, 0.2 * 255]) # LaplaceNoise elif AUGMENTATION == 'pnoise': imgaug_aug = iaa.AdditivePoissonNoise( lam=(16.0, 48.0), per_channel=True) # PoissonNoise elif AUGMENTATION == 'flatten': imgaug_aug = iaa.GaussianBlur(sigma=(0.5, 1.0)) # blur: ぼかし (平滑化) elif AUGMENTATION == 'sharpen': imgaug_aug = iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)) # sharpen images (鮮鋭化) elif AUGMENTATION == 'emboss': imgaug_aug = iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)) # Edge 強調 elif AUGMENTATION == 'invert': imgaug_aug = iaa.Invert(1.0) # 色反転 <= これがうまく行かないので自分で作った。 elif AUGMENTATION == 'someof': # 上記のうちのどれか1つ imgaug_aug = iaa.SomeOf( 1, [ iaa.Affine(rotate=(-90, 90), order=1, mode="edge"), iaa.Fliplr(1.0), iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(scale={ "x": (0.8, 1.2), "y": (0.8, 1.2) }, order=1, mode="edge"), iaa.LogContrast((0.5, 1.5)), iaa.LinearContrast((0.5, 2.0)), iaa.AdditiveGaussianNoise(scale=[0.05 * 255, 0.25 * 255]), iaa.AdditiveLaplaceNoise(scale=[0.05 * 255, 0.25 * 255]), iaa.AdditivePoissonNoise(lam=(16.0, 48.0), per_channel=True), iaa.GaussianBlur(sigma=(0.5, 1.0)), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)), iaa.Invert(1.0) # 14 ]) elif AUGMENTATION == 'plural': # 異なる系統の変換を複数(1つの変換あとに画素値がマイナスになるとError..) imgaug_aug = self.randomDataAugument(2) elif AUGMENTATION == 'fortest': # plural - invert (色反転) (test 用) imgaug_aug = self.randomTestAugument(2) else: print("現在 imgaug で選択できる DA のモードは以下の通りです。") print(self.imgaug_aug_list, "\n") raise ValueError("予期されないモードが選択されています。") aug_data = imgaug_aug.augment_images(data) aug_data = np.clip(aug_data, 0, 255) return aug_data, label
# Blur and Noise iaa.Sometimes( 0.2, iaa.SomeOf((1, None), [ iaa.OneOf([ iaa.MotionBlur(k=3, name="motion-blur"), iaa.GaussianBlur(sigma=(0.5, 1.0), name="gaus-blur") ]), iaa.OneOf([ iaa.AddElementwise( (-5, 5), per_channel=0.5, name="add-element"), iaa.MultiplyElementwise( (0.95, 1.05), per_channel=0.5, name="mul-element"), iaa.AdditiveGaussianNoise( scale=0.01 * 255, per_channel=0.5, name="guas-noise"), iaa.AdditiveLaplaceNoise( scale=(0, 0.01 * 255), per_channel=True, name="lap-noise"), iaa.Sometimes( 1.0, iaa.Dropout( p=(0.003, 0.01), per_channel=0.5, name="dropout")), ]), ], random_order=True)), # Colored Blocks iaa.Sometimes( 0.2, iaa.CoarseDropout(0.02, size_px=(4, 16), per_channel=0.5, name="cdropout")),
def imgaug_augment(self, target_dir='default', mode='native'): if target_dir == 'default': data, label = self.npzLoader(self.train_file) else: data, label = self.getStackedData(target_dir=target_dir) if mode == 'native': return data, label elif mode == 'rotation': imgaug_aug = iaa.Affine(rotate=(-90, 90), order=1, mode="edge") # 90度回転 # keras と仕様が異なることに注意 # keras は変化量 / imgaug は 変化の最大角を指定している # 開いた部分の穴埋めができない..?? mode="edge" にするとそれなり.. elif mode == 'hflip': imgaug_aug = iaa.Fliplr(1.0) # 左右反転 elif mode == 'width_shift': imgaug_aug = iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge") # 1/8 平行移動(左右) elif mode == 'height_shift': imgaug_aug = iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge") # 1/8 平行移動(上下) # imgaug_aug = iaa.Crop(px=(0, 40)) <= 平行移動ではなく、切り抜き elif mode == 'zoom': imgaug_aug = iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, order=1, mode="edge") # 80~120% ズーム # これも keras と仕様が違って、縦横独立に拡大・縮小されるようである。 elif mode == 'logcon': imgaug_aug = iaa.LogContrast(gain=(5, 15)) elif mode == 'linecon': imgaug_aug = iaa.LinearContrast((0.5, 2.0)) # 明度変換 elif mode == 'gnoise': imgaug_aug = iaa.AdditiveGaussianNoise(scale=[0.05*255, 0.2*255]) # Gaussian Noise elif mode == 'lnoise': imgaug_aug = iaa.AdditiveLaplaceNoise(scale=[0.05*255, 0.2*255]) # LaplaceNoise elif mode == 'pnoise': imgaug_aug = iaa.AdditivePoissonNoise(lam=(16.0, 48.0), per_channel=True) # PoissonNoise elif mode == 'flatten': imgaug_aug = iaa.GaussianBlur(sigma=(0.5, 1.0)) # blur: ぼかし (平滑化) elif mode == 'sharpen': imgaug_aug = iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)) # sharpen images (鮮鋭化) elif mode == 'emboss': imgaug_aug = iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)) # Edge 強調 elif mode == 'invert': #imgaug_aug = iaa.Invert(1.0) # 色反転 <= これがうまく行かないので自分で作った。 aug_data = [] for b in range(data.shape[0]): aug_data.append(255-data[b]) return np.array(aug_data), label elif mode == 'someof': # 上記のうちのどれか1つ imgaug_aug = iaa.SomeOf(1, [ iaa.Affine(rotate=(-90, 90), order=1, mode="edge"), iaa.Fliplr(1.0), iaa.Affine(translate_percent={"x": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(translate_percent={"y": (-0.125, 0.125)}, order=1, mode="edge"), iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, order=1, mode="edge"), iaa.LogContrast((0.5, 1.5)), iaa.LinearContrast((0.5, 2.0)), iaa.AdditiveGaussianNoise(scale=[0.05*255, 0.25*255]), iaa.AdditiveLaplaceNoise(scale=[0.05*255, 0.25*255]), iaa.AdditivePoissonNoise(lam=(16.0, 48.0), per_channel=True), iaa.GaussianBlur(sigma=(0.5, 1.0)), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)), iaa.Invert(1.0) # 14 ]) #elif mode == 'plural': # 異なる系統の変換を複数(1つの変換あとに画素値がマイナスになるとError..) # imgaug_aug = self.randomDataAugument(2) else: print("現在 imgaug で選択できる DA のモードは以下の通りです。") print(self.imgaug_mode_list, "\n") raise ValueError("予期されないモードが選択されています。") aug_data = imgaug_aug.augment_images(data) aug_data = np.clip(aug_data, 0, 255) # 注意: 戻り値の範囲は [0, 255] です。 return aug_data, label
# # aug58 = iaa.DirectedEdgeDetect(alpha=(0.0, 0.5), direction=(0.0, 0.5)) # # aug59 = iaa.Canny( # # alpha=(0.0, 0.1), # # colorizer=iaa.RandomColorsBinaryImageColorizer( # # color_true=255, # # color_false=0 # # ) # # ) scale=(0, 20) aug1 = iaa.Add((-20, 20)) aug2 = iaa.AddElementwise((-20, 20), per_channel=0.5) aug3 = aug = iaa.Sharpen(alpha=(0.0, 1.0), lightness=(0.75, 2.0)) aug4 = iaa.AdditiveLaplaceNoise(scale=(0, 0.2*255)) aug5 = iaa.AdditivePoissonNoise(scale) aug6 = iaa.Multiply((0.5, 1.5), per_channel=0.5) aug7 = iaa.Cutout(nb_iterations=2, size=0.05) aug8 = iaa.Cutout(fill_mode="constant", size=0.05, cval=255) aug9 = iaa.Cutout(fill_mode="gaussian", fill_per_channel=True, size=0.05) aug10 = iaa.Dropout(p=(0, 0.05)) aug11 = iaa.CoarseDropout((0.0, 0.05), size_percent=(0.02, 0.2)) aug12 = iaa.Dropout2d(p=0.05, nb_keep_channels=0) aug13 = iaa.ImpulseNoise(0.1) aug14 = iaa.CoarseSaltAndPepper(0.05, size_percent=(0.01, 0.6)) aug15 = iaa.CoarsePepper(0.05, size_percent=(0.01, 0.2)) # aug16 = iaa.Invert(0.25, per_channel=0.4) # aug17 = iaa.Invert(0.1)