diff --git a/mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc b/mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc index 2d7ead32c5e..97f0c119ec3 100644 --- a/mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc +++ b/mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc @@ -632,8 +632,8 @@ Status Rotate(const std::shared_ptr &input, std::shared_ptr *out if (!input_cv->mat().data) { RETURN_STATUS_UNEXPECTED("Rotate: load image failed."); } - if (input_cv->Rank() == 1 || input_cv->mat().dims > 2) { - RETURN_STATUS_UNEXPECTED("Rotate: input tensor is not in shape of or ."); + if (input_cv->Rank() != DEFAULT_IMAGE_RANK && input_cv->Rank() != MIN_IMAGE_DIMENSION) { + RETURN_STATUS_UNEXPECTED("Rotate: image shape is not or ."); } cv::Mat input_img = input_cv->mat(); @@ -641,8 +641,10 @@ Status Rotate(const std::shared_ptr &input, std::shared_ptr *out RETURN_STATUS_UNEXPECTED("Rotate: image is too large and center is not precise."); } // default to center of image - if (fx == -1 && fy == -1) { + if (fx == -1) { fx = (input_img.cols - 1) / 2.0; + } + if (fy == -1) { fy = (input_img.rows - 1) / 2.0; } cv::Mat output_img; @@ -1270,6 +1272,9 @@ Status GaussianBlur(const std::shared_ptr &input, std::shared_ptr input_cv = CVTensor::AsCVTensor(input); + if (input_cv->mat().data == nullptr) { + RETURN_STATUS_UNEXPECTED("GaussianBlur: load image failed."); + } cv::Mat output_cv_mat; cv::GaussianBlur(input_cv->mat(), output_cv_mat, cv::Size(kernel_x, kernel_y), static_cast(sigma_x), static_cast(sigma_y)); diff --git a/mindspore/ccsrc/minddata/dataset/kernels/image/rotate_op.cc b/mindspore/ccsrc/minddata/dataset/kernels/image/rotate_op.cc index 9eb37b27daf..5011932af55 100644 --- a/mindspore/ccsrc/minddata/dataset/kernels/image/rotate_op.cc +++ b/mindspore/ccsrc/minddata/dataset/kernels/image/rotate_op.cc @@ -47,9 +47,6 @@ RotateOp::RotateOp(float degrees, InterpolationMode resample, bool expand, float Status RotateOp::Compute(const std::shared_ptr &input, std::shared_ptr *output) { IO_CHECK(input, output); - CHECK_FAIL_RETURN_UNEXPECTED( - input->shape().Size() >= 2, - "Rotate: image shape " + std::to_string(input->shape().Size()) + " is not or ."); #ifndef ENABLE_ANDROID return Rotate(input, output, center_x_, center_y_, degrees_, interpolation_, expand_, fill_r_, fill_g_, fill_b_); #else diff --git a/mindspore/dataset/vision/c_transforms.py b/mindspore/dataset/vision/c_transforms.py index c02d2e27b7f..7f52c6f3ed3 100644 --- a/mindspore/dataset/vision/c_transforms.py +++ b/mindspore/dataset/vision/c_transforms.py @@ -1201,13 +1201,20 @@ class RandomRotation(ImageTensorOperation): @check_random_rotation def __init__(self, degrees, resample=Inter.NEAREST, expand=False, center=None, fill_value=0): - if isinstance(degrees, numbers.Number): + if isinstance(degrees, (int, float)): degrees = degrees % 360 - if isinstance(degrees, (list, tuple)): - degrees = [degrees[0] % 360, degrees[1] % 360] - if degrees[0] > degrees[1]: - degrees[1] += 360 - + degrees = [-degrees, degrees] + elif isinstance(degrees, (list, tuple)): + if degrees[1] - degrees[0] >= 360: + degrees = [-180, 180] + else: + degrees = [degrees[0] % 360, degrees[1] % 360] + if degrees[0] > degrees[1]: + degrees[1] += 360 + if center is None: + center = (-1, -1) + if isinstance(fill_value, int): + fill_value = tuple([fill_value] * 3) self.degrees = degrees self.resample = resample self.expand = expand @@ -1215,14 +1222,8 @@ class RandomRotation(ImageTensorOperation): self.fill_value = fill_value def parse(self): - # pylint false positive - # pylint: disable=E1130 - degrees = (-self.degrees, self.degrees) if isinstance(self.degrees, numbers.Number) else self.degrees - interpolation = DE_C_INTER_MODE[self.resample] - expand = self.expand - center = (-1, -1) if self.center is None else self.center - fill_value = tuple([self.fill_value] * 3) if isinstance(self.fill_value, int) else self.fill_value - return cde.RandomRotationOperation(degrees, interpolation, expand, center, fill_value) + return cde.RandomRotationOperation(self.degrees, DE_C_INTER_MODE[self.resample], self.expand, self.center, + self.fill_value) class RandomSelectSubpolicy(ImageTensorOperation): @@ -1521,9 +1522,12 @@ class Rotate(ImageTensorOperation): @check_rotate def __init__(self, degrees, resample=Inter.NEAREST, expand=False, center=None, fill_value=0): - if isinstance(degrees, numbers.Number): + if isinstance(degrees, (int, float)): degrees = degrees % 360 - + if center is None: + center = (-1, -1) + if isinstance(fill_value, int): + fill_value = tuple([fill_value] * 3) self.degrees = degrees self.resample = resample self.expand = expand @@ -1531,14 +1535,8 @@ class Rotate(ImageTensorOperation): self.fill_value = fill_value def parse(self): - # pylint false positive - # pylint: disable=E1130 - degrees = self.degrees - interpolation = DE_C_INTER_MODE[self.resample] - expand = self.expand - center = (-1, -1) if self.center is None else self.center - fill_value = tuple([self.fill_value] * 3) if isinstance(self.fill_value, int) else self.fill_value - return cde.RotateOperation(degrees, interpolation, expand, center, fill_value) + return cde.RotateOperation(self.degrees, DE_C_INTER_MODE[self.resample], self.expand, self.center, + self.fill_value) class SoftDvppDecodeRandomCropResizeJpeg(ImageTensorOperation): diff --git a/mindspore/dataset/vision/validators.py b/mindspore/dataset/vision/validators.py index 1852aa5361c..c1db417957a 100644 --- a/mindspore/dataset/vision/validators.py +++ b/mindspore/dataset/vision/validators.py @@ -140,12 +140,12 @@ def check_padding(padding): def check_degrees(degrees): """Check if the degrees is legal.""" - type_check(degrees, (numbers.Number, list, tuple), "degrees") - if isinstance(degrees, numbers.Number): + type_check(degrees, (int, float, list, tuple), "degrees") + if isinstance(degrees, (int, float)): check_pos_float32(degrees, "degrees") elif isinstance(degrees, (list, tuple)): if len(degrees) == 2: - type_check_list(degrees, (numbers.Number,), "degrees") + type_check_list(degrees, (int, float), "degrees") for value in degrees: check_float32(value, "degrees") if degrees[0] > degrees[1]: @@ -420,6 +420,17 @@ def check_random_color_adjust(method): return new_method +def check_resample_expand_center_fill_value_params(resample, expand, center, fill_value): + type_check(resample, (Inter,), "resample") + type_check(expand, (bool,), "expand") + if center is not None: + check_2tuple(center, "center") + for value in center: + type_check(value, (int, float), "center") + check_value(value, [-1, INT32_MAX], "center") + check_fill_value(fill_value) + + def check_random_rotation(method): """Wrapper method to check the parameters of random rotation.""" @@ -427,15 +438,7 @@ def check_random_rotation(method): def new_method(self, *args, **kwargs): [degrees, resample, expand, center, fill_value], _ = parse_user_args(method, *args, **kwargs) check_degrees(degrees) - - if resample is not None: - type_check(resample, (Inter,), "resample") - if expand is not None: - type_check(expand, (bool,), "expand") - if center is not None: - check_2tuple(center, "center") - if fill_value is not None: - check_fill_value(fill_value) + check_resample_expand_center_fill_value_params(resample, expand, center, fill_value) return method(self, *args, **kwargs) @@ -448,18 +451,9 @@ def check_rotate(method): @wraps(method) def new_method(self, *args, **kwargs): [degrees, resample, expand, center, fill_value], _ = parse_user_args(method, *args, **kwargs) - - type_check(degrees, (numbers.Number,), "degrees") + type_check(degrees, (float, int), "degrees") check_float32(degrees, "degrees") - - if resample is not None: - type_check(resample, (Inter,), "resample") - if expand is not None: - type_check(expand, (bool,), "expand") - if center is not None: - check_2tuple(center, "center") - if fill_value is not None: - check_fill_value(fill_value) + check_resample_expand_center_fill_value_params(resample, expand, center, fill_value) return method(self, *args, **kwargs) @@ -555,6 +549,7 @@ def check_rgb_to_bgr(method): [is_hwc], _ = parse_user_args(method, *args, **kwargs) type_check(is_hwc, (bool,), "is_hwc") return method(self, *args, **kwargs) + return new_method diff --git a/tests/ut/python/dataset/test_rotate.py b/tests/ut/python/dataset/test_rotate.py index 88cc7539a89..7840955518a 100644 --- a/tests/ut/python/dataset/test_rotate.py +++ b/tests/ut/python/dataset/test_rotate.py @@ -101,7 +101,7 @@ def test_rotate_exception(): _ = c_vision.Rotate("60") except TypeError as e: logger.info("Got an exception in Rotate: {}".format(str(e))) - assert "not of type []" in str(e) + assert "not of type [, ]" in str(e) try: _ = c_vision.Rotate(30, Inter.BICUBIC, False, (0, 0, 0)) except ValueError as e: