!6019 [MD] Move Random(Choice/Apply/Order) from vision to transforms module

Merge pull request !6019 from nhussain/move_random_choice_apply
pull/6019/MERGE
mindspore-ci-bot 4 years ago committed by Gitee
commit cf7d6eddc4

@ -17,7 +17,7 @@
This module py_transforms is implemented basing on Python. It provides common This module py_transforms is implemented basing on Python. It provides common
operations including OneHotOp. 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 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. lambda function, Lambda function that takes in an img to apply transformations on.
""" """
return util.compose(img, self.transforms) 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. Built-in py_transforms_utils functions.
""" """
import random
import numpy as np import numpy as np
from ..core.py_util_helpers import is_numpy 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 one_hot_label[index, label[index]] = 1
return (1 - epsilon) * one_hot_label + epsilon / num_classes 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 method(self, *args, **kwargs)
return new_method 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 .c_transforms import parse_padding
from .validators import check_prob, check_crop, check_resize_interpolation, check_random_resize_crop, \ 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_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_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 check_mix_up, check_positive_degrees, check_uniform_augment_py, check_auto_contrast
from .utils import Inter, Border 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) 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: class FiveCrop:
""" """
Generate 5 cropped images (one central image and four corners images). 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) 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): def five_crop(img, size):
""" """
Generate 5 cropped images (one central and four corners). Generate 5 cropped images (one central and four corners).

@ -347,37 +347,6 @@ def check_random_rotation(method):
return new_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): def check_ten_crop(method):
"""Wrapper method to check the parameters of crop.""" """Wrapper method to check the parameters of crop."""
@ -678,7 +647,6 @@ def check_positive_degrees(method):
return new_method return new_method
def check_random_select_subpolicy_op(method): def check_random_select_subpolicy_op(method):
"""Wrapper method to check the parameters of RandomSelectSubpolicyOp.""" """Wrapper method to check the parameters of RandomSelectSubpolicyOp."""

@ -17,7 +17,7 @@ Testing RandomApply op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds 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 import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, config_get_set_seed, \ 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)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6), py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) transform1 = py_transforms.Compose(transforms1)
transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) transform2 = py_transforms.Compose(transforms2)
# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
@ -79,10 +79,10 @@ def test_random_apply_md5():
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
# Note: using default value "prob=0.5" # Note: using default value "prob=0.5"
py_vision.RandomApply(transforms_list), py_transforms.RandomApply(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) 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)] py_vision.RandomRotation(30)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomApply(transforms_list, prob=0.6), py_transforms.RandomApply(transforms_list, prob=0.6),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
data = data.map(operations=transform, input_columns=["image"]) data = data.map(operations=transform, input_columns=["image"])

@ -17,7 +17,7 @@ Testing RandomChoice op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds 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 import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, diff_mse 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)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list), py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) transform1 = py_transforms.Compose(transforms1)
transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) transform2 = py_transforms.Compose(transforms2)
# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) 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)] transforms_list = [py_vision.CenterCrop(64)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list), py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) transform1 = py_transforms.Compose(transforms1)
transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.CenterCrop(64), py_vision.CenterCrop(64),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) transform2 = py_transforms.Compose(transforms2)
# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) 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_list = [py_vision.RandomCrop(5000)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomChoice(transforms_list), py_transforms.RandomChoice(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)
data = data.map(operations=transform, input_columns=["image"]) data = data.map(operations=transform, input_columns=["image"])

@ -17,7 +17,7 @@ Testing RandomOrder op in DE
""" """
import numpy as np import numpy as np
import mindspore.dataset as ds 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 import mindspore.dataset.vision.py_transforms as py_vision
from mindspore import log as logger from mindspore import log as logger
from util import visualize_list, config_get_set_seed, \ 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)] transforms_list = [py_vision.CenterCrop(64), py_vision.RandomRotation(30)]
transforms1 = [ transforms1 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomOrder(transforms_list), py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform1 = mindspore.dataset.transforms.py_transforms.Compose(transforms1) transform1 = py_transforms.Compose(transforms1)
transforms2 = [ transforms2 = [
py_vision.Decode(), py_vision.Decode(),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform2 = mindspore.dataset.transforms.py_transforms.Compose(transforms2) transform2 = py_transforms.Compose(transforms2)
# First dataset # First dataset
data1 = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) 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_list = [py_vision.RandomCrop(64), py_vision.RandomRotation(30)]
transforms = [ transforms = [
py_vision.Decode(), py_vision.Decode(),
py_vision.RandomOrder(transforms_list), py_transforms.RandomOrder(transforms_list),
py_vision.ToTensor() py_vision.ToTensor()
] ]
transform = mindspore.dataset.transforms.py_transforms.Compose(transforms) transform = py_transforms.Compose(transforms)
# Generate dataset # Generate dataset
data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False) data = ds.TFRecordDataset(DATA_DIR, SCHEMA_DIR, columns_list=["image"], shuffle=False)

Loading…
Cancel
Save