forked from mindspore-Ecosystem/mindspore
!6019 [MD] Move Random(Choice/Apply/Order) from vision to transforms module
Merge pull request !6019 from nhussain/move_random_choice_apply
This commit is contained in:
commit
cf7d6eddc4
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue