def __init__(self, data_dir, training=True, use_third_trsfm=False, use_auto_augment=False, num_parallel_workers=8, device_num=1, device_id=0): if not training: trsfm = Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) else: if not use_third_trsfm: trsfm = Compose([ transforms.ToPIL(), transforms.RandomResizedCrop(size=32, scale=(0.2, 1.)), transforms.RandomColorAdjust(0.4, 0.4, 0.4, 0.4), transforms.RandomGrayscale(prob=0.2), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) else: if use_auto_augment: trsfm = Compose([ transforms.ToPIL(), transforms.RandomResizedCrop(size=32, scale=(0.2, 1.)), transforms.RandomHorizontalFlip(), CIFAR10Policy(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) else: rand_augment = RandAugment(n=2, m=10) trsfm = Compose([ transforms.ToPIL(), transforms.RandomResizedCrop(size=32, scale=(0.2, 1.)), transforms.RandomHorizontalFlip(), rand_augment, transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) self.trsfm = trsfm self.data_dir = data_dir self.num_parallel_workers = num_parallel_workers self.device_num = device_num self.device_id = device_id
def test_random_crop_and_resize_05_py(): """ Test RandomCropAndResize with py_transforms: invalid range of ratio (max<min), expected to raise ValueError """ logger.info("test_random_crop_and_resize_05_py") # Generate dataset data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) try: transforms = [ py_vision.Decode(), # If input range of ratio is not in the order of (min, max), ValueError will be raised. py_vision.RandomResizedCrop((256, 512), (1, 1), (1, 0.5)), py_vision.ToTensor() ] transform = mindspore.dataset.transforms.py_transforms.Compose( transforms) data = data.map(operations=transform, input_columns=["image"]) except ValueError as e: logger.info("Got an exception in DE: {}".format(str(e))) assert "ratio should be in (min,max) format. Got (max,min)." in str(e)
def test_random_crop_and_resize_op_py_ANTIALIAS(): """ Test RandomCropAndResize op in py transforms """ logger.info("test_random_crop_and_resize_op_py_ANTIALIAS") # First dataset data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) # With these inputs we expect the code to crop the whole image transforms1 = [ py_vision.Decode(), py_vision.RandomResizedCrop((256, 512), (2, 2), (1, 3), Inter.ANTIALIAS), py_vision.ToTensor() ] transform1 = mindspore.dataset.transforms.py_transforms.Compose( transforms1) data1 = data1.map(operations=transform1, input_columns=["image"]) num_iter = 0 for _ in data1.create_dict_iterator(num_epochs=1, output_numpy=True): num_iter += 1 logger.info( "use RandomResizedCrop by Inter.ANTIALIAS process {} images.".format( num_iter))
def test_random_crop_and_resize_comp(plot=False): """ Test RandomCropAndResize and compare between python and c image augmentation """ logger.info("test_random_crop_and_resize_comp") # First dataset data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) decode_op = c_vision.Decode() random_crop_and_resize_op = c_vision.RandomResizedCrop(512, (1, 1), (0.5, 0.5)) data1 = data1.map(operations=decode_op, input_columns=["image"]) data1 = data1.map(operations=random_crop_and_resize_op, input_columns=["image"]) # Second dataset data2 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) transforms = [ py_vision.Decode(), py_vision.RandomResizedCrop(512, (1, 1), (0.5, 0.5)), py_vision.ToTensor() ] transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) data2 = data2.map(operations=transform, input_columns=["image"]) image_c_cropped = [] image_py_cropped = [] for item1, item2 in zip(data1.create_dict_iterator(num_epochs=1, output_numpy=True), data2.create_dict_iterator(num_epochs=1, output_numpy=True)): c_image = item1["image"] py_image = (item2["image"].transpose(1, 2, 0) * 255).astype(np.uint8) image_c_cropped.append(c_image) image_py_cropped.append(py_image) mse = diff_mse(c_image, py_image) assert mse < 0.02 # rounding error if plot: visualize_list(image_c_cropped, image_py_cropped, visualize_mode=2)
def test_random_crop_and_resize_03(): """ Test RandomCropAndResize with md5 check: max_attempts is 1, expected to pass """ logger.info("test_random_crop_and_resize_03") original_seed = config_get_set_seed(0) original_num_parallel_workers = config_get_set_num_parallel_workers(1) # First dataset data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) decode_op = c_vision.Decode() random_crop_and_resize_op = c_vision.RandomResizedCrop((256, 512), max_attempts=1) data1 = data1.map(operations=decode_op, input_columns=["image"]) data1 = data1.map(operations=random_crop_and_resize_op, input_columns=["image"]) # Second dataset data2 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) transforms = [ py_vision.Decode(), py_vision.RandomResizedCrop((256, 512), max_attempts=1), py_vision.ToTensor() ] transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) data2 = data2.map(operations=transform, input_columns=["image"]) filename1 = "random_crop_and_resize_03_c_result.npz" filename2 = "random_crop_and_resize_03_py_result.npz" save_and_check_md5(data1, filename1, generate_golden=GENERATE_GOLDEN) save_and_check_md5(data2, filename2, generate_golden=GENERATE_GOLDEN) # Restore config setting ds.config.set_seed(original_seed) ds.config.set_num_parallel_workers(original_num_parallel_workers)
def create_dataset(batch_size, train_data_url='', workers=8, distributed=False, input_size=224, color_jitter=0.4): """Create ImageNet training dataset""" if not os.path.exists(train_data_url): raise ValueError('Path not exists') decode_op = py_vision.Decode() type_cast_op = c_transforms.TypeCast(mstype.int32) random_resize_crop_bicubic = py_vision.RandomResizedCrop( size=(input_size, input_size), scale=SCALE, ratio=RATIO, interpolation=Inter.BICUBIC) random_horizontal_flip_op = py_vision.RandomHorizontalFlip(0.5) adjust_range = (max(0, 1 - color_jitter), 1 + color_jitter) random_color_jitter_op = py_vision.RandomColorAdjust( brightness=adjust_range, contrast=adjust_range, saturation=adjust_range) to_tensor = py_vision.ToTensor() normalize_op = py_vision.Normalize(IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD) # assemble all the transforms image_ops = py_transforms.Compose([ decode_op, random_resize_crop_bicubic, random_horizontal_flip_op, random_color_jitter_op, to_tensor, normalize_op ]) rank_id = get_rank() if distributed else 0 rank_size = get_group_size() if distributed else 1 dataset_train = ds.ImageFolderDataset(train_data_url, num_parallel_workers=workers, shuffle=True, num_shards=rank_size, shard_id=rank_id) dataset_train = dataset_train.map(input_columns=["image"], operations=image_ops, num_parallel_workers=workers) dataset_train = dataset_train.map(input_columns=["label"], operations=type_cast_op, num_parallel_workers=workers) # batch dealing ds_train = dataset_train.batch(batch_size, per_batch_map=split_imgs_and_labels, input_columns=["image", "label"], num_parallel_workers=2, drop_remainder=True) ds_train = ds_train.repeat(1) return ds_train
def create_dataset_py(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend"): """ create a train or eval dataset Args: dataset_path(string): the path of dataset. do_train(bool): whether dataset is used for train or eval. repeat_num(int): the repeat times of dataset. Default: 1 batch_size(int): the batch size of dataset. Default: 32 target(str): the device target. Default: Ascend Returns: dataset """ if target == "Ascend": device_num = int(os.getenv("RANK_SIZE")) rank_id = int(os.getenv("RANK_ID")) else: init() rank_id = get_rank() device_num = get_group_size() if do_train: if device_num == 1: ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True) else: ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True, num_shards=device_num, shard_id=rank_id) else: ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=False) image_size = 224 # define map operations decode_op = P.Decode() resize_crop_op = P.RandomResizedCrop(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)) horizontal_flip_op = P.RandomHorizontalFlip(prob=0.5) resize_op = P.Resize(256) center_crop = P.CenterCrop(image_size) to_tensor = P.ToTensor() normalize_op = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # define map operations if do_train: trans = [decode_op, resize_crop_op, horizontal_flip_op, to_tensor, normalize_op] else: trans = [decode_op, resize_op, center_crop, to_tensor, normalize_op] compose = P2.Compose(trans) ds = ds.map(operations=compose, input_columns="image", num_parallel_workers=8, python_multiprocessing=True) # apply batch operations ds = ds.batch(batch_size, drop_remainder=True) # apply dataset repeat operation ds = ds.repeat(repeat_num) return ds
def test_random_crop_and_resize_op_py(plot=False): """ Test RandomCropAndResize op in py transforms """ logger.info("test_random_crop_and_resize_op_py") # First dataset data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) # With these inputs we expect the code to crop the whole image transforms1 = [ py_vision.Decode(), py_vision.RandomResizedCrop((256, 512), (2, 2), (1, 3)), py_vision.ToTensor() ] transform1 = mindspore.dataset.transforms.py_transforms.Compose( transforms1) data1 = data1.map(operations=transform1, input_columns=["image"]) # Second dataset # Second dataset for comparison data2 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) transforms2 = [py_vision.Decode(), py_vision.ToTensor()] transform2 = mindspore.dataset.transforms.py_transforms.Compose( transforms2) data2 = data2.map(operations=transform2, input_columns=["image"]) num_iter = 0 crop_and_resize_images = [] original_images = [] for item1, item2 in zip( data1.create_dict_iterator(num_epochs=1, output_numpy=True), data2.create_dict_iterator(num_epochs=1, output_numpy=True)): crop_and_resize = (item1["image"].transpose(1, 2, 0) * 255).astype( np.uint8) original = (item2["image"].transpose(1, 2, 0) * 255).astype(np.uint8) original = cv2.resize(original, (512, 256)) mse = diff_mse(crop_and_resize, original) # Due to rounding error the mse for Python is not exactly 0 assert mse <= 0.05 logger.info("random_crop_and_resize_op_{}, mse: {}".format( num_iter + 1, mse)) num_iter += 1 crop_and_resize_images.append(crop_and_resize) original_images.append(original) if plot: visualize_list(original_images, crop_and_resize_images)
def create_dataset_py(dataset_path, do_train, config, device_target, repeat_num=1, batch_size=32): """ create a train or eval dataset Args: dataset_path(string): the path of dataset. do_train(bool): whether dataset is used for train or eval. repeat_num(int): the repeat times of dataset. Default: 1. batch_size(int): the batch size of dataset. Default: 32. Returns: dataset """ if device_target == "Ascend": rank_size = int(os.getenv("RANK_SIZE")) rank_id = int(os.getenv("RANK_ID")) if do_train: if rank_size == 1: data_set = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True) else: data_set = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True, num_shards=rank_size, shard_id=rank_id) else: data_set = ds.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=False) else: raise ValueError("Unsupported device target.") resize_height = 224 if do_train: buffer_size = 20480 # apply shuffle operations data_set = data_set.shuffle(buffer_size=buffer_size) # define map operations decode_op = P.Decode() resize_crop_op = P.RandomResizedCrop(resize_height, scale=(0.08, 1.0), ratio=(0.75, 1.333)) horizontal_flip_op = P.RandomHorizontalFlip(prob=0.5) resize_op = P.Resize(256) center_crop = P.CenterCrop(resize_height) to_tensor = P.ToTensor() normalize_op = P.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) if do_train: trans = [ decode_op, resize_crop_op, horizontal_flip_op, to_tensor, normalize_op ] else: trans = [decode_op, resize_op, center_crop, to_tensor, normalize_op] compose = P2.Compose(trans) data_set = data_set.map(operations=compose, input_columns="image", num_parallel_workers=8, python_multiprocessing=True) # apply batch operations data_set = data_set.batch(batch_size, drop_remainder=True) # apply dataset repeat operation data_set = data_set.repeat(repeat_num) return data_set