diff --git a/mindspore/dataset/transforms/py_transforms.py b/mindspore/dataset/transforms/py_transforms.py index 7c51a4378d..35608f7d50 100644 --- a/mindspore/dataset/transforms/py_transforms.py +++ b/mindspore/dataset/transforms/py_transforms.py @@ -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) diff --git a/mindspore/dataset/transforms/py_transforms_util.py b/mindspore/dataset/transforms/py_transforms_util.py index a4b85846eb..d44ad4de40 100644 --- a/mindspore/dataset/transforms/py_transforms_util.py +++ b/mindspore/dataset/transforms/py_transforms_util.py @@ -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) diff --git a/mindspore/dataset/transforms/validators.py b/mindspore/dataset/transforms/validators.py index 0145d59018..e1ab9c7394 100644 --- a/mindspore/dataset/transforms/validators.py +++ b/mindspore/dataset/transforms/validators.py @@ -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 diff --git a/mindspore/dataset/vision/py_transforms.py b/mindspore/dataset/vision/py_transforms.py index b9133df383..fac75a2acc 100644 --- a/mindspore/dataset/vision/py_transforms.py +++ b/mindspore/dataset/vision/py_transforms.py @@ -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). diff --git a/mindspore/dataset/vision/py_transforms_util.py b/mindspore/dataset/vision/py_transforms_util.py index 12d260de16..5de840a30f 100644 --- a/mindspore/dataset/vision/py_transforms_util.py +++ b/mindspore/dataset/vision/py_transforms_util.py @@ -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). diff --git a/mindspore/dataset/vision/validators.py b/mindspore/dataset/vision/validators.py index 384802d9ab..8060c62145 100644 --- a/mindspore/dataset/vision/validators.py +++ b/mindspore/dataset/vision/validators.py @@ -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.""" diff --git a/tests/ut/python/dataset/test_random_apply.py b/tests/ut/python/dataset/test_random_apply.py index 5fca4cd7ed..7236c65441 100644 --- a/tests/ut/python/dataset/test_random_apply.py +++ b/tests/ut/python/dataset/test_random_apply.py @@ -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(input_columns=["image"], operations=transform) diff --git a/tests/ut/python/dataset/test_random_choice.py b/tests/ut/python/dataset/test_random_choice.py index be7d06dff6..2643694c26 100644 --- a/tests/ut/python/dataset/test_random_choice.py +++ b/tests/ut/python/dataset/test_random_choice.py @@ -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(input_columns=["image"], operations=transform) diff --git a/tests/ut/python/dataset/test_random_order.py b/tests/ut/python/dataset/test_random_order.py index c882d822cc..2e0a841414 100644 --- a/tests/ut/python/dataset/test_random_order.py +++ b/tests/ut/python/dataset/test_random_order.py @@ -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)