def aug_method(): # 增强方法1: 图片变形 # 1) 水平翻转: 最常用!! 对卷积神经网络而言, 左右互换(水平翻转)差异很大 aug = image.HorizontalFlipAug(0.5) apply(img, aug) plt.gcf().suptitle('HorizontialFlipAug') plt.show() # 2) 随机裁剪: 卷积神经网络对位置敏感, 虽然Pool池化可以减小位置敏感, 但仍不不够 # 2.1) 裁剪指定(width x height) 的图片 aug = image.RandomCropAug((200, 200)) apply(img, aug) plt.show() # 2.2) 裁剪指定'长宽比'范围大小且不小于最小值的随机图片, 并resize为指定(width x height)大小 aug = image.RandomSizedCropAug(size=(100, 100), min_area=.1, ratio=(0.5, 2.0)) apply(img, aug) plt.show() # 增强方法2: 颜色变化 # 1) 亮度变化: aug = image.BrightnessJitterAug( brightness=0.5 ) # brightness : The brightness jitter ratio range, [0, 1] apply(img, aug) plt.show() # 2) 色调变化: aug = image.HueJitterAug(hue=0.5) apply(img, aug) plt.show()
def get_augs(shape): train_augs = [ image.HorizontalFlipAug(.5), image.RandomCropAug((shape, shape)) ] valid_augs = train_augs tests_augs = [image.CenterCropAug((shape, shape))] return train_augs, valid_augs, tests_augs
def transform_train(data, label, data_shape=(3, 363, 363), resize=363): # data [height, width, channel] # im = data.astype('float32') / 255, ctx = data.context im = resize_longer(data.asnumpy(), resize, data_shape) im = rotate_image(im) im = nd.array(im, ctx=ctx) im = im.astype('float32') / 255 auglist = [ image.RandomCropAug((331, 331)), image.ColorJitterAug(0.3, 0.3, 0.3), image.RandomGrayAug(0.5), # image.ColorNormalizeAug(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), image.ColorNormalizeAug(mean=(0.417, 0.402, 0.366), std=(0.081, 0.079, 0.080)), ] for aug in auglist: im = aug(im) # im = im.clip(0, 1) im = nd.transpose(im, (2, 0, 1)) return im, nd.array([label], ctx=ctx).asscalar()
def augment_data(imags, label): datas, labels = [], [] n = imags.shape[0] for k in range(n): imag = imags[k].reshape(shape=(1, imags[k].shape[0], imags[k].shape[1], imags[k].shape[2])) for i in range(4): trans_band = transform( imag, image.HorizontalFlipAug(.5)).astype('float32') datas.append(img_norm(trans_band)) labels.append(label[k].asscalar()) for i in range(9): trans_band = transform( imag, image.RandomSizedCropAug((75, 75), .75, (.8, 1.2))).astype('float32') datas.append(img_norm(trans_band)) labels.append(label[k].asscalar()) # brightness augmenter for i in range(9): trans_band = transform( imag, image.BrightnessJitterAug(.1)).astype('float32') datas.append(img_norm(trans_band)) labels.append(label[k].asscalar()) # random crop augmenter for i in range(9): trans_band = resize(transform(imag, image.RandomCropAug((50, 50))), 75).astype('float32') datas.append(img_norm(trans_band)) labels.append(label[k].asscalar()) # center crop augmenter trans_band = resize(transform(imag, image.CenterCropAug((50, 50))), 75).astype('float32') datas.append(img_norm(trans_band)) labels.append(label[k].asscalar()) ds = nd.concat(*datas, dim=0) return ds, labels
from mxnet import nd, gluon, image batch_size = 64 train_augs = [image.HorizontalFlipAug(.5), image.RandomCropAug((224, 224))] test_augs = [image.CenterCropAug((224, 224))] data_dir = '/home/zhbli/temp/dog_dataset' train_imgs = gluon.data.vision.ImageFolderDataset( data_dir + '/train', transform=lambda X, y: transform(X, y, train_augs)) test_imgs = gluon.data.vision.ImageFolderDataset( data_dir + '/test', transform=lambda X, y: transform(X, y, test_augs)) def transform(data, label, augs): data = data.astype('float32') for aug in augs: data = aug(data) data = nd.transpose(data, (2, 0, 1)) return data, nd.array([label]).asscalar().astype('float32') def getDataset(): train_data = gluon.data.DataLoader(train_imgs, batch_size, shuffle=True) test_data = gluon.data.DataLoader(test_imgs, batch_size) return train_data, test_data
for file_name in files: if not file_name.endswith('.png'): continue img_dir = os.path.join(path_crocodile, file_name) img_arr = mx.image.imread(img_dir) img_arr = nd.transpose(img_arr, (2, 0, 1)) img_arr = (img_arr.astype(np.float32) / 255) img_arr = nd.array(img_arr.reshape((1, ) + img_arr.shape)) img_list.append(img_arr) img_list_crocodile.append(img_arr) size = 28 train_augs = [ image.HorizontalFlipAug(.5), image.ColorJitterAug(.5, .5, .5), image.RandomCropAug((size, size)), ] test_augs = [image.CenterCropAug((size, size))] def apply_aug_list(img, augs): for f in augs: img = f(img) return img def try_gpu(): try: ctx = mx.gpu() _ = nd.array([0], ctx=ctx) except:
from mxnet import nd import utils def apply(img, aug, n=3): X = [aug(img.astype('float32')) for _ in range(n * n)] Y = nd.stack(*X).clip(0, 255) / 255 utils.show_images(Y, n, n, figsize=(256, 256)) # 水平翻转 aug = image.HorizontalFlipAug(.5) apply(img, aug) # 随机裁剪一个块, 256 * 256 aug = image.RandomCropAug([256, 256]) apply(img, aug) # 颜色变化 # 随机将亮度增加或减少一个量 aug = image.BrightnessJitterAug(.5) apply(img, aug) # 随机色调变化 aug = image.HueJitterAug(.5) apply(img, aug) def apply_aug_list(img, augs): for aug in augs: img = aug(img)
def apply_aug_list(img, augs): for f in augs: img = f(img) return img def train(train_augs, test_augs, learning_rate=.1): batch_size = 128 num_epochs = 10 ctx = utils.try_all_gpus() loss = gluon.loss.SoftmaxCrossEntropyLoss() train_data, test_data = get_data( batch_size, train_augs, test_augs) net = utils.resnet18(10) net.initialize(ctx=ctx, init=init.Xavier()) net.hybridize() trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': learning_rate}) utils.train( train_data, test_data, net, loss, trainer, ctx, num_epochs) train_augs = [ image.HorizontalFlipAug(.5), image.RandomCropAug((32,32)) ] test_augs = [ image.CenterCropAug((32,32)) ] train(train_augs, test_augs)
"""********************************************************************************************************************* 对CIFAR10数据集进行图片增强. """ def apply_aug_list(img, augs): """对输入图片, 按照augs列表中aug方法逐个增强""" for aug in augs: img = aug(img) return img # 训练集增强方法 train_augs = [image.HorizontalFlipAug(0.5), image.RandomCropAug(size=(28, 28))] # 测试集增强方法 test_augs = [image.CenterCropAug(size=(28, 28))] def get_transform(augs): """ """ def transform(data, label): """ """ data = data.astype('float32') if augs is not None: data = apply_aug_list(data, augs) data = nd.transpose(data, axes=(2, 0, 1)) / 255 return data, label.astype('float32')
from src import utils import mxnet as mx import base64 from mxnet import image from mxnet import nd from collections import namedtuple train_augs = [ image.HorizontalFlipAug(1.), image.RandomCropAug((224, 224)) ] test_augs = [ image.CenterCropAug((224, 224)) ] def transform(data, label, augs): data = data.astype('float32') for aug in augs: data = aug(data) data = nd.transpose(data, (2, 0, 1)) return data, nd.array([label]).asscalar().astype('float32') net = mx.mod.Module.load('../model/food', 0, True) net.bind(data_shapes=[('data', (64, 3, 244, 244))]) batch = namedtuple('batch', ['data']) def score_image(image_base64_string): with open('target_image.jpg', 'wb') as f: f.write(base64.b64decode(image_base64_string)) f.close()
import mxnet as mx import numpy as np import os import Inception3_modify from mxnet import gluon, image, nd, ndarray, init from mxnet.gluon.model_zoo import vision as models import sys sys.path.append('..') import utils train_augs = [image.HorizontalFlipAug(.5), image.RandomCropAug((299, 299))] test_augs = [image.CenterCropAug((299, 299))] def transform(data, label, augs): data = data.astype('float32') for aug in augs: data = aug(data) data = nd.transpose(data, (2, 0, 1)) return data, nd.array([label]).asscalar().astype('float32') ctx = mx.gpu() data_dir = './data' batch_size = 16 epochs = 1 ###################################### true train data train_imgs = gluon.data.vision.ImageFolderDataset( data_dir + '/train_valid_test/Images',
for i in range(nrows): for j in range(ncols): figs[i][j].imshow(imgs[i * ncols + j].asnumpy()) figs[i][j].axes.get_xaxis().set_visible(False) figs[i][j].axes.get_yaxis().set_visible(False) plt.show() self.__X = [ aug(self.__img.astype("float32")) for _ in range(self.__n * self.__n) ] self.__Y = nd.stack(*self.__X).clip(0, 255) / 255 show_images(self.__Y, self.__n, self.__n, figsize=(8, 8)) if __name__ == "__main__": ia = IamgeAugment(input_path="cat.jpg", n=3) # 变形 # 50% 几率水平翻转图片 ia.apply(aug=image.HorizontalFlipAug(.5)) # 剪裁 # 随机从原图片剪裁出 200×200 的一部分 , 可以图片先变大在剪小 ia.apply(aug=image.RandomCropAug([200, 200])) # 随机从图片中剪裁一个区域要求是剪裁面积占原图片 >= 0.1 且剪裁的区域长/宽在 0.5~2 之间后将剪裁后的图片放缩到 200×200 ia.apply(aug=image.RandomSizedCropAug((200, 200), .1, (.5, 2))) # 色调 # 随机将亮度增加或者减小在 0-50% 间的一个量 ia.apply(aug=image.BrightnessJitterAug(.5)) # 随机色调变化 ia.apply(aug=image.HueJitterAug(.5))
# -*- coding: utf-8 -*- # @Time : 18-1-30 下午1:25 # @Author : lyyang from mxnet.gluon.data import vision from mxnet import image from mxnet import nd train_test_augs = [ image.RandomCropAug((image_size,image_size)) ] def transform(data, label, augs=None): data = data.astype('float32') if augs: for aug in augs: data = aug(data) data = nd.transpose(data, (2,0,1)) return data, nd.array([label]).asscalar().astype('float32') # 读取原始图像文件。flag=1说明输入图像有三个通道(彩色)。 train_ds = vision.ImageFolderDataset(input_str + 'train', flag=1,transform=lambda X, y: transform(X, y, train_test_augs)) test_ds = vision.ImageFolderDataset(input_str + 'test', flag=1,transform=lambda X, y: transform(X, y, train_test_augs)) loader = gluon.data.DataLoader train_data = loader(train_ds, batch_size, shuffle=True, last_batch='keep') test_data = loader(train_ds, batch_size, shuffle=True, last_batch='keep')
from mxnet import gluon from mxnet import image from mxnet import init from mxnet.gluon.data import vision from mxnet import nd import net as net_collection import utils import numpy as np input_str = '/data/datasets/cifar-10/' batch_size = 32 image_size = 32 n_class = 10 train_test_augs = [image.RandomCropAug((image_size, image_size))] # 设定训练数据扩充形式 def transform_train(data, label): im = data.astype('float32') / 255 auglist = image.CreateAugmenter(data_shape=(3, 32, 32), resize=0, rand_crop=False, rand_resize=False, rand_mirror=True, mean=np.array([0.4914, 0.4822, 0.4465]), std=np.array([0.2023, 0.1994, 0.2010]), brightness=0, contrast=0, saturation=0,