Merge pull request !6019 from nhussain/move_random_choice_applytags/v1.0.0
| @@ -17,7 +17,7 @@ | |||
| This module py_transforms is implemented basing on Python. It provides common | |||
| operations including OneHotOp. | |||
| """ | |||
| from .validators import check_one_hot_op, check_compose_list | |||
| from .validators import check_one_hot_op, check_compose_list, check_random_apply, check_transforms_list | |||
| from . import py_transforms_util as util | |||
| @@ -100,3 +100,104 @@ class Compose: | |||
| lambda function, Lambda function that takes in an img to apply transformations on. | |||
| """ | |||
| return util.compose(img, self.transforms) | |||
| class RandomApply: | |||
| """ | |||
| Randomly perform a series of transforms with a given probability. | |||
| Args: | |||
| transforms (list): List of transformations to apply. | |||
| prob (float, optional): The probability to apply the transformation list (default=0.5). | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> py_vision.RandomApply(transforms_list, prob=0.6), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_random_apply | |||
| def __init__(self, transforms, prob=0.5): | |||
| self.prob = prob | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to be randomly applied a list transformations. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_apply(img, self.transforms, self.prob) | |||
| class RandomChoice: | |||
| """ | |||
| Randomly select one transform from a series of transforms and applies that on the image. | |||
| Args: | |||
| transforms (list): List of transformations to be chosen from to apply. | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose, RandomChoice | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> RandomChoice(transforms_list), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_transforms_list | |||
| def __init__(self, transforms): | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to be applied transformation. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_choice(img, self.transforms) | |||
| class RandomOrder: | |||
| """ | |||
| Perform a series of transforms to the input PIL image in a random order. | |||
| Args: | |||
| transforms (list): List of the transformations to apply. | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> py_vision.RandomOrder(transforms_list), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_transforms_list | |||
| def __init__(self, transforms): | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to apply transformations in a random order. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_order(img, self.transforms) | |||
| @@ -15,7 +15,9 @@ | |||
| """ | |||
| Built-in py_transforms_utils functions. | |||
| """ | |||
| import random | |||
| import numpy as np | |||
| from ..core.py_util_helpers import is_numpy | |||
| @@ -63,3 +65,53 @@ def one_hot_encoding(label, num_classes, epsilon): | |||
| one_hot_label[index, label[index]] = 1 | |||
| return (1 - epsilon) * one_hot_label + epsilon / num_classes | |||
| def random_order(img, transforms): | |||
| """ | |||
| Applies a list of transforms in a random order. | |||
| Args: | |||
| img: Image to be applied transformations in a random order. | |||
| transforms (list): List of the transformations to be applied. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| random.shuffle(transforms) | |||
| for transform in transforms: | |||
| img = transform(img) | |||
| return img | |||
| def random_apply(img, transforms, prob): | |||
| """ | |||
| Apply a list of transformation, randomly with a given probability. | |||
| Args: | |||
| img: Image to be randomly applied a list transformations. | |||
| transforms (list): List of transformations to be applied. | |||
| prob (float): The probability to apply the transformation list. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| if prob < random.random(): | |||
| return img | |||
| for transform in transforms: | |||
| img = transform(img) | |||
| return img | |||
| def random_choice(img, transforms): | |||
| """ | |||
| Random selects one transform from a list of transforms and applies that on the image. | |||
| Args: | |||
| img: Image to be applied transformation. | |||
| transforms (list): List of transformations to be chosen from to apply. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| return random.choice(transforms)(img) | |||
| @@ -216,3 +216,34 @@ def check_compose_list(method): | |||
| return method(self, *args, **kwargs) | |||
| return new_method | |||
| def check_random_apply(method): | |||
| """Wrapper method to check the parameters of random apply.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| [transforms, prob], _ = parse_user_args(method, *args, **kwargs) | |||
| type_check(transforms, (list,), "transforms") | |||
| if prob is not None: | |||
| type_check(prob, (float, int,), "prob") | |||
| check_value(prob, [0., 1.], "prob") | |||
| return method(self, *args, **kwargs) | |||
| return new_method | |||
| def check_transforms_list(method): | |||
| """Wrapper method to check the parameters of transform list.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| [transforms], _ = parse_user_args(method, *args, **kwargs) | |||
| type_check(transforms, (list,), "transforms") | |||
| return method(self, *args, **kwargs) | |||
| return new_method | |||
| @@ -30,7 +30,7 @@ from . import py_transforms_util as util | |||
| from .c_transforms import parse_padding | |||
| from .validators import check_prob, check_crop, check_resize_interpolation, check_random_resize_crop, \ | |||
| check_normalize_py, check_random_crop, check_random_color_adjust, check_random_rotation, \ | |||
| check_transforms_list, check_random_apply, check_ten_crop, check_num_channels, check_pad, \ | |||
| check_ten_crop, check_num_channels, check_pad, \ | |||
| check_random_perspective, check_random_erasing, check_cutout, check_linear_transform, check_random_affine, \ | |||
| check_mix_up, check_positive_degrees, check_uniform_augment_py, check_auto_contrast | |||
| from .utils import Inter, Border | |||
| @@ -609,107 +609,6 @@ class RandomRotation: | |||
| return util.random_rotation(img, self.degrees, self.resample, self.expand, self.center, self.fill_value) | |||
| class RandomOrder: | |||
| """ | |||
| Perform a series of transforms to the input PIL image in a random order. | |||
| Args: | |||
| transforms (list): List of the transformations to apply. | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> py_vision.RandomOrder(transforms_list), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_transforms_list | |||
| def __init__(self, transforms): | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to apply transformations in a random order. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_order(img, self.transforms) | |||
| class RandomApply: | |||
| """ | |||
| Randomly perform a series of transforms with a given probability. | |||
| Args: | |||
| transforms (list): List of transformations to apply. | |||
| prob (float, optional): The probability to apply the transformation list (default=0.5). | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> py_vision.RandomApply(transforms_list, prob=0.6), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_random_apply | |||
| def __init__(self, transforms, prob=0.5): | |||
| self.prob = prob | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to be randomly applied a list transformations. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_apply(img, self.transforms, self.prob) | |||
| class RandomChoice: | |||
| """ | |||
| Randomly select one transform from a series of transforms and apply that transform on the image. | |||
| Args: | |||
| transforms (list): List of transformations to be chosen from to apply. | |||
| Examples: | |||
| >>> import mindspore.dataset.vision.py_transforms as py_vision | |||
| >>> from mindspore.dataset.transforms.py_transforms import Compose | |||
| >>> | |||
| >>> Compose([py_vision.Decode(), | |||
| >>> py_vision.RandomChoice(transforms_list), | |||
| >>> py_vision.ToTensor()]) | |||
| """ | |||
| @check_transforms_list | |||
| def __init__(self, transforms): | |||
| self.transforms = transforms | |||
| def __call__(self, img): | |||
| """ | |||
| Call method. | |||
| Args: | |||
| img (PIL image): Image to apply transformation. | |||
| Returns: | |||
| img (PIL image), Transformed image. | |||
| """ | |||
| return util.random_choice(img, self.transforms) | |||
| class FiveCrop: | |||
| """ | |||
| Generate 5 cropped images (one central image and four corners images). | |||
| @@ -701,56 +701,6 @@ def random_rotation(img, degrees, resample, expand, center, fill_value): | |||
| return rotate(img, angle, resample, expand, center, fill_value) | |||
| def random_order(img, transforms): | |||
| """ | |||
| Applies a list of transforms in a random order. | |||
| Args: | |||
| img: Image to be applied transformations in a random order. | |||
| transforms (list): List of the transformations to be applied. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| random.shuffle(transforms) | |||
| for transform in transforms: | |||
| img = transform(img) | |||
| return img | |||
| def random_apply(img, transforms, prob): | |||
| """ | |||
| Apply a list of transformation, randomly with a given probability. | |||
| Args: | |||
| img: Image to be randomly applied a list transformations. | |||
| transforms (list): List of transformations to be applied. | |||
| prob (float): The probability to apply the transformation list. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| if prob < random.random(): | |||
| return img | |||
| for transform in transforms: | |||
| img = transform(img) | |||
| return img | |||
| def random_choice(img, transforms): | |||
| """ | |||
| Random selects one transform from a list of transforms and applies that on the image. | |||
| Args: | |||
| img: Image to be applied transformation. | |||
| transforms (list): List of transformations to be chosen from to apply. | |||
| Returns: | |||
| img, Transformed image. | |||
| """ | |||
| return random.choice(transforms)(img) | |||
| def five_crop(img, size): | |||
| """ | |||
| Generate 5 cropped images (one central and four corners). | |||
| @@ -347,37 +347,6 @@ def check_random_rotation(method): | |||
| return new_method | |||
| def check_transforms_list(method): | |||
| """Wrapper method to check the parameters of transform list.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| [transforms], _ = parse_user_args(method, *args, **kwargs) | |||
| type_check(transforms, (list,), "transforms") | |||
| return method(self, *args, **kwargs) | |||
| return new_method | |||
| def check_random_apply(method): | |||
| """Wrapper method to check the parameters of random apply.""" | |||
| @wraps(method) | |||
| def new_method(self, *args, **kwargs): | |||
| [transforms, prob], _ = parse_user_args(method, *args, **kwargs) | |||
| type_check(transforms, (list,), "transforms") | |||
| if prob is not None: | |||
| type_check(prob, (float, int,), "prob") | |||
| check_value(prob, [0., 1.], "prob") | |||
| return method(self, *args, **kwargs) | |||
| return new_method | |||
| def check_ten_crop(method): | |||
| """Wrapper method to check the parameters of crop.""" | |||
| @@ -678,7 +647,6 @@ def check_positive_degrees(method): | |||
| return new_method | |||
| def check_random_select_subpolicy_op(method): | |||
| """Wrapper method to check the parameters of RandomSelectSubpolicyOp.""" | |||
| @@ -17,7 +17,7 @@ Testing RandomApply op in DE | |||
| """ | |||
| import numpy as np | |||
| import mindspore.dataset as ds | |||
| import mindspore.dataset.transforms.py_transforms | |||
| import mindspore.dataset.transforms.py_transforms as py_transforms | |||
| import mindspore.dataset.vision.py_transforms as py_vision | |||
| from mindspore import log as logger | |||
| from util import visualize_list, config_get_set_seed, \ | |||
| @@ -38,16 +38,16 @@ def test_random_apply_op(plot=False): | |||
| transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] | |||
| transforms1 = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomApply(transforms_list, prob=0.6), | |||
| py_transforms.RandomApply(transforms_list, prob=0.6), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) | |||
| transform1 = py_transforms.Compose(transforms1) | |||
| transforms2 = [ | |||
| py_vision.Decode(), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) | |||
| transform2 = py_transforms.Compose(transforms2) | |||
| # First dataset | |||
| data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| @@ -79,10 +79,10 @@ def test_random_apply_md5(): | |||
| transforms = [ | |||
| py_vision.Decode(), | |||
| # Note: using default value "prob=0.5" | |||
| py_vision.RandomApply(transforms_list), | |||
| py_transforms.RandomApply(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) | |||
| transform = py_transforms.Compose(transforms) | |||
| # Generate dataset | |||
| data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| @@ -111,10 +111,10 @@ def test_random_apply_exception_random_crop_badinput(): | |||
| py_vision.RandomRotation(30)] | |||
| transforms = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomApply(transforms_list, prob=0.6), | |||
| py_transforms.RandomApply(transforms_list, prob=0.6), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) | |||
| transform = py_transforms.Compose(transforms) | |||
| # Generate dataset | |||
| data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| data = data.map(operations=transform, input_columns=["image"]) | |||
| @@ -17,7 +17,7 @@ Testing RandomChoice op in DE | |||
| """ | |||
| import numpy as np | |||
| import mindspore.dataset as ds | |||
| import mindspore.dataset.transforms.py_transforms | |||
| import mindspore.dataset.transforms.py_transforms as py_transforms | |||
| import mindspore.dataset.vision.py_transforms as py_vision | |||
| from mindspore import log as logger | |||
| from util import visualize_list, diff_mse | |||
| @@ -35,16 +35,16 @@ def test_random_choice_op(plot=False): | |||
| transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] | |||
| transforms1 = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomChoice(transforms_list), | |||
| py_transforms.RandomChoice(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) | |||
| transform1 = py_transforms.Compose(transforms1) | |||
| transforms2 = [ | |||
| py_vision.Decode(), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) | |||
| transform2 = py_transforms.Compose(transforms2) | |||
| # First dataset | |||
| data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| @@ -73,17 +73,17 @@ def test_random_choice_comp(plot=False): | |||
| transforms_list = [py_vision.CenterCrop(64)] | |||
| transforms1 = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomChoice(transforms_list), | |||
| py_transforms.RandomChoice(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) | |||
| transform1 = py_transforms.Compose(transforms1) | |||
| transforms2 = [ | |||
| py_vision.Decode(), | |||
| py_vision.CenterCrop(64), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) | |||
| transform2 = py_transforms.Compose(transforms2) | |||
| # First dataset | |||
| data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| @@ -117,10 +117,10 @@ def test_random_choice_exception_random_crop_badinput(): | |||
| transforms_list = [py_vision.RandomCrop(5000)] | |||
| transforms = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomChoice(transforms_list), | |||
| py_transforms.RandomChoice(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) | |||
| transform = py_transforms.Compose(transforms) | |||
| # Generate dataset | |||
| data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| data = data.map(operations=transform, input_columns=["image"]) | |||
| @@ -17,7 +17,7 @@ Testing RandomOrder op in DE | |||
| """ | |||
| import numpy as np | |||
| import mindspore.dataset as ds | |||
| import mindspore.dataset.transforms.py_transforms | |||
| import mindspore.dataset.transforms.py_transforms as py_transforms | |||
| import mindspore.dataset.vision.py_transforms as py_vision | |||
| from mindspore import log as logger | |||
| from util import visualize_list, config_get_set_seed, \ | |||
| @@ -38,16 +38,16 @@ def test_random_order_op(plot=False): | |||
| transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)] | |||
| transforms1 = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomOrder(transforms_list), | |||
| py_transforms.RandomOrder(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) | |||
| transform1 = py_transforms.Compose(transforms1) | |||
| transforms2 = [ | |||
| py_vision.Decode(), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) | |||
| transform2 = py_transforms.Compose(transforms2) | |||
| # First dataset | |||
| data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||
| @@ -78,10 +78,10 @@ def test_random_order_md5(): | |||
| transforms_list = [py_vision.RandomCrop(64), py_vision.RandomRotation(30)] | |||
| transforms = [ | |||
| py_vision.Decode(), | |||
| py_vision.RandomOrder(transforms_list), | |||
| py_transforms.RandomOrder(transforms_list), | |||
| py_vision.ToTensor() | |||
| ] | |||
| transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) | |||
| transform = py_transforms.Compose(transforms) | |||
| # Generate dataset | |||
| data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) | |||