| @@ -28,4 +28,5 @@ add_library(cpp-API OBJECT | |||||
| transforms.cc | transforms.cc | ||||
| samplers.cc | samplers.cc | ||||
| text.cc | text.cc | ||||
| vision.cc | |||||
| ) | ) | ||||
| @@ -20,8 +20,13 @@ | |||||
| namespace mindspore { | namespace mindspore { | ||||
| namespace dataset { | namespace dataset { | ||||
| namespace api { | namespace api { | ||||
| // Transform operations for text. | |||||
| namespace text { | namespace text { | ||||
| // FUNCTIONS TO CREATE TEXT OPERATIONS | |||||
| // (In alphabetical order) | |||||
| std::shared_ptr<LookupOperation> Lookup(const std::shared_ptr<Vocab> &vocab, const std::string &unknown_token, | std::shared_ptr<LookupOperation> Lookup(const std::shared_ptr<Vocab> &vocab, const std::string &unknown_token, | ||||
| const DataType &data_type) { | const DataType &data_type) { | ||||
| auto op = std::make_shared<LookupOperation>(vocab, unknown_token, data_type); | auto op = std::make_shared<LookupOperation>(vocab, unknown_token, data_type); | ||||
| @@ -32,6 +37,12 @@ std::shared_ptr<LookupOperation> Lookup(const std::shared_ptr<Vocab> &vocab, con | |||||
| return op; | return op; | ||||
| } | } | ||||
| /* ####################################### Validator Functions ############################################ */ | |||||
| /* ####################################### Derived TensorOperation classes ################################# */ | |||||
| // (In alphabetical order) | |||||
| // LookupOperation | // LookupOperation | ||||
| LookupOperation::LookupOperation(const std::shared_ptr<Vocab> &vocab, const std::string &unknown_token, | LookupOperation::LookupOperation(const std::shared_ptr<Vocab> &vocab, const std::string &unknown_token, | ||||
| const DataType &data_type) | const DataType &data_type) | ||||
| @@ -17,31 +17,8 @@ | |||||
| #include "minddata/dataset/include/transforms.h" | #include "minddata/dataset/include/transforms.h" | ||||
| #include "minddata/dataset/kernels/image/image_utils.h" | #include "minddata/dataset/kernels/image/image_utils.h" | ||||
| #include "minddata/dataset/kernels/image/center_crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/cutmix_batch_op.h" | |||||
| #include "minddata/dataset/kernels/image/cut_out_op.h" | |||||
| #include "minddata/dataset/kernels/image/decode_op.h" | |||||
| #include "minddata/dataset/kernels/image/hwc_to_chw_op.h" | |||||
| #include "minddata/dataset/kernels/image/mixup_batch_op.h" | |||||
| #include "minddata/dataset/kernels/image/normalize_op.h" | |||||
| // Kernel data headers (in alphabetical order) | |||||
| #include "minddata/dataset/kernels/data/one_hot_op.h" | #include "minddata/dataset/kernels/data/one_hot_op.h" | ||||
| #include "minddata/dataset/kernels/image/pad_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_affine_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_color_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_color_adjust_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_horizontal_flip_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_posterize_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_rotation_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_sharpness_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_solarize_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_vertical_flip_op.h" | |||||
| #include "minddata/dataset/kernels/image/resize_op.h" | |||||
| #include "minddata/dataset/kernels/image/rgba_to_bgr_op.h" | |||||
| #include "minddata/dataset/kernels/image/rgba_to_rgb_op.h" | |||||
| #include "minddata/dataset/kernels/image/swap_red_blue_op.h" | |||||
| #include "minddata/dataset/kernels/image/uniform_aug_op.h" | |||||
| namespace mindspore { | namespace mindspore { | ||||
| namespace dataset { | namespace dataset { | ||||
| @@ -49,88 +26,11 @@ namespace api { | |||||
| TensorOperation::TensorOperation() {} | TensorOperation::TensorOperation() {} | ||||
| // Transform operations for computer vision. | |||||
| namespace vision { | |||||
| // Transform operations for data. | |||||
| namespace transforms { | |||||
| // Function to create CenterCropOperation. | |||||
| std::shared_ptr<CenterCropOperation> CenterCrop(std::vector<int32_t> size) { | |||||
| auto op = std::make_shared<CenterCropOperation>(size); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CropOperation. | |||||
| std::shared_ptr<CropOperation> Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size) { | |||||
| auto op = std::make_shared<CropOperation>(coordinates, size); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CutMixBatchOperation. | |||||
| std::shared_ptr<CutMixBatchOperation> CutMixBatch(ImageBatchFormat image_batch_format, float alpha, float prob) { | |||||
| auto op = std::make_shared<CutMixBatchOperation>(image_batch_format, alpha, prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CutOutOp. | |||||
| std::shared_ptr<CutOutOperation> CutOut(int32_t length, int32_t num_patches) { | |||||
| auto op = std::make_shared<CutOutOperation>(length, num_patches); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create DecodeOperation. | |||||
| std::shared_ptr<DecodeOperation> Decode(bool rgb) { | |||||
| auto op = std::make_shared<DecodeOperation>(rgb); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create HwcToChwOperation. | |||||
| std::shared_ptr<HwcToChwOperation> HWC2CHW() { | |||||
| auto op = std::make_shared<HwcToChwOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create MixUpBatchOperation. | |||||
| std::shared_ptr<MixUpBatchOperation> MixUpBatch(float alpha) { | |||||
| auto op = std::make_shared<MixUpBatchOperation>(alpha); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create NormalizeOperation. | |||||
| std::shared_ptr<NormalizeOperation> Normalize(std::vector<float> mean, std::vector<float> std) { | |||||
| auto op = std::make_shared<NormalizeOperation>(mean, std); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // FUNCTIONS TO CREATE DATA TRANSFORM OPERATIONS | |||||
| // (In alphabetical order) | |||||
| // Function to create OneHotOperation. | // Function to create OneHotOperation. | ||||
| std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes) { | std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes) { | ||||
| @@ -142,373 +42,11 @@ std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes) { | |||||
| return op; | return op; | ||||
| } | } | ||||
| // Function to create PadOperation. | |||||
| std::shared_ptr<PadOperation> Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value, | |||||
| BorderType padding_mode) { | |||||
| auto op = std::make_shared<PadOperation>(padding, fill_value, padding_mode); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomColorOperation. | |||||
| std::shared_ptr<RandomColorOperation> RandomColor(float t_lb, float t_ub) { | |||||
| auto op = std::make_shared<RandomColorOperation>(t_lb, t_ub); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomColorOperation::Build() { | |||||
| std::shared_ptr<RandomColorOp> tensor_op = std::make_shared<RandomColorOp>(t_lb_, t_ub_); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomColorAdjustOperation. | |||||
| std::shared_ptr<RandomColorAdjustOperation> RandomColorAdjust(std::vector<float> brightness, | |||||
| std::vector<float> contrast, | |||||
| std::vector<float> saturation, std::vector<float> hue) { | |||||
| auto op = std::make_shared<RandomColorAdjustOperation>(brightness, contrast, saturation, hue); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomAffineOperation. | |||||
| std::shared_ptr<RandomAffineOperation> RandomAffine(const std::vector<float_t> °rees, | |||||
| const std::vector<float_t> &translate_range, | |||||
| const std::vector<float_t> &scale_range, | |||||
| const std::vector<float_t> &shear_ranges, | |||||
| InterpolationMode interpolation, | |||||
| const std::vector<uint8_t> &fill_value) { | |||||
| auto op = std::make_shared<RandomAffineOperation>(degrees, translate_range, scale_range, shear_ranges, interpolation, | |||||
| fill_value); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomCropOperation. | |||||
| std::shared_ptr<RandomCropOperation> RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding, | |||||
| bool pad_if_needed, std::vector<uint8_t> fill_value, | |||||
| BorderType padding_mode) { | |||||
| auto op = std::make_shared<RandomCropOperation>(size, padding, pad_if_needed, fill_value, padding_mode); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomHorizontalFlipOperation. | |||||
| std::shared_ptr<RandomHorizontalFlipOperation> RandomHorizontalFlip(float prob) { | |||||
| auto op = std::make_shared<RandomHorizontalFlipOperation>(prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomPosterizeOperation. | |||||
| std::shared_ptr<RandomPosterizeOperation> RandomPosterize(const std::vector<uint8_t> &bit_range) { | |||||
| auto op = std::make_shared<RandomPosterizeOperation>(bit_range); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomRotationOperation. | |||||
| std::shared_ptr<RandomRotationOperation> RandomRotation(std::vector<float> degrees, InterpolationMode resample, | |||||
| bool expand, std::vector<float> center, | |||||
| std::vector<uint8_t> fill_value) { | |||||
| auto op = std::make_shared<RandomRotationOperation>(degrees, resample, expand, center, fill_value); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomSolarizeOperation. | |||||
| std::shared_ptr<RandomSolarizeOperation> RandomSolarize(std::vector<uint8_t> threshold) { | |||||
| auto op = std::make_shared<RandomSolarizeOperation>(threshold); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomSharpnessOperation. | |||||
| std::shared_ptr<RandomSharpnessOperation> RandomSharpness(std::vector<float> degrees) { | |||||
| auto op = std::make_shared<RandomSharpnessOperation>(degrees); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomVerticalFlipOperation. | |||||
| std::shared_ptr<RandomVerticalFlipOperation> RandomVerticalFlip(float prob) { | |||||
| auto op = std::make_shared<RandomVerticalFlipOperation>(prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create ResizeOperation. | |||||
| std::shared_ptr<ResizeOperation> Resize(std::vector<int32_t> size, InterpolationMode interpolation) { | |||||
| auto op = std::make_shared<ResizeOperation>(size, interpolation); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RgbaToBgrOperation. | |||||
| std::shared_ptr<RgbaToBgrOperation> RGBA2BGR() { | |||||
| auto op = std::make_shared<RgbaToBgrOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RgbaToRgbOperation. | |||||
| std::shared_ptr<RgbaToRgbOperation> RGBA2RGB() { | |||||
| auto op = std::make_shared<RgbaToRgbOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create SwapRedBlueOperation. | |||||
| std::shared_ptr<SwapRedBlueOperation> SwapRedBlue() { | |||||
| auto op = std::make_shared<SwapRedBlueOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create UniformAugOperation. | |||||
| std::shared_ptr<UniformAugOperation> UniformAugment(std::vector<std::shared_ptr<TensorOperation>> transforms, | |||||
| int32_t num_ops) { | |||||
| auto op = std::make_shared<UniformAugOperation>(transforms, num_ops); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| /* ####################################### Validator Functions ############################################ */ | /* ####################################### Validator Functions ############################################ */ | ||||
| bool CheckVectorPositive(const std::vector<int32_t> &size) { | |||||
| for (int i = 0; i < size.size(); ++i) { | |||||
| if (size[i] <= 0) return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| bool CmpFloat(const float &a, const float &b, float epsilon = 0.0000000001f) { return (std::fabs(a - b) < epsilon); } | |||||
| /* ####################################### Derived TensorOperation classes ################################# */ | /* ####################################### Derived TensorOperation classes ################################# */ | ||||
| // CenterCropOperation | |||||
| CenterCropOperation::CenterCropOperation(std::vector<int32_t> size) : size_(size) {} | |||||
| bool CenterCropOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "CenterCrop: size vector has incorrect size."; | |||||
| return false; | |||||
| } | |||||
| // We have to limit crop size due to library restrictions, optimized to only iterate over size_ once | |||||
| for (int i = 0; i < size_.size(); ++i) { | |||||
| if (size_[i] <= 0) { | |||||
| MS_LOG(ERROR) << "CenterCrop: invalid size, size must be greater than 0, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| if (size_[i] == INT_MAX) { | |||||
| MS_LOG(ERROR) << "CenterCrop: invalid size, size too large, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CenterCropOperation::Build() { | |||||
| int32_t crop_height = size_[0]; | |||||
| int32_t crop_width = 0; | |||||
| // User has specified crop_width. | |||||
| if (size_.size() == 2) { | |||||
| crop_width = size_[1]; | |||||
| } | |||||
| std::shared_ptr<CenterCropOp> tensor_op = std::make_shared<CenterCropOp>(crop_height, crop_width); | |||||
| return tensor_op; | |||||
| } | |||||
| // CropOperation. | |||||
| CropOperation::CropOperation(std::vector<int32_t> coordinates, std::vector<int32_t> size) | |||||
| : coordinates_(coordinates), size_(size) {} | |||||
| bool CropOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (coordinates_.size() != 2) { | |||||
| MS_LOG(ERROR) << "Crop: coordinates must be a vector of two values"; | |||||
| return false; | |||||
| } | |||||
| // we don't check the coordinates here because we don't have access to image dimensions | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "Crop: size must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| // We have to limit crop size due to library restrictions, optimized to only iterate over size_ once | |||||
| for (int i = 0; i < size_.size(); ++i) { | |||||
| if (size_[i] <= 0) { | |||||
| MS_LOG(ERROR) << "Crop: invalid size, size must be greater than 0, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| if (size_[i] == INT_MAX) { | |||||
| MS_LOG(ERROR) << "Crop: invalid size, size too large, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CropOperation::Build() { | |||||
| int32_t x, y, height, width; | |||||
| x = coordinates_[0]; | |||||
| y = coordinates_[1]; | |||||
| height = size_[0]; | |||||
| width = size_[1]; | |||||
| std::shared_ptr<CropOp> tensor_op = std::make_shared<CropOp>(x, y, height, width); | |||||
| return tensor_op; | |||||
| } | |||||
| // CutMixBatchOperation | |||||
| CutMixBatchOperation::CutMixBatchOperation(ImageBatchFormat image_batch_format, float alpha, float prob) | |||||
| : image_batch_format_(image_batch_format), alpha_(alpha), prob_(prob) {} | |||||
| bool CutMixBatchOperation::ValidateParams() { | |||||
| if (alpha_ <= 0) { | |||||
| MS_LOG(ERROR) << "CutMixBatch: alpha must be a positive floating value however it is: " << alpha_; | |||||
| return false; | |||||
| } | |||||
| if (prob_ < 0 || prob_ > 1) { | |||||
| MS_LOG(ERROR) << "CutMixBatch: Probability has to be between 0 and 1."; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CutMixBatchOperation::Build() { | |||||
| std::shared_ptr<CutMixBatchOp> tensor_op = std::make_shared<CutMixBatchOp>(image_batch_format_, alpha_, prob_); | |||||
| return tensor_op; | |||||
| } | |||||
| // CutOutOperation | |||||
| CutOutOperation::CutOutOperation(int32_t length, int32_t num_patches) : length_(length), num_patches_(num_patches) {} | |||||
| bool CutOutOperation::ValidateParams() { | |||||
| if (length_ < 0) { | |||||
| MS_LOG(ERROR) << "CutOut: length cannot be negative"; | |||||
| return false; | |||||
| } | |||||
| if (num_patches_ < 0) { | |||||
| MS_LOG(ERROR) << "CutOut: number of patches cannot be negative"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CutOutOperation::Build() { | |||||
| std::shared_ptr<CutOutOp> tensor_op = std::make_shared<CutOutOp>(length_, length_, num_patches_, false, 0, 0, 0); | |||||
| return tensor_op; | |||||
| } | |||||
| // DecodeOperation | |||||
| DecodeOperation::DecodeOperation(bool rgb) : rgb_(rgb) {} | |||||
| bool DecodeOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> DecodeOperation::Build() { return std::make_shared<DecodeOp>(rgb_); } | |||||
| // HwcToChwOperation | |||||
| bool HwcToChwOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> HwcToChwOperation::Build() { return std::make_shared<HwcToChwOp>(); } | |||||
| // MixUpOperation | |||||
| MixUpBatchOperation::MixUpBatchOperation(float alpha) : alpha_(alpha) {} | |||||
| bool MixUpBatchOperation::ValidateParams() { | |||||
| if (alpha_ <= 0) { | |||||
| MS_LOG(ERROR) << "MixUpBatch: alpha must be a positive floating value however it is: " << alpha_; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> MixUpBatchOperation::Build() { return std::make_shared<MixUpBatchOp>(alpha_); } | |||||
| // NormalizeOperation | |||||
| NormalizeOperation::NormalizeOperation(std::vector<float> mean, std::vector<float> std) : mean_(mean), std_(std) {} | |||||
| bool NormalizeOperation::ValidateParams() { | |||||
| if (mean_.size() != 3) { | |||||
| MS_LOG(ERROR) << "Normalize: mean vector has incorrect size: " << mean_.size(); | |||||
| return false; | |||||
| } | |||||
| // check mean value | |||||
| for (int i = 0; i < mean_.size(); ++i) { | |||||
| if (mean_[i] < 0.0f || mean_[i] > 255.0f || CmpFloat(mean_[i], 0.0f)) { | |||||
| MS_LOG(ERROR) << "Normalize: mean vector has incorrect value: " << mean_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| if (std_.size() != 3) { | |||||
| MS_LOG(ERROR) << "Normalize: std vector has incorrect size: " << std_.size(); | |||||
| return false; | |||||
| } | |||||
| // check std value | |||||
| for (int i = 0; i < std_.size(); ++i) { | |||||
| if (std_[i] < 0.0f || std_[i] > 255.0f || CmpFloat(std_[i], 0.0f)) { | |||||
| MS_LOG(ERROR) << "Normalize: std vector has incorrect value: " << std_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> NormalizeOperation::Build() { | |||||
| return std::make_shared<NormalizeOp>(mean_[0], mean_[1], mean_[2], std_[0], std_[1], std_[2]); | |||||
| } | |||||
| // (In alphabetical order) | |||||
| // OneHotOperation | // OneHotOperation | ||||
| OneHotOperation::OneHotOperation(int32_t num_classes) : num_classes_(num_classes) {} | OneHotOperation::OneHotOperation(int32_t num_classes) : num_classes_(num_classes) {} | ||||
| @@ -524,476 +62,7 @@ bool OneHotOperation::ValidateParams() { | |||||
| std::shared_ptr<TensorOp> OneHotOperation::Build() { return std::make_shared<OneHotOp>(num_classes_); } | std::shared_ptr<TensorOp> OneHotOperation::Build() { return std::make_shared<OneHotOp>(num_classes_); } | ||||
| // PadOperation | |||||
| PadOperation::PadOperation(std::vector<int32_t> padding, std::vector<uint8_t> fill_value, BorderType padding_mode) | |||||
| : padding_(padding), fill_value_(fill_value), padding_mode_(padding_mode) {} | |||||
| bool PadOperation::ValidateParams() { | |||||
| if (padding_.empty() || padding_.size() == 3 || padding_.size() > 4) { | |||||
| MS_LOG(ERROR) << "Pad: padding vector has incorrect size: padding.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || (fill_value_.size() != 1 && fill_value_.size() != 3)) { | |||||
| MS_LOG(ERROR) << "Pad: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> PadOperation::Build() { | |||||
| int32_t pad_top, pad_bottom, pad_left, pad_right; | |||||
| switch (padding_.size()) { | |||||
| case 1: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[0]; | |||||
| pad_right = padding_[0]; | |||||
| pad_bottom = padding_[0]; | |||||
| break; | |||||
| case 2: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[1]; | |||||
| pad_right = padding_[0]; | |||||
| pad_bottom = padding_[1]; | |||||
| break; | |||||
| default: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[1]; | |||||
| pad_right = padding_[2]; | |||||
| pad_bottom = padding_[3]; | |||||
| } | |||||
| uint8_t fill_r, fill_g, fill_b; | |||||
| fill_r = fill_value_[0]; | |||||
| fill_g = fill_value_[0]; | |||||
| fill_b = fill_value_[0]; | |||||
| if (fill_value_.size() == 3) { | |||||
| fill_r = fill_value_[0]; | |||||
| fill_g = fill_value_[1]; | |||||
| fill_b = fill_value_[2]; | |||||
| } | |||||
| std::shared_ptr<PadOp> tensor_op = | |||||
| std::make_shared<PadOp>(pad_top, pad_bottom, pad_left, pad_right, padding_mode_, fill_r, fill_g, fill_b); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomColorOperation. | |||||
| RandomColorOperation::RandomColorOperation(float t_lb, float t_ub) : t_lb_(t_lb), t_ub_(t_ub) {} | |||||
| bool RandomColorOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (t_lb_ > t_ub_) { | |||||
| MS_LOG(ERROR) << "RandomColor: lower bound must be less or equal to upper bound"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| // RandomColorAdjustOperation. | |||||
| RandomColorAdjustOperation::RandomColorAdjustOperation(std::vector<float> brightness, std::vector<float> contrast, | |||||
| std::vector<float> saturation, std::vector<float> hue) | |||||
| : brightness_(brightness), contrast_(contrast), saturation_(saturation), hue_(hue) {} | |||||
| bool RandomColorAdjustOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (brightness_.empty() || brightness_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: brightness must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (contrast_.empty() || contrast_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: contrast must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (saturation_.empty() || saturation_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: saturation must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (hue_.empty() || hue_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: hue must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomColorAdjustOperation::Build() { | |||||
| float brightness_lb, brightness_ub, contrast_lb, contrast_ub, saturation_lb, saturation_ub, hue_lb, hue_ub; | |||||
| brightness_lb = brightness_[0]; | |||||
| brightness_ub = brightness_[0]; | |||||
| if (brightness_.size() == 2) brightness_ub = brightness_[1]; | |||||
| contrast_lb = contrast_[0]; | |||||
| contrast_ub = contrast_[0]; | |||||
| if (contrast_.size() == 2) contrast_ub = contrast_[1]; | |||||
| saturation_lb = saturation_[0]; | |||||
| saturation_ub = saturation_[0]; | |||||
| if (saturation_.size() == 2) saturation_ub = saturation_[1]; | |||||
| hue_lb = hue_[0]; | |||||
| hue_ub = hue_[0]; | |||||
| if (hue_.size() == 2) hue_ub = hue_[1]; | |||||
| std::shared_ptr<RandomColorAdjustOp> tensor_op = std::make_shared<RandomColorAdjustOp>( | |||||
| brightness_lb, brightness_ub, contrast_lb, contrast_ub, saturation_lb, saturation_ub, hue_lb, hue_ub); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomAffineOperation | |||||
| RandomAffineOperation::RandomAffineOperation(const std::vector<float_t> °rees, | |||||
| const std::vector<float_t> &translate_range, | |||||
| const std::vector<float_t> &scale_range, | |||||
| const std::vector<float_t> &shear_ranges, InterpolationMode interpolation, | |||||
| const std::vector<uint8_t> &fill_value) | |||||
| : degrees_(degrees), | |||||
| translate_range_(translate_range), | |||||
| scale_range_(scale_range), | |||||
| shear_ranges_(shear_ranges), | |||||
| interpolation_(interpolation), | |||||
| fill_value_(fill_value) {} | |||||
| bool RandomAffineOperation::ValidateParams() { | |||||
| // Degrees | |||||
| if (degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomAffine: degrees expecting size 2, got: degrees.size() = " << degrees_.size(); | |||||
| return false; | |||||
| } | |||||
| if (degrees_[0] > degrees_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of degrees range is greater than maximum: min = " << degrees_[0] | |||||
| << ", max = " << degrees_[1]; | |||||
| return false; | |||||
| } | |||||
| // Translate | |||||
| if (translate_range_.size() != 2 && translate_range_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomAffine: translate_range expecting size 2 or 4, got: translate_range.size() = " | |||||
| << translate_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[0] > translate_range_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on x is greater than maximum: min = " | |||||
| << translate_range_[0] << ", max = " << translate_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[0] < -1 || translate_range_[0] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on x is out of range of [-1, 1], value = " | |||||
| << translate_range_[0]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[1] < -1 || translate_range_[1] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: maximum of translate range on x is out of range of [-1, 1], value = " | |||||
| << translate_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_.size() == 4) { | |||||
| if (translate_range_[2] > translate_range_[3]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on y is greater than maximum: min = " | |||||
| << translate_range_[2] << ", max = " << translate_range_[3]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[2] < -1 || translate_range_[2] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on y is out of range of [-1, 1], value = " | |||||
| << translate_range_[2]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[3] < -1 || translate_range_[3] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: maximum of translate range on y is out of range of [-1, 1], value = " | |||||
| << translate_range_[3]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| // Scale | |||||
| if (scale_range_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomAffine: scale_range vector has incorrect size: scale_range.size() = " | |||||
| << scale_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (scale_range_[0] > scale_range_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of scale range is greater than maximum: min = " << scale_range_[0] | |||||
| << ", max = " << scale_range_[1]; | |||||
| return false; | |||||
| } | |||||
| // Shear | |||||
| if (shear_ranges_.size() != 2 && shear_ranges_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomAffine: shear_ranges expecting size 2 or 4, got: shear_ranges.size() = " | |||||
| << shear_ranges_.size(); | |||||
| return false; | |||||
| } | |||||
| if (shear_ranges_[0] > shear_ranges_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of horizontal shear range is greater than maximum: min = " | |||||
| << shear_ranges_[0] << ", max = " << shear_ranges_[1]; | |||||
| return false; | |||||
| } | |||||
| if (shear_ranges_.size() == 4 && shear_ranges_[2] > shear_ranges_[3]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of vertical shear range is greater than maximum: min = " << shear_ranges_[2] | |||||
| << ", max = " << scale_range_[3]; | |||||
| return false; | |||||
| } | |||||
| // Fill Value | |||||
| if (fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomAffine: fill_value vector has incorrect size: fill_value.size() = " << fill_value_.size(); | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomAffineOperation::Build() { | |||||
| if (shear_ranges_.size() == 2) { | |||||
| shear_ranges_.resize(4); | |||||
| } | |||||
| if (translate_range_.size() == 2) { | |||||
| translate_range_.resize(4); | |||||
| } | |||||
| auto tensor_op = std::make_shared<RandomAffineOp>(degrees_, translate_range_, scale_range_, shear_ranges_, | |||||
| interpolation_, fill_value_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomCropOperation | |||||
| RandomCropOperation::RandomCropOperation(std::vector<int32_t> size, std::vector<int32_t> padding, bool pad_if_needed, | |||||
| std::vector<uint8_t> fill_value, BorderType padding_mode) | |||||
| : size_(size), | |||||
| padding_(padding), | |||||
| pad_if_needed_(pad_if_needed), | |||||
| fill_value_(fill_value), | |||||
| padding_mode_(padding_mode) {} | |||||
| bool RandomCropOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomCrop: size vector has incorrect size: " << size_.size(); | |||||
| return false; | |||||
| } | |||||
| if (padding_.empty() || padding_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomCrop: padding vector has incorrect size: padding.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomCrop: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomCropOperation::Build() { | |||||
| int32_t crop_height = size_[0]; | |||||
| int32_t crop_width = 0; | |||||
| int32_t pad_top = padding_[0]; | |||||
| int32_t pad_bottom = padding_[1]; | |||||
| int32_t pad_left = padding_[2]; | |||||
| int32_t pad_right = padding_[3]; | |||||
| uint8_t fill_r = fill_value_[0]; | |||||
| uint8_t fill_g = fill_value_[1]; | |||||
| uint8_t fill_b = fill_value_[2]; | |||||
| // User has specified the crop_width value. | |||||
| if (size_.size() == 2) { | |||||
| crop_width = size_[1]; | |||||
| } | |||||
| auto tensor_op = std::make_shared<RandomCropOp>(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, | |||||
| padding_mode_, pad_if_needed_, fill_r, fill_g, fill_b); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomHorizontalFlipOperation | |||||
| RandomHorizontalFlipOperation::RandomHorizontalFlipOperation(float probability) : probability_(probability) {} | |||||
| bool RandomHorizontalFlipOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RandomHorizontalFlipOperation::Build() { | |||||
| std::shared_ptr<RandomHorizontalFlipOp> tensor_op = std::make_shared<RandomHorizontalFlipOp>(probability_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomPosterizeOperation | |||||
| RandomPosterizeOperation::RandomPosterizeOperation(const std::vector<uint8_t> &bit_range) : bit_range_(bit_range) {} | |||||
| bool RandomPosterizeOperation::ValidateParams() { | |||||
| if (bit_range_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: bit_range needs to be of size 2 but is of size: " << bit_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[0] < 1 || bit_range_[0] > 8) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: min_bit value is out of range [1-8]: " << bit_range_[0]; | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[1] < 1 || bit_range_[1] > 8) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: max_bit value is out of range [1-8]: " << bit_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[1] < bit_range_[0]) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: max_bit value is less than min_bit: max =" << bit_range_[1] | |||||
| << ", min = " << bit_range_[0]; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomPosterizeOperation::Build() { | |||||
| std::shared_ptr<RandomPosterizeOp> tensor_op = std::make_shared<RandomPosterizeOp>(bit_range_); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomRotationOperation. | |||||
| RandomRotationOperation::RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, | |||||
| bool expand, std::vector<float> center, | |||||
| std::vector<uint8_t> fill_value) | |||||
| : degrees_(degrees), | |||||
| interpolation_mode_(interpolation_mode), | |||||
| expand_(expand), | |||||
| center_(center), | |||||
| fill_value_(fill_value) {} | |||||
| bool RandomRotationOperation::ValidateParams() { | |||||
| if (degrees_.empty() || degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomRotation: degrees vector has incorrect size: degrees.size()"; | |||||
| return false; | |||||
| } | |||||
| if (center_.empty() || center_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomRotation: center vector has incorrect size: center.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomRotation: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomRotationOperation::Build() { | |||||
| std::shared_ptr<RandomRotationOp> tensor_op = | |||||
| std::make_shared<RandomRotationOp>(degrees_[0], degrees_[1], center_[0], center_[1], interpolation_mode_, expand_, | |||||
| fill_value_[0], fill_value_[1], fill_value_[2]); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomSharpness. | |||||
| RandomSharpnessOperation::RandomSharpnessOperation(std::vector<float> degrees) : degrees_(degrees) {} | |||||
| bool RandomSharpnessOperation::ValidateParams() { | |||||
| if (degrees_.empty() || degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomSharpness: degrees vector has incorrect size: degrees.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomSharpnessOperation::Build() { | |||||
| std::shared_ptr<RandomSharpnessOp> tensor_op = std::make_shared<RandomSharpnessOp>(degrees_[0], degrees_[1]); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomSolarizeOperation. | |||||
| RandomSolarizeOperation::RandomSolarizeOperation(std::vector<uint8_t> threshold) : threshold_(threshold) {} | |||||
| bool RandomSolarizeOperation::ValidateParams() { | |||||
| if (threshold_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomSolarize: threshold vector has incorrect size: " << threshold_.size(); | |||||
| return false; | |||||
| } | |||||
| if (threshold_.at(0) > threshold_.at(1)) { | |||||
| MS_LOG(ERROR) << "RandomSolarize: threshold must be passed in a min, max format"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomSolarizeOperation::Build() { | |||||
| std::shared_ptr<RandomSolarizeOp> tensor_op = std::make_shared<RandomSolarizeOp>(threshold_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomVerticalFlipOperation | |||||
| RandomVerticalFlipOperation::RandomVerticalFlipOperation(float probability) : probability_(probability) {} | |||||
| bool RandomVerticalFlipOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RandomVerticalFlipOperation::Build() { | |||||
| std::shared_ptr<RandomVerticalFlipOp> tensor_op = std::make_shared<RandomVerticalFlipOp>(probability_); | |||||
| return tensor_op; | |||||
| } | |||||
| // ResizeOperation | |||||
| ResizeOperation::ResizeOperation(std::vector<int32_t> size, InterpolationMode interpolation) | |||||
| : size_(size), interpolation_(interpolation) {} | |||||
| bool ResizeOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "Resize: size vector has incorrect size: " << size_.size(); | |||||
| return false; | |||||
| } | |||||
| if (!CheckVectorPositive(size_)) { | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> ResizeOperation::Build() { | |||||
| int32_t height = size_[0]; | |||||
| int32_t width = 0; | |||||
| // User specified the width value. | |||||
| if (size_.size() == 2) { | |||||
| width = size_[1]; | |||||
| } | |||||
| return std::make_shared<ResizeOp>(height, width, interpolation_); | |||||
| } | |||||
| // RgbaToBgrOperation. | |||||
| RgbaToBgrOperation::RgbaToBgrOperation() {} | |||||
| bool RgbaToBgrOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RgbaToBgrOperation::Build() { | |||||
| std::shared_ptr<RgbaToBgrOp> tensor_op = std::make_shared<RgbaToBgrOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // RgbaToRgbOperation. | |||||
| RgbaToRgbOperation::RgbaToRgbOperation() {} | |||||
| bool RgbaToRgbOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RgbaToRgbOperation::Build() { | |||||
| std::shared_ptr<RgbaToRgbOp> tensor_op = std::make_shared<RgbaToRgbOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // SwapRedBlueOperation. | |||||
| SwapRedBlueOperation::SwapRedBlueOperation() {} | |||||
| bool SwapRedBlueOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> SwapRedBlueOperation::Build() { | |||||
| std::shared_ptr<SwapRedBlueOp> tensor_op = std::make_shared<SwapRedBlueOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // UniformAugOperation | |||||
| UniformAugOperation::UniformAugOperation(std::vector<std::shared_ptr<TensorOperation>> transforms, int32_t num_ops) | |||||
| : transforms_(transforms), num_ops_(num_ops) {} | |||||
| bool UniformAugOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> UniformAugOperation::Build() { | |||||
| std::vector<std::shared_ptr<TensorOp>> tensor_ops; | |||||
| (void)std::transform(transforms_.begin(), transforms_.end(), std::back_inserter(tensor_ops), | |||||
| [](std::shared_ptr<TensorOperation> op) -> std::shared_ptr<TensorOp> { return op->Build(); }); | |||||
| std::shared_ptr<UniformAugOp> tensor_op = std::make_shared<UniformAugOp>(tensor_ops, num_ops_); | |||||
| return tensor_op; | |||||
| } | |||||
| } // namespace vision | |||||
| } // namespace transforms | |||||
| } // namespace api | } // namespace api | ||||
| } // namespace dataset | } // namespace dataset | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| @@ -0,0 +1,979 @@ | |||||
| /** | |||||
| * Copyright 2020 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "minddata/dataset/include/transforms.h" | |||||
| #include "minddata/dataset/include/vision.h" | |||||
| #include "minddata/dataset/kernels/image/image_utils.h" | |||||
| // Kernel image headers (in alphabetical order) | |||||
| #include "minddata/dataset/kernels/image/center_crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/cutmix_batch_op.h" | |||||
| #include "minddata/dataset/kernels/image/cut_out_op.h" | |||||
| #include "minddata/dataset/kernels/image/decode_op.h" | |||||
| #include "minddata/dataset/kernels/image/hwc_to_chw_op.h" | |||||
| #include "minddata/dataset/kernels/image/mixup_batch_op.h" | |||||
| #include "minddata/dataset/kernels/image/normalize_op.h" | |||||
| #include "minddata/dataset/kernels/image/pad_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_affine_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_color_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_color_adjust_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_crop_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_horizontal_flip_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_posterize_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_rotation_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_sharpness_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_solarize_op.h" | |||||
| #include "minddata/dataset/kernels/image/random_vertical_flip_op.h" | |||||
| #include "minddata/dataset/kernels/image/resize_op.h" | |||||
| #include "minddata/dataset/kernels/image/rgba_to_bgr_op.h" | |||||
| #include "minddata/dataset/kernels/image/rgba_to_rgb_op.h" | |||||
| #include "minddata/dataset/kernels/image/swap_red_blue_op.h" | |||||
| #include "minddata/dataset/kernels/image/uniform_aug_op.h" | |||||
| namespace mindspore { | |||||
| namespace dataset { | |||||
| namespace api { | |||||
| // Transform operations for computer vision. | |||||
| namespace vision { | |||||
| // FUNCTIONS TO CREATE VISION TRANSFORM OPERATIONS | |||||
| // (In alphabetical order) | |||||
| // Function to create CenterCropOperation. | |||||
| std::shared_ptr<CenterCropOperation> CenterCrop(std::vector<int32_t> size) { | |||||
| auto op = std::make_shared<CenterCropOperation>(size); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CropOperation. | |||||
| std::shared_ptr<CropOperation> Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size) { | |||||
| auto op = std::make_shared<CropOperation>(coordinates, size); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CutMixBatchOperation. | |||||
| std::shared_ptr<CutMixBatchOperation> CutMixBatch(ImageBatchFormat image_batch_format, float alpha, float prob) { | |||||
| auto op = std::make_shared<CutMixBatchOperation>(image_batch_format, alpha, prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create CutOutOp. | |||||
| std::shared_ptr<CutOutOperation> CutOut(int32_t length, int32_t num_patches) { | |||||
| auto op = std::make_shared<CutOutOperation>(length, num_patches); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create DecodeOperation. | |||||
| std::shared_ptr<DecodeOperation> Decode(bool rgb) { | |||||
| auto op = std::make_shared<DecodeOperation>(rgb); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create HwcToChwOperation. | |||||
| std::shared_ptr<HwcToChwOperation> HWC2CHW() { | |||||
| auto op = std::make_shared<HwcToChwOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create MixUpBatchOperation. | |||||
| std::shared_ptr<MixUpBatchOperation> MixUpBatch(float alpha) { | |||||
| auto op = std::make_shared<MixUpBatchOperation>(alpha); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create NormalizeOperation. | |||||
| std::shared_ptr<NormalizeOperation> Normalize(std::vector<float> mean, std::vector<float> std) { | |||||
| auto op = std::make_shared<NormalizeOperation>(mean, std); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create PadOperation. | |||||
| std::shared_ptr<PadOperation> Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value, | |||||
| BorderType padding_mode) { | |||||
| auto op = std::make_shared<PadOperation>(padding, fill_value, padding_mode); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomColorOperation. | |||||
| std::shared_ptr<RandomColorOperation> RandomColor(float t_lb, float t_ub) { | |||||
| auto op = std::make_shared<RandomColorOperation>(t_lb, t_ub); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomColorOperation::Build() { | |||||
| std::shared_ptr<RandomColorOp> tensor_op = std::make_shared<RandomColorOp>(t_lb_, t_ub_); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomColorAdjustOperation. | |||||
| std::shared_ptr<RandomColorAdjustOperation> RandomColorAdjust(std::vector<float> brightness, | |||||
| std::vector<float> contrast, | |||||
| std::vector<float> saturation, std::vector<float> hue) { | |||||
| auto op = std::make_shared<RandomColorAdjustOperation>(brightness, contrast, saturation, hue); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomAffineOperation. | |||||
| std::shared_ptr<RandomAffineOperation> RandomAffine(const std::vector<float_t> °rees, | |||||
| const std::vector<float_t> &translate_range, | |||||
| const std::vector<float_t> &scale_range, | |||||
| const std::vector<float_t> &shear_ranges, | |||||
| InterpolationMode interpolation, | |||||
| const std::vector<uint8_t> &fill_value) { | |||||
| auto op = std::make_shared<RandomAffineOperation>(degrees, translate_range, scale_range, shear_ranges, interpolation, | |||||
| fill_value); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomCropOperation. | |||||
| std::shared_ptr<RandomCropOperation> RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding, | |||||
| bool pad_if_needed, std::vector<uint8_t> fill_value, | |||||
| BorderType padding_mode) { | |||||
| auto op = std::make_shared<RandomCropOperation>(size, padding, pad_if_needed, fill_value, padding_mode); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomHorizontalFlipOperation. | |||||
| std::shared_ptr<RandomHorizontalFlipOperation> RandomHorizontalFlip(float prob) { | |||||
| auto op = std::make_shared<RandomHorizontalFlipOperation>(prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomPosterizeOperation. | |||||
| std::shared_ptr<RandomPosterizeOperation> RandomPosterize(const std::vector<uint8_t> &bit_range) { | |||||
| auto op = std::make_shared<RandomPosterizeOperation>(bit_range); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomRotationOperation. | |||||
| std::shared_ptr<RandomRotationOperation> RandomRotation(std::vector<float> degrees, InterpolationMode resample, | |||||
| bool expand, std::vector<float> center, | |||||
| std::vector<uint8_t> fill_value) { | |||||
| auto op = std::make_shared<RandomRotationOperation>(degrees, resample, expand, center, fill_value); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomSolarizeOperation. | |||||
| std::shared_ptr<RandomSolarizeOperation> RandomSolarize(std::vector<uint8_t> threshold) { | |||||
| auto op = std::make_shared<RandomSolarizeOperation>(threshold); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomSharpnessOperation. | |||||
| std::shared_ptr<RandomSharpnessOperation> RandomSharpness(std::vector<float> degrees) { | |||||
| auto op = std::make_shared<RandomSharpnessOperation>(degrees); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RandomVerticalFlipOperation. | |||||
| std::shared_ptr<RandomVerticalFlipOperation> RandomVerticalFlip(float prob) { | |||||
| auto op = std::make_shared<RandomVerticalFlipOperation>(prob); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create ResizeOperation. | |||||
| std::shared_ptr<ResizeOperation> Resize(std::vector<int32_t> size, InterpolationMode interpolation) { | |||||
| auto op = std::make_shared<ResizeOperation>(size, interpolation); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RgbaToBgrOperation. | |||||
| std::shared_ptr<RgbaToBgrOperation> RGBA2BGR() { | |||||
| auto op = std::make_shared<RgbaToBgrOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create RgbaToRgbOperation. | |||||
| std::shared_ptr<RgbaToRgbOperation> RGBA2RGB() { | |||||
| auto op = std::make_shared<RgbaToRgbOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create SwapRedBlueOperation. | |||||
| std::shared_ptr<SwapRedBlueOperation> SwapRedBlue() { | |||||
| auto op = std::make_shared<SwapRedBlueOperation>(); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| // Function to create UniformAugOperation. | |||||
| std::shared_ptr<UniformAugOperation> UniformAugment(std::vector<std::shared_ptr<TensorOperation>> transforms, | |||||
| int32_t num_ops) { | |||||
| auto op = std::make_shared<UniformAugOperation>(transforms, num_ops); | |||||
| // Input validation | |||||
| if (!op->ValidateParams()) { | |||||
| return nullptr; | |||||
| } | |||||
| return op; | |||||
| } | |||||
| /* ####################################### Validator Functions ############################################ */ | |||||
| bool CheckVectorPositive(const std::vector<int32_t> &size) { | |||||
| for (int i = 0; i < size.size(); ++i) { | |||||
| if (size[i] <= 0) return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| bool CmpFloat(const float &a, const float &b, float epsilon = 0.0000000001f) { return (std::fabs(a - b) < epsilon); } | |||||
| /* ####################################### Derived TensorOperation classes ################################# */ | |||||
| // (In alphabetical order) | |||||
| // CenterCropOperation | |||||
| CenterCropOperation::CenterCropOperation(std::vector<int32_t> size) : size_(size) {} | |||||
| bool CenterCropOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "CenterCrop: size vector has incorrect size."; | |||||
| return false; | |||||
| } | |||||
| // We have to limit crop size due to library restrictions, optimized to only iterate over size_ once | |||||
| for (int i = 0; i < size_.size(); ++i) { | |||||
| if (size_[i] <= 0) { | |||||
| MS_LOG(ERROR) << "CenterCrop: invalid size, size must be greater than 0, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| if (size_[i] == INT_MAX) { | |||||
| MS_LOG(ERROR) << "CenterCrop: invalid size, size too large, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CenterCropOperation::Build() { | |||||
| int32_t crop_height = size_[0]; | |||||
| int32_t crop_width = 0; | |||||
| // User has specified crop_width. | |||||
| if (size_.size() == 2) { | |||||
| crop_width = size_[1]; | |||||
| } | |||||
| std::shared_ptr<CenterCropOp> tensor_op = std::make_shared<CenterCropOp>(crop_height, crop_width); | |||||
| return tensor_op; | |||||
| } | |||||
| // CropOperation. | |||||
| CropOperation::CropOperation(std::vector<int32_t> coordinates, std::vector<int32_t> size) | |||||
| : coordinates_(coordinates), size_(size) {} | |||||
| bool CropOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (coordinates_.size() != 2) { | |||||
| MS_LOG(ERROR) << "Crop: coordinates must be a vector of two values"; | |||||
| return false; | |||||
| } | |||||
| // we don't check the coordinates here because we don't have access to image dimensions | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "Crop: size must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| // We have to limit crop size due to library restrictions, optimized to only iterate over size_ once | |||||
| for (int i = 0; i < size_.size(); ++i) { | |||||
| if (size_[i] <= 0) { | |||||
| MS_LOG(ERROR) << "Crop: invalid size, size must be greater than 0, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| if (size_[i] == INT_MAX) { | |||||
| MS_LOG(ERROR) << "Crop: invalid size, size too large, got: " << size_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CropOperation::Build() { | |||||
| int32_t x, y, height, width; | |||||
| x = coordinates_[0]; | |||||
| y = coordinates_[1]; | |||||
| height = size_[0]; | |||||
| width = size_[1]; | |||||
| std::shared_ptr<CropOp> tensor_op = std::make_shared<CropOp>(x, y, height, width); | |||||
| return tensor_op; | |||||
| } | |||||
| // CutMixBatchOperation | |||||
| CutMixBatchOperation::CutMixBatchOperation(ImageBatchFormat image_batch_format, float alpha, float prob) | |||||
| : image_batch_format_(image_batch_format), alpha_(alpha), prob_(prob) {} | |||||
| bool CutMixBatchOperation::ValidateParams() { | |||||
| if (alpha_ <= 0) { | |||||
| MS_LOG(ERROR) << "CutMixBatch: alpha must be a positive floating value however it is: " << alpha_; | |||||
| return false; | |||||
| } | |||||
| if (prob_ < 0 || prob_ > 1) { | |||||
| MS_LOG(ERROR) << "CutMixBatch: Probability has to be between 0 and 1."; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CutMixBatchOperation::Build() { | |||||
| std::shared_ptr<CutMixBatchOp> tensor_op = std::make_shared<CutMixBatchOp>(image_batch_format_, alpha_, prob_); | |||||
| return tensor_op; | |||||
| } | |||||
| // CutOutOperation | |||||
| CutOutOperation::CutOutOperation(int32_t length, int32_t num_patches) : length_(length), num_patches_(num_patches) {} | |||||
| bool CutOutOperation::ValidateParams() { | |||||
| if (length_ < 0) { | |||||
| MS_LOG(ERROR) << "CutOut: length cannot be negative"; | |||||
| return false; | |||||
| } | |||||
| if (num_patches_ < 0) { | |||||
| MS_LOG(ERROR) << "CutOut: number of patches cannot be negative"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> CutOutOperation::Build() { | |||||
| std::shared_ptr<CutOutOp> tensor_op = std::make_shared<CutOutOp>(length_, length_, num_patches_, false, 0, 0, 0); | |||||
| return tensor_op; | |||||
| } | |||||
| // DecodeOperation | |||||
| DecodeOperation::DecodeOperation(bool rgb) : rgb_(rgb) {} | |||||
| bool DecodeOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> DecodeOperation::Build() { return std::make_shared<DecodeOp>(rgb_); } | |||||
| // HwcToChwOperation | |||||
| bool HwcToChwOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> HwcToChwOperation::Build() { return std::make_shared<HwcToChwOp>(); } | |||||
| // MixUpOperation | |||||
| MixUpBatchOperation::MixUpBatchOperation(float alpha) : alpha_(alpha) {} | |||||
| bool MixUpBatchOperation::ValidateParams() { | |||||
| if (alpha_ <= 0) { | |||||
| MS_LOG(ERROR) << "MixUpBatch: alpha must be a positive floating value however it is: " << alpha_; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> MixUpBatchOperation::Build() { return std::make_shared<MixUpBatchOp>(alpha_); } | |||||
| // NormalizeOperation | |||||
| NormalizeOperation::NormalizeOperation(std::vector<float> mean, std::vector<float> std) : mean_(mean), std_(std) {} | |||||
| bool NormalizeOperation::ValidateParams() { | |||||
| if (mean_.size() != 3) { | |||||
| MS_LOG(ERROR) << "Normalize: mean vector has incorrect size: " << mean_.size(); | |||||
| return false; | |||||
| } | |||||
| // check mean value | |||||
| for (int i = 0; i < mean_.size(); ++i) { | |||||
| if (mean_[i] < 0.0f || mean_[i] > 255.0f || CmpFloat(mean_[i], 0.0f)) { | |||||
| MS_LOG(ERROR) << "Normalize: mean vector has incorrect value: " << mean_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| if (std_.size() != 3) { | |||||
| MS_LOG(ERROR) << "Normalize: std vector has incorrect size: " << std_.size(); | |||||
| return false; | |||||
| } | |||||
| // check std value | |||||
| for (int i = 0; i < std_.size(); ++i) { | |||||
| if (std_[i] < 0.0f || std_[i] > 255.0f || CmpFloat(std_[i], 0.0f)) { | |||||
| MS_LOG(ERROR) << "Normalize: std vector has incorrect value: " << std_[i]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> NormalizeOperation::Build() { | |||||
| return std::make_shared<NormalizeOp>(mean_[0], mean_[1], mean_[2], std_[0], std_[1], std_[2]); | |||||
| } | |||||
| // PadOperation | |||||
| PadOperation::PadOperation(std::vector<int32_t> padding, std::vector<uint8_t> fill_value, BorderType padding_mode) | |||||
| : padding_(padding), fill_value_(fill_value), padding_mode_(padding_mode) {} | |||||
| bool PadOperation::ValidateParams() { | |||||
| if (padding_.empty() || padding_.size() == 3 || padding_.size() > 4) { | |||||
| MS_LOG(ERROR) << "Pad: padding vector has incorrect size: padding.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || (fill_value_.size() != 1 && fill_value_.size() != 3)) { | |||||
| MS_LOG(ERROR) << "Pad: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> PadOperation::Build() { | |||||
| int32_t pad_top, pad_bottom, pad_left, pad_right; | |||||
| switch (padding_.size()) { | |||||
| case 1: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[0]; | |||||
| pad_right = padding_[0]; | |||||
| pad_bottom = padding_[0]; | |||||
| break; | |||||
| case 2: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[1]; | |||||
| pad_right = padding_[0]; | |||||
| pad_bottom = padding_[1]; | |||||
| break; | |||||
| default: | |||||
| pad_left = padding_[0]; | |||||
| pad_top = padding_[1]; | |||||
| pad_right = padding_[2]; | |||||
| pad_bottom = padding_[3]; | |||||
| } | |||||
| uint8_t fill_r, fill_g, fill_b; | |||||
| fill_r = fill_value_[0]; | |||||
| fill_g = fill_value_[0]; | |||||
| fill_b = fill_value_[0]; | |||||
| if (fill_value_.size() == 3) { | |||||
| fill_r = fill_value_[0]; | |||||
| fill_g = fill_value_[1]; | |||||
| fill_b = fill_value_[2]; | |||||
| } | |||||
| std::shared_ptr<PadOp> tensor_op = | |||||
| std::make_shared<PadOp>(pad_top, pad_bottom, pad_left, pad_right, padding_mode_, fill_r, fill_g, fill_b); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomColorOperation. | |||||
| RandomColorOperation::RandomColorOperation(float t_lb, float t_ub) : t_lb_(t_lb), t_ub_(t_ub) {} | |||||
| bool RandomColorOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (t_lb_ > t_ub_) { | |||||
| MS_LOG(ERROR) << "RandomColor: lower bound must be less or equal to upper bound"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| // RandomColorAdjustOperation. | |||||
| RandomColorAdjustOperation::RandomColorAdjustOperation(std::vector<float> brightness, std::vector<float> contrast, | |||||
| std::vector<float> saturation, std::vector<float> hue) | |||||
| : brightness_(brightness), contrast_(contrast), saturation_(saturation), hue_(hue) {} | |||||
| bool RandomColorAdjustOperation::ValidateParams() { | |||||
| // Do some input validation. | |||||
| if (brightness_.empty() || brightness_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: brightness must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (contrast_.empty() || contrast_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: contrast must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (saturation_.empty() || saturation_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: saturation must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| if (hue_.empty() || hue_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomColorAdjust: hue must be a vector of one or two values"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomColorAdjustOperation::Build() { | |||||
| float brightness_lb, brightness_ub, contrast_lb, contrast_ub, saturation_lb, saturation_ub, hue_lb, hue_ub; | |||||
| brightness_lb = brightness_[0]; | |||||
| brightness_ub = brightness_[0]; | |||||
| if (brightness_.size() == 2) brightness_ub = brightness_[1]; | |||||
| contrast_lb = contrast_[0]; | |||||
| contrast_ub = contrast_[0]; | |||||
| if (contrast_.size() == 2) contrast_ub = contrast_[1]; | |||||
| saturation_lb = saturation_[0]; | |||||
| saturation_ub = saturation_[0]; | |||||
| if (saturation_.size() == 2) saturation_ub = saturation_[1]; | |||||
| hue_lb = hue_[0]; | |||||
| hue_ub = hue_[0]; | |||||
| if (hue_.size() == 2) hue_ub = hue_[1]; | |||||
| std::shared_ptr<RandomColorAdjustOp> tensor_op = std::make_shared<RandomColorAdjustOp>( | |||||
| brightness_lb, brightness_ub, contrast_lb, contrast_ub, saturation_lb, saturation_ub, hue_lb, hue_ub); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomAffineOperation | |||||
| RandomAffineOperation::RandomAffineOperation(const std::vector<float_t> °rees, | |||||
| const std::vector<float_t> &translate_range, | |||||
| const std::vector<float_t> &scale_range, | |||||
| const std::vector<float_t> &shear_ranges, InterpolationMode interpolation, | |||||
| const std::vector<uint8_t> &fill_value) | |||||
| : degrees_(degrees), | |||||
| translate_range_(translate_range), | |||||
| scale_range_(scale_range), | |||||
| shear_ranges_(shear_ranges), | |||||
| interpolation_(interpolation), | |||||
| fill_value_(fill_value) {} | |||||
| bool RandomAffineOperation::ValidateParams() { | |||||
| // Degrees | |||||
| if (degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomAffine: degrees expecting size 2, got: degrees.size() = " << degrees_.size(); | |||||
| return false; | |||||
| } | |||||
| if (degrees_[0] > degrees_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of degrees range is greater than maximum: min = " << degrees_[0] | |||||
| << ", max = " << degrees_[1]; | |||||
| return false; | |||||
| } | |||||
| // Translate | |||||
| if (translate_range_.size() != 2 && translate_range_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomAffine: translate_range expecting size 2 or 4, got: translate_range.size() = " | |||||
| << translate_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[0] > translate_range_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on x is greater than maximum: min = " | |||||
| << translate_range_[0] << ", max = " << translate_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[0] < -1 || translate_range_[0] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on x is out of range of [-1, 1], value = " | |||||
| << translate_range_[0]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[1] < -1 || translate_range_[1] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: maximum of translate range on x is out of range of [-1, 1], value = " | |||||
| << translate_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_.size() == 4) { | |||||
| if (translate_range_[2] > translate_range_[3]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on y is greater than maximum: min = " | |||||
| << translate_range_[2] << ", max = " << translate_range_[3]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[2] < -1 || translate_range_[2] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of translate range on y is out of range of [-1, 1], value = " | |||||
| << translate_range_[2]; | |||||
| return false; | |||||
| } | |||||
| if (translate_range_[3] < -1 || translate_range_[3] > 1) { | |||||
| MS_LOG(ERROR) << "RandomAffine: maximum of translate range on y is out of range of [-1, 1], value = " | |||||
| << translate_range_[3]; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| // Scale | |||||
| if (scale_range_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomAffine: scale_range vector has incorrect size: scale_range.size() = " | |||||
| << scale_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (scale_range_[0] > scale_range_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of scale range is greater than maximum: min = " << scale_range_[0] | |||||
| << ", max = " << scale_range_[1]; | |||||
| return false; | |||||
| } | |||||
| // Shear | |||||
| if (shear_ranges_.size() != 2 && shear_ranges_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomAffine: shear_ranges expecting size 2 or 4, got: shear_ranges.size() = " | |||||
| << shear_ranges_.size(); | |||||
| return false; | |||||
| } | |||||
| if (shear_ranges_[0] > shear_ranges_[1]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of horizontal shear range is greater than maximum: min = " | |||||
| << shear_ranges_[0] << ", max = " << shear_ranges_[1]; | |||||
| return false; | |||||
| } | |||||
| if (shear_ranges_.size() == 4 && shear_ranges_[2] > shear_ranges_[3]) { | |||||
| MS_LOG(ERROR) << "RandomAffine: minimum of vertical shear range is greater than maximum: min = " << shear_ranges_[2] | |||||
| << ", max = " << scale_range_[3]; | |||||
| return false; | |||||
| } | |||||
| // Fill Value | |||||
| if (fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomAffine: fill_value vector has incorrect size: fill_value.size() = " << fill_value_.size(); | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomAffineOperation::Build() { | |||||
| if (shear_ranges_.size() == 2) { | |||||
| shear_ranges_.resize(4); | |||||
| } | |||||
| if (translate_range_.size() == 2) { | |||||
| translate_range_.resize(4); | |||||
| } | |||||
| auto tensor_op = std::make_shared<RandomAffineOp>(degrees_, translate_range_, scale_range_, shear_ranges_, | |||||
| interpolation_, fill_value_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomCropOperation | |||||
| RandomCropOperation::RandomCropOperation(std::vector<int32_t> size, std::vector<int32_t> padding, bool pad_if_needed, | |||||
| std::vector<uint8_t> fill_value, BorderType padding_mode) | |||||
| : size_(size), | |||||
| padding_(padding), | |||||
| pad_if_needed_(pad_if_needed), | |||||
| fill_value_(fill_value), | |||||
| padding_mode_(padding_mode) {} | |||||
| bool RandomCropOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "RandomCrop: size vector has incorrect size: " << size_.size(); | |||||
| return false; | |||||
| } | |||||
| if (padding_.empty() || padding_.size() != 4) { | |||||
| MS_LOG(ERROR) << "RandomCrop: padding vector has incorrect size: padding.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomCrop: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomCropOperation::Build() { | |||||
| int32_t crop_height = size_[0]; | |||||
| int32_t crop_width = 0; | |||||
| int32_t pad_top = padding_[0]; | |||||
| int32_t pad_bottom = padding_[1]; | |||||
| int32_t pad_left = padding_[2]; | |||||
| int32_t pad_right = padding_[3]; | |||||
| uint8_t fill_r = fill_value_[0]; | |||||
| uint8_t fill_g = fill_value_[1]; | |||||
| uint8_t fill_b = fill_value_[2]; | |||||
| // User has specified the crop_width value. | |||||
| if (size_.size() == 2) { | |||||
| crop_width = size_[1]; | |||||
| } | |||||
| auto tensor_op = std::make_shared<RandomCropOp>(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, | |||||
| padding_mode_, pad_if_needed_, fill_r, fill_g, fill_b); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomHorizontalFlipOperation | |||||
| RandomHorizontalFlipOperation::RandomHorizontalFlipOperation(float probability) : probability_(probability) {} | |||||
| bool RandomHorizontalFlipOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RandomHorizontalFlipOperation::Build() { | |||||
| std::shared_ptr<RandomHorizontalFlipOp> tensor_op = std::make_shared<RandomHorizontalFlipOp>(probability_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomPosterizeOperation | |||||
| RandomPosterizeOperation::RandomPosterizeOperation(const std::vector<uint8_t> &bit_range) : bit_range_(bit_range) {} | |||||
| bool RandomPosterizeOperation::ValidateParams() { | |||||
| if (bit_range_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: bit_range needs to be of size 2 but is of size: " << bit_range_.size(); | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[0] < 1 || bit_range_[0] > 8) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: min_bit value is out of range [1-8]: " << bit_range_[0]; | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[1] < 1 || bit_range_[1] > 8) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: max_bit value is out of range [1-8]: " << bit_range_[1]; | |||||
| return false; | |||||
| } | |||||
| if (bit_range_[1] < bit_range_[0]) { | |||||
| MS_LOG(ERROR) << "RandomPosterize: max_bit value is less than min_bit: max =" << bit_range_[1] | |||||
| << ", min = " << bit_range_[0]; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomPosterizeOperation::Build() { | |||||
| std::shared_ptr<RandomPosterizeOp> tensor_op = std::make_shared<RandomPosterizeOp>(bit_range_); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomRotationOperation. | |||||
| RandomRotationOperation::RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, | |||||
| bool expand, std::vector<float> center, | |||||
| std::vector<uint8_t> fill_value) | |||||
| : degrees_(degrees), | |||||
| interpolation_mode_(interpolation_mode), | |||||
| expand_(expand), | |||||
| center_(center), | |||||
| fill_value_(fill_value) {} | |||||
| bool RandomRotationOperation::ValidateParams() { | |||||
| if (degrees_.empty() || degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomRotation: degrees vector has incorrect size: degrees.size()"; | |||||
| return false; | |||||
| } | |||||
| if (center_.empty() || center_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomRotation: center vector has incorrect size: center.size()"; | |||||
| return false; | |||||
| } | |||||
| if (fill_value_.empty() || fill_value_.size() != 3) { | |||||
| MS_LOG(ERROR) << "RandomRotation: fill_value vector has incorrect size: fill_value.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomRotationOperation::Build() { | |||||
| std::shared_ptr<RandomRotationOp> tensor_op = | |||||
| std::make_shared<RandomRotationOp>(degrees_[0], degrees_[1], center_[0], center_[1], interpolation_mode_, expand_, | |||||
| fill_value_[0], fill_value_[1], fill_value_[2]); | |||||
| return tensor_op; | |||||
| } | |||||
| // Function to create RandomSharpness. | |||||
| RandomSharpnessOperation::RandomSharpnessOperation(std::vector<float> degrees) : degrees_(degrees) {} | |||||
| bool RandomSharpnessOperation::ValidateParams() { | |||||
| if (degrees_.empty() || degrees_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomSharpness: degrees vector has incorrect size: degrees.size()"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomSharpnessOperation::Build() { | |||||
| std::shared_ptr<RandomSharpnessOp> tensor_op = std::make_shared<RandomSharpnessOp>(degrees_[0], degrees_[1]); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomSolarizeOperation. | |||||
| RandomSolarizeOperation::RandomSolarizeOperation(std::vector<uint8_t> threshold) : threshold_(threshold) {} | |||||
| bool RandomSolarizeOperation::ValidateParams() { | |||||
| if (threshold_.size() != 2) { | |||||
| MS_LOG(ERROR) << "RandomSolarize: threshold vector has incorrect size: " << threshold_.size(); | |||||
| return false; | |||||
| } | |||||
| if (threshold_.at(0) > threshold_.at(1)) { | |||||
| MS_LOG(ERROR) << "RandomSolarize: threshold must be passed in a min, max format"; | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> RandomSolarizeOperation::Build() { | |||||
| std::shared_ptr<RandomSolarizeOp> tensor_op = std::make_shared<RandomSolarizeOp>(threshold_); | |||||
| return tensor_op; | |||||
| } | |||||
| // RandomVerticalFlipOperation | |||||
| RandomVerticalFlipOperation::RandomVerticalFlipOperation(float probability) : probability_(probability) {} | |||||
| bool RandomVerticalFlipOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RandomVerticalFlipOperation::Build() { | |||||
| std::shared_ptr<RandomVerticalFlipOp> tensor_op = std::make_shared<RandomVerticalFlipOp>(probability_); | |||||
| return tensor_op; | |||||
| } | |||||
| // ResizeOperation | |||||
| ResizeOperation::ResizeOperation(std::vector<int32_t> size, InterpolationMode interpolation) | |||||
| : size_(size), interpolation_(interpolation) {} | |||||
| bool ResizeOperation::ValidateParams() { | |||||
| if (size_.empty() || size_.size() > 2) { | |||||
| MS_LOG(ERROR) << "Resize: size vector has incorrect size: " << size_.size(); | |||||
| return false; | |||||
| } | |||||
| if (!CheckVectorPositive(size_)) { | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| std::shared_ptr<TensorOp> ResizeOperation::Build() { | |||||
| int32_t height = size_[0]; | |||||
| int32_t width = 0; | |||||
| // User specified the width value. | |||||
| if (size_.size() == 2) { | |||||
| width = size_[1]; | |||||
| } | |||||
| return std::make_shared<ResizeOp>(height, width, interpolation_); | |||||
| } | |||||
| // RgbaToBgrOperation. | |||||
| RgbaToBgrOperation::RgbaToBgrOperation() {} | |||||
| bool RgbaToBgrOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RgbaToBgrOperation::Build() { | |||||
| std::shared_ptr<RgbaToBgrOp> tensor_op = std::make_shared<RgbaToBgrOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // RgbaToRgbOperation. | |||||
| RgbaToRgbOperation::RgbaToRgbOperation() {} | |||||
| bool RgbaToRgbOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> RgbaToRgbOperation::Build() { | |||||
| std::shared_ptr<RgbaToRgbOp> tensor_op = std::make_shared<RgbaToRgbOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // SwapRedBlueOperation. | |||||
| SwapRedBlueOperation::SwapRedBlueOperation() {} | |||||
| bool SwapRedBlueOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> SwapRedBlueOperation::Build() { | |||||
| std::shared_ptr<SwapRedBlueOp> tensor_op = std::make_shared<SwapRedBlueOp>(); | |||||
| return tensor_op; | |||||
| } | |||||
| // UniformAugOperation | |||||
| UniformAugOperation::UniformAugOperation(std::vector<std::shared_ptr<TensorOperation>> transforms, int32_t num_ops) | |||||
| : transforms_(transforms), num_ops_(num_ops) {} | |||||
| bool UniformAugOperation::ValidateParams() { return true; } | |||||
| std::shared_ptr<TensorOp> UniformAugOperation::Build() { | |||||
| std::vector<std::shared_ptr<TensorOp>> tensor_ops; | |||||
| (void)std::transform(transforms_.begin(), transforms_.end(), std::back_inserter(tensor_ops), | |||||
| [](std::shared_ptr<TensorOperation> op) -> std::shared_ptr<TensorOp> { return op->Build(); }); | |||||
| std::shared_ptr<UniformAugOp> tensor_op = std::make_shared<UniformAugOp>(tensor_ops, num_ops_); | |||||
| return tensor_op; | |||||
| } | |||||
| } // namespace vision | |||||
| } // namespace api | |||||
| } // namespace dataset | |||||
| } // namespace mindspore | |||||
| @@ -14,8 +14,8 @@ | |||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_API_TEXT_H_ | |||||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_API_TEXT_H_ | |||||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TEXT_H_ | |||||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TEXT_H_ | |||||
| #include <vector> | #include <vector> | ||||
| #include <memory> | #include <memory> | ||||
| @@ -68,4 +68,4 @@ class LookupOperation : public TensorOperation { | |||||
| } // namespace api | } // namespace api | ||||
| } // namespace dataset | } // namespace dataset | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_API_TEXT_H_ | |||||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TEXT_H_ | |||||
| @@ -14,8 +14,8 @@ | |||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_API_TRANSFORMS_H_ | |||||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_API_TRANSFORMS_H_ | |||||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TRANSFORMS_H_ | |||||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TRANSFORMS_H_ | |||||
| #include <vector> | #include <vector> | ||||
| #include <memory> | #include <memory> | ||||
| @@ -43,92 +43,11 @@ class TensorOperation : public std::enable_shared_from_this<TensorOperation> { | |||||
| virtual bool ValidateParams() = 0; | virtual bool ValidateParams() = 0; | ||||
| }; | }; | ||||
| // Transform operations for performing computer vision. | |||||
| namespace vision { | |||||
| // Transform operations for performing data transformation. | |||||
| namespace transforms { | |||||
| // Transform Op classes (in alphabetical order) | // Transform Op classes (in alphabetical order) | ||||
| class CenterCropOperation; | |||||
| class CropOperation; | |||||
| class CutMixBatchOperation; | |||||
| class CutOutOperation; | |||||
| class DecodeOperation; | |||||
| class HwcToChwOperation; | |||||
| class MixUpBatchOperation; | |||||
| class NormalizeOperation; | |||||
| class OneHotOperation; | class OneHotOperation; | ||||
| class PadOperation; | |||||
| class RandomAffineOperation; | |||||
| class RandomColorOperation; | |||||
| class RandomColorAdjustOperation; | |||||
| class RandomCropOperation; | |||||
| class RandomHorizontalFlipOperation; | |||||
| class RandomPosterizeOperation; | |||||
| class RandomRotationOperation; | |||||
| class RandomSharpnessOperation; | |||||
| class RandomSolarizeOperation; | |||||
| class RandomVerticalFlipOperation; | |||||
| class ResizeOperation; | |||||
| class RgbaToBgrOperation; | |||||
| class RgbaToRgbOperation; | |||||
| class SwapRedBlueOperation; | |||||
| class UniformAugOperation; | |||||
| /// \brief Function to create a CenterCrop TensorOperation. | |||||
| /// \notes Crops the input image at the center to the given size. | |||||
| /// \param[in] size - a vector representing the output size of the cropped image. | |||||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||||
| /// If size has 2 values, it should be (height, width). | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<CenterCropOperation> CenterCrop(std::vector<int32_t> size); | |||||
| /// \brief Function to create a Crop TensorOp | |||||
| /// \notes Crop an image based on location and crop size | |||||
| /// \param[in] coordinates Starting location of crop. Must be a vector of two values, in the form of {x_coor, y_coor} | |||||
| /// \param[in] size Size of the cropped area. Must be a vector of two values, in the form of {height, width} | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CropOperation> Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size); | |||||
| /// \brief Function to apply CutMix on a batch of images | |||||
| /// \notes Masks a random section of each image with the corresponding part of another randomly selected image in | |||||
| /// that batch | |||||
| /// \param[in] image_batch_format The format of the batch | |||||
| /// \param[in] alpha The hyperparameter of beta distribution (default = 1.0) | |||||
| /// \param[in] prob The probability by which CutMix is applied to each image (default = 1.0) | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CutMixBatchOperation> CutMixBatch(ImageBatchFormat image_batch_format, float alpha = 1.0, | |||||
| float prob = 1.0); | |||||
| /// \brief Function to create a CutOut TensorOp | |||||
| /// \notes Randomly cut (mask) out a given number of square patches from the input image | |||||
| /// \param[in] length Integer representing the side length of each square patch | |||||
| /// \param[in] num_patches Integer representing the number of patches to be cut out of an image | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CutOutOperation> CutOut(int32_t length, int32_t num_patches = 1); | |||||
| /// \brief Function to create a Decode TensorOperation. | |||||
| /// \notes Decode the input image in RGB mode. | |||||
| /// \param[in] rgb - a boolean of whether to decode in RGB mode or not. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<DecodeOperation> Decode(bool rgb = true); | |||||
| /// \brief Function to create a HwcToChw TensorOperation. | |||||
| /// \notes Transpose the input image; shape (H, W, C) to shape (C, H, W). | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<HwcToChwOperation> HWC2CHW(); | |||||
| /// \brief Function to create a MixUpBatch TensorOperation. | |||||
| /// \notes Apply MixUp transformation on an input batch of images and labels. The labels must be in one-hot format and | |||||
| /// Batch must be called before calling this function. | |||||
| /// \param[in] alpha hyperparameter of beta distribution (default = 1.0) | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<MixUpBatchOperation> MixUpBatch(float alpha = 1); | |||||
| /// \brief Function to create a Normalize TensorOperation. | |||||
| /// \notes Normalize the input image with respect to mean and standard deviation. | |||||
| /// \param[in] mean A vector of mean values for each channel, w.r.t channel order. | |||||
| /// \param[in] std A vector of standard deviations for each channel, w.r.t. channel order. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<NormalizeOperation> Normalize(std::vector<float> mean, std::vector<float> std); | |||||
| /// \brief Function to create a OneHot TensorOperation. | /// \brief Function to create a OneHot TensorOperation. | ||||
| /// \notes Convert the labels into OneHot format. | /// \notes Convert the labels into OneHot format. | ||||
| @@ -136,281 +55,8 @@ std::shared_ptr<NormalizeOperation> Normalize(std::vector<float> mean, std::vect | |||||
| /// \return Shared pointer to the current TensorOperation. | /// \return Shared pointer to the current TensorOperation. | ||||
| std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes); | std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes); | ||||
| /// \brief Function to create a Pad TensorOp | |||||
| /// \notes Pads the image according to padding parameters | |||||
| /// \param[in] padding A vector representing the number of pixels to pad the image | |||||
| /// If vector has one value, it pads all sides of the image with that value | |||||
| /// If vector has two values, it pads left and right with the first and | |||||
| /// top and bottom with the second value | |||||
| /// If vector has four values, it pads left, top, right, and bottom with | |||||
| /// those values respectively | |||||
| /// \param[in] fill_value A vector representing the pixel intensity of the borders if the padding_mode is | |||||
| /// BorderType.kConstant. If 3 values are provided, | |||||
| /// it is used to fill R, G, B channels respectively | |||||
| /// \param[in] padding_mode The method of padding (default=BorderType.kConstant) | |||||
| /// Can be any of | |||||
| /// [BorderType.kConstant, BorderType.kEdge, BorderType.kReflect, BorderType.kSymmetric] | |||||
| /// - BorderType.kConstant, means it fills the border with constant values | |||||
| /// - BorderType.kEdge, means it pads with the last value on the edge | |||||
| /// - BorderType.kReflect, means it reflects the values on the edge omitting the last value of edge | |||||
| /// - BorderType.kSymmetric, means it reflects the values on the edge repeating the last value of edge | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<PadOperation> Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value = {0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| /// \brief Function to create a RandomAffine TensorOperation. | |||||
| /// \notes Applies a Random Affine transformation on input image in RGB or Greyscale mode. | |||||
| /// \param[in] degrees A float vector size 2, representing the starting and ending degree | |||||
| /// \param[in] translate_range A float vector size 2 or 4, representing percentages of translation on x and y axes. | |||||
| /// if size is 2, (min_dx, max_dx, 0, 0) | |||||
| /// if size is 4, (min_dx, max_dx, min_dy, max_dy) | |||||
| /// all values are in range [-1, 1] | |||||
| /// \param[in] scale_range A float vector size 2, representing the starting and ending scales in the range. | |||||
| /// \param[in] shear_ranges A float vector size 2 or 4, representing the starting and ending shear degrees vertically | |||||
| /// and horizontally. | |||||
| /// if size is 2, (min_shear_x, max_shear_x, 0, 0) | |||||
| /// if size is 4, (min_shear_x, max_shear_x, min_shear_y, max_shear_y) | |||||
| /// \param[in] interpolation An enum for the mode of interpolation | |||||
| /// \param[in] fill_value A uint8_t vector size 3, representing the pixel intensity of the borders, it is used to | |||||
| /// fill R, G, B channels respectively. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomAffineOperation> RandomAffine( | |||||
| const std::vector<float_t> °rees, const std::vector<float_t> &translate_range = {0.0, 0.0, 0.0, 0.0}, | |||||
| const std::vector<float_t> &scale_range = {1.0, 1.0}, const std::vector<float_t> &shear_ranges = {0.0, 0.0, 0.0, 0.0}, | |||||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||||
| /// \brief Blends an image with its grayscale version with random weights | |||||
| /// t and 1 - t generated from a given range. If the range is trivial | |||||
| /// then the weights are determinate and t equals the bound of the interval | |||||
| /// \param[in] t_lb lower bound on the range of random weights | |||||
| /// \param[in] t_lb upper bound on the range of random weights | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomColorOperation> RandomColor(float t_lb, float t_ub); | |||||
| /// \brief Randomly adjust the brightness, contrast, saturation, and hue of the input image | |||||
| /// \param[in] brightness Brightness adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] contrast Contrast adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] saturation Saturation adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] hue Brightness adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it must be in the form of [min, max] where -0.5 <= min <= max <= 0.5 | |||||
| /// Default value is {0, 0} | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomColorAdjustOperation> RandomColorAdjust(std::vector<float> brightness = {1.0, 1.0}, | |||||
| std::vector<float> contrast = {1.0, 1.0}, | |||||
| std::vector<float> saturation = {1.0, 1.0}, | |||||
| std::vector<float> hue = {0.0, 0.0}); | |||||
| /// \brief Function to create a RandomCrop TensorOperation. | |||||
| /// \notes Crop the input image at a random location. | |||||
| /// \param[in] size - a vector representing the output size of the cropped image. | |||||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||||
| /// If size has 2 values, it should be (height, width). | |||||
| /// \param[in] padding - a vector with the value of pixels to pad the image. If 4 values are provided, | |||||
| /// it pads the left, top, right and bottom respectively. | |||||
| /// \param[in] pad_if_needed - a boolean whether to pad the image if either side is smaller than | |||||
| /// the given output size. | |||||
| /// \param[in] fill_value - a vector representing the pixel intensity of the borders, it is used to | |||||
| /// fill R, G, B channels respectively. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomCropOperation> RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| /// \brief Function to create a RandomHorizontalFlip TensorOperation. | |||||
| /// \notes Tensor operation to perform random horizontal flip. | |||||
| /// \param[in] prob - float representing the probability of flip. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomHorizontalFlipOperation> RandomHorizontalFlip(float prob = 0.5); | |||||
| /// \brief Function to create a RandomPosterize TensorOperation. | |||||
| /// \notes Tensor operation to perform random posterize. | |||||
| /// \param[in] bit_range - uint8_t vector representing the minimum and maximum bit in range. (Default={4, 8}) | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomPosterizeOperation> RandomPosterize(const std::vector<uint8_t> &bit_range = {4, 8}); | |||||
| /// \brief Function to create a RandomRotation TensorOp | |||||
| /// \notes Rotates the image according to parameters | |||||
| /// \param[in] degrees A float vector size 2, representing the starting and ending degree | |||||
| /// \param[in] resample An enum for the mode of interpolation | |||||
| /// \param[in] expand A boolean representing whether the image is expanded after rotation | |||||
| /// \param[in] center A float vector size 2, representing the x and y center of rotation. | |||||
| /// \param[in] fill_value A uint8_t vector size 3, representing the rgb value of the fill color | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomRotationOperation> RandomRotation( | |||||
| std::vector<float> degrees, InterpolationMode resample = InterpolationMode::kNearestNeighbour, bool expand = false, | |||||
| std::vector<float> center = {-1, -1}, std::vector<uint8_t> fill_value = {0, 0, 0}); | |||||
| /// \brief Function to create a RandomSharpness TensorOperation. | |||||
| /// \notes Tensor operation to perform random sharpness. | |||||
| /// \param[in] start_degree - float representing the start of the range to uniformly sample the factor from it. | |||||
| /// \param[in] end_degree - float representing the end of the range. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomSharpnessOperation> RandomSharpness(std::vector<float> degrees = {0.1, 1.9}); | |||||
| /// \brief Function to create a RandomSolarize TensorOperation. | |||||
| /// \notes Invert pixels within specified range. If min=max, then it inverts all pixel above that threshold | |||||
| /// \param[in] threshold - a vector with two elements specifying the pixel range to invert. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomSolarizeOperation> RandomSolarize(std::vector<uint8_t> threshold = {0, 255}); | |||||
| /// \brief Function to create a RandomVerticalFlip TensorOperation. | |||||
| /// \notes Tensor operation to perform random vertical flip. | |||||
| /// \param[in] prob - float representing the probability of flip. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomVerticalFlipOperation> RandomVerticalFlip(float prob = 0.5); | |||||
| /// \brief Function to create a RgbaToBgr TensorOperation. | |||||
| /// \notes Changes the input 4 channel RGBA tensor to 3 channel BGR. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RgbaToBgrOperation> RGBA2BGR(); | |||||
| /// \brief Function to create a RgbaToRgb TensorOperation. | |||||
| /// \notes Changes the input 4 channel RGBA tensor to 3 channel RGB. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RgbaToRgbOperation> RGBA2RGB(); | |||||
| /// \brief Function to create a Resize TensorOperation. | |||||
| /// \notes Resize the input image to the given size. | |||||
| /// \param[in] size - a vector representing the output size of the resized image. | |||||
| /// If size is a single value, the image will be resized to this value with | |||||
| /// the same image aspect ratio. If size has 2 values, it should be (height, width). | |||||
| /// \param[in] interpolation An enum for the mode of interpolation | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<ResizeOperation> Resize(std::vector<int32_t> size, | |||||
| InterpolationMode interpolation = InterpolationMode::kLinear); | |||||
| /// \brief Function to create a SwapRedBlue TensorOp | |||||
| /// \notes Swaps the red and blue channels in image | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<SwapRedBlueOperation> SwapRedBlue(); | |||||
| /// \brief Function to create a UniformAugment TensorOperation. | |||||
| /// \notes Tensor operation to perform randomly selected augmentation. | |||||
| /// \param[in] transforms - a vector of TensorOperation transforms. | |||||
| /// \param[in] num_ops - integer representing the number of OPs to be selected and applied. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<UniformAugOperation> UniformAugment(std::vector<std::shared_ptr<TensorOperation>> transforms, | |||||
| int32_t num_ops = 2); | |||||
| /* ####################################### Derived TensorOperation classes ################################# */ | /* ####################################### Derived TensorOperation classes ################################# */ | ||||
| class CenterCropOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CenterCropOperation(std::vector<int32_t> size); | |||||
| ~CenterCropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| }; | |||||
| class CropOperation : public TensorOperation { | |||||
| public: | |||||
| CropOperation(std::vector<int32_t> coordinates, std::vector<int32_t> size); | |||||
| ~CropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> coordinates_; | |||||
| std::vector<int32_t> size_; | |||||
| }; | |||||
| class CutMixBatchOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CutMixBatchOperation(ImageBatchFormat image_batch_format, float alpha = 1.0, float prob = 1.0); | |||||
| ~CutMixBatchOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float alpha_; | |||||
| float prob_; | |||||
| ImageBatchFormat image_batch_format_; | |||||
| }; | |||||
| class CutOutOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CutOutOperation(int32_t length, int32_t num_patches = 1); | |||||
| ~CutOutOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| int32_t length_; | |||||
| int32_t num_patches_; | |||||
| ImageBatchFormat image_batch_format_; | |||||
| }; | |||||
| class DecodeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit DecodeOperation(bool rgb = true); | |||||
| ~DecodeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| bool rgb_; | |||||
| }; | |||||
| class HwcToChwOperation : public TensorOperation { | |||||
| public: | |||||
| ~HwcToChwOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class MixUpBatchOperation : public TensorOperation { | |||||
| public: | |||||
| explicit MixUpBatchOperation(float alpha = 1); | |||||
| ~MixUpBatchOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float alpha_; | |||||
| }; | |||||
| class NormalizeOperation : public TensorOperation { | |||||
| public: | |||||
| NormalizeOperation(std::vector<float> mean, std::vector<float> std); | |||||
| ~NormalizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> mean_; | |||||
| std::vector<float> std_; | |||||
| }; | |||||
| class OneHotOperation : public TensorOperation { | class OneHotOperation : public TensorOperation { | ||||
| public: | public: | ||||
| explicit OneHotOperation(int32_t num_classes_); | explicit OneHotOperation(int32_t num_classes_); | ||||
| @@ -424,254 +70,8 @@ class OneHotOperation : public TensorOperation { | |||||
| private: | private: | ||||
| float num_classes_; | float num_classes_; | ||||
| }; | }; | ||||
| class PadOperation : public TensorOperation { | |||||
| public: | |||||
| PadOperation(std::vector<int32_t> padding, std::vector<uint8_t> fill_value = {0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| ~PadOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> padding_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| BorderType padding_mode_; | |||||
| }; | |||||
| class RandomAffineOperation : public TensorOperation { | |||||
| public: | |||||
| RandomAffineOperation(const std::vector<float_t> °rees, const std::vector<float_t> &translate_range = {0.0, 0.0}, | |||||
| const std::vector<float_t> &scale_range = {1.0, 1.0}, | |||||
| const std::vector<float_t> &shear_ranges = {0.0, 0.0, 0.0, 0.0}, | |||||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||||
| ~RandomAffineOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float_t> degrees_; // min_degree, max_degree | |||||
| std::vector<float_t> translate_range_; // maximum x translation percentage, maximum y translation percentage | |||||
| std::vector<float_t> scale_range_; // min_scale, max_scale | |||||
| std::vector<float_t> shear_ranges_; // min_x_shear, max_x_shear, min_y_shear, max_y_shear | |||||
| InterpolationMode interpolation_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| }; | |||||
| class RandomColorOperation : public TensorOperation { | |||||
| public: | |||||
| RandomColorOperation(float t_lb, float t_ub); | |||||
| ~RandomColorOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float t_lb_; | |||||
| float t_ub_; | |||||
| }; | |||||
| class RandomColorAdjustOperation : public TensorOperation { | |||||
| public: | |||||
| RandomColorAdjustOperation(std::vector<float> brightness = {1.0, 1.0}, std::vector<float> contrast = {1.0, 1.0}, | |||||
| std::vector<float> saturation = {1.0, 1.0}, std::vector<float> hue = {0.0, 0.0}); | |||||
| ~RandomColorAdjustOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> brightness_; | |||||
| std::vector<float> contrast_; | |||||
| std::vector<float> saturation_; | |||||
| std::vector<float> hue_; | |||||
| }; | |||||
| class RandomCropOperation : public TensorOperation { | |||||
| public: | |||||
| RandomCropOperation(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| ~RandomCropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| std::vector<int32_t> padding_; | |||||
| bool pad_if_needed_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| BorderType padding_mode_; | |||||
| }; | |||||
| class RandomHorizontalFlipOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomHorizontalFlipOperation(float probability = 0.5); | |||||
| ~RandomHorizontalFlipOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float probability_; | |||||
| }; | |||||
| class RandomPosterizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomPosterizeOperation(const std::vector<uint8_t> &bit_range = {4, 8}); | |||||
| ~RandomPosterizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<uint8_t> bit_range_; | |||||
| }; | |||||
| class RandomRotationOperation : public TensorOperation { | |||||
| public: | |||||
| RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, bool expand, | |||||
| std::vector<float> center, std::vector<uint8_t> fill_value); | |||||
| ~RandomRotationOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> degrees_; | |||||
| InterpolationMode interpolation_mode_; | |||||
| std::vector<float> center_; | |||||
| bool expand_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| }; | |||||
| class RandomSharpnessOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomSharpnessOperation(std::vector<float> degrees = {0.1, 1.9}); | |||||
| ~RandomSharpnessOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> degrees_; | |||||
| }; | |||||
| class RandomVerticalFlipOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomVerticalFlipOperation(float probability = 0.5); | |||||
| ~RandomVerticalFlipOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float probability_; | |||||
| }; | |||||
| class ResizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit ResizeOperation(std::vector<int32_t> size, | |||||
| InterpolationMode interpolation_mode = InterpolationMode::kLinear); | |||||
| ~ResizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| InterpolationMode interpolation_; | |||||
| }; | |||||
| class RgbaToBgrOperation : public TensorOperation { | |||||
| public: | |||||
| RgbaToBgrOperation(); | |||||
| ~RgbaToBgrOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class RgbaToRgbOperation : public TensorOperation { | |||||
| public: | |||||
| RgbaToRgbOperation(); | |||||
| ~RgbaToRgbOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class UniformAugOperation : public TensorOperation { | |||||
| public: | |||||
| explicit UniformAugOperation(std::vector<std::shared_ptr<TensorOperation>> transforms, int32_t num_ops = 2); | |||||
| ~UniformAugOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<std::shared_ptr<TensorOperation>> transforms_; | |||||
| int32_t num_ops_; | |||||
| }; | |||||
| class SwapRedBlueOperation : public TensorOperation { | |||||
| public: | |||||
| SwapRedBlueOperation(); | |||||
| ~SwapRedBlueOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class RandomSolarizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomSolarizeOperation(std::vector<uint8_t> threshold); | |||||
| ~RandomSolarizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<uint8_t> threshold_; | |||||
| }; | |||||
| } // namespace vision | |||||
| } // namespace transforms | |||||
| } // namespace api | } // namespace api | ||||
| } // namespace dataset | } // namespace dataset | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_API_TRANSFORMS_H_ | |||||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_TRANSFORMS_H_ | |||||
| @@ -0,0 +1,639 @@ | |||||
| /** | |||||
| * Copyright 2020 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_VISION_H_ | |||||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_VISION_H_ | |||||
| #include <vector> | |||||
| #include <memory> | |||||
| #include "minddata/dataset/core/constants.h" | |||||
| #include "minddata/dataset/include/transforms.h" | |||||
| namespace mindspore { | |||||
| namespace dataset { | |||||
| namespace api { | |||||
| // Transform operations for performing computer vision. | |||||
| namespace vision { | |||||
| // Transform Op classes (in alphabetical order) | |||||
| class CenterCropOperation; | |||||
| class CropOperation; | |||||
| class CutMixBatchOperation; | |||||
| class CutOutOperation; | |||||
| class DecodeOperation; | |||||
| class HwcToChwOperation; | |||||
| class MixUpBatchOperation; | |||||
| class NormalizeOperation; | |||||
| class PadOperation; | |||||
| class RandomAffineOperation; | |||||
| class RandomColorOperation; | |||||
| class RandomColorAdjustOperation; | |||||
| class RandomCropOperation; | |||||
| class RandomHorizontalFlipOperation; | |||||
| class RandomPosterizeOperation; | |||||
| class RandomRotationOperation; | |||||
| class RandomSharpnessOperation; | |||||
| class RandomSolarizeOperation; | |||||
| class RandomVerticalFlipOperation; | |||||
| class ResizeOperation; | |||||
| class RgbaToBgrOperation; | |||||
| class RgbaToRgbOperation; | |||||
| class SwapRedBlueOperation; | |||||
| class UniformAugOperation; | |||||
| /// \brief Function to create a CenterCrop TensorOperation. | |||||
| /// \notes Crops the input image at the center to the given size. | |||||
| /// \param[in] size - a vector representing the output size of the cropped image. | |||||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||||
| /// If size has 2 values, it should be (height, width). | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<CenterCropOperation> CenterCrop(std::vector<int32_t> size); | |||||
| /// \brief Function to create a Crop TensorOp | |||||
| /// \notes Crop an image based on location and crop size | |||||
| /// \param[in] coordinates Starting location of crop. Must be a vector of two values, in the form of {x_coor, y_coor} | |||||
| /// \param[in] size Size of the cropped area. Must be a vector of two values, in the form of {height, width} | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CropOperation> Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size); | |||||
| /// \brief Function to apply CutMix on a batch of images | |||||
| /// \notes Masks a random section of each image with the corresponding part of another randomly selected image in | |||||
| /// that batch | |||||
| /// \param[in] image_batch_format The format of the batch | |||||
| /// \param[in] alpha The hyperparameter of beta distribution (default = 1.0) | |||||
| /// \param[in] prob The probability by which CutMix is applied to each image (default = 1.0) | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CutMixBatchOperation> CutMixBatch(ImageBatchFormat image_batch_format, float alpha = 1.0, | |||||
| float prob = 1.0); | |||||
| /// \brief Function to create a CutOut TensorOp | |||||
| /// \notes Randomly cut (mask) out a given number of square patches from the input image | |||||
| /// \param[in] length Integer representing the side length of each square patch | |||||
| /// \param[in] num_patches Integer representing the number of patches to be cut out of an image | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<CutOutOperation> CutOut(int32_t length, int32_t num_patches = 1); | |||||
| /// \brief Function to create a Decode TensorOperation. | |||||
| /// \notes Decode the input image in RGB mode. | |||||
| /// \param[in] rgb - a boolean of whether to decode in RGB mode or not. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<DecodeOperation> Decode(bool rgb = true); | |||||
| /// \brief Function to create a HwcToChw TensorOperation. | |||||
| /// \notes Transpose the input image; shape (H, W, C) to shape (C, H, W). | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<HwcToChwOperation> HWC2CHW(); | |||||
| /// \brief Function to create a MixUpBatch TensorOperation. | |||||
| /// \notes Apply MixUp transformation on an input batch of images and labels. The labels must be in one-hot format and | |||||
| /// Batch must be called before calling this function. | |||||
| /// \param[in] alpha hyperparameter of beta distribution (default = 1.0) | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<MixUpBatchOperation> MixUpBatch(float alpha = 1); | |||||
| /// \brief Function to create a Normalize TensorOperation. | |||||
| /// \notes Normalize the input image with respect to mean and standard deviation. | |||||
| /// \param[in] mean A vector of mean values for each channel, w.r.t channel order. | |||||
| /// \param[in] std A vector of standard deviations for each channel, w.r.t. channel order. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<NormalizeOperation> Normalize(std::vector<float> mean, std::vector<float> std); | |||||
| /// \brief Function to create a Pad TensorOp | |||||
| /// \notes Pads the image according to padding parameters | |||||
| /// \param[in] padding A vector representing the number of pixels to pad the image | |||||
| /// If vector has one value, it pads all sides of the image with that value | |||||
| /// If vector has two values, it pads left and right with the first and | |||||
| /// top and bottom with the second value | |||||
| /// If vector has four values, it pads left, top, right, and bottom with | |||||
| /// those values respectively | |||||
| /// \param[in] fill_value A vector representing the pixel intensity of the borders if the padding_mode is | |||||
| /// BorderType.kConstant. If 3 values are provided, | |||||
| /// it is used to fill R, G, B channels respectively | |||||
| /// \param[in] padding_mode The method of padding (default=BorderType.kConstant) | |||||
| /// Can be any of | |||||
| /// [BorderType.kConstant, BorderType.kEdge, BorderType.kReflect, BorderType.kSymmetric] | |||||
| /// - BorderType.kConstant, means it fills the border with constant values | |||||
| /// - BorderType.kEdge, means it pads with the last value on the edge | |||||
| /// - BorderType.kReflect, means it reflects the values on the edge omitting the last value of edge | |||||
| /// - BorderType.kSymmetric, means it reflects the values on the edge repeating the last value of edge | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<PadOperation> Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value = {0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| /// \brief Function to create a RandomAffine TensorOperation. | |||||
| /// \notes Applies a Random Affine transformation on input image in RGB or Greyscale mode. | |||||
| /// \param[in] degrees A float vector size 2, representing the starting and ending degree | |||||
| /// \param[in] translate_range A float vector size 2 or 4, representing percentages of translation on x and y axes. | |||||
| /// if size is 2, (min_dx, max_dx, 0, 0) | |||||
| /// if size is 4, (min_dx, max_dx, min_dy, max_dy) | |||||
| /// all values are in range [-1, 1] | |||||
| /// \param[in] scale_range A float vector size 2, representing the starting and ending scales in the range. | |||||
| /// \param[in] shear_ranges A float vector size 2 or 4, representing the starting and ending shear degrees vertically | |||||
| /// and horizontally. | |||||
| /// if size is 2, (min_shear_x, max_shear_x, 0, 0) | |||||
| /// if size is 4, (min_shear_x, max_shear_x, min_shear_y, max_shear_y) | |||||
| /// \param[in] interpolation An enum for the mode of interpolation | |||||
| /// \param[in] fill_value A uint8_t vector size 3, representing the pixel intensity of the borders, it is used to | |||||
| /// fill R, G, B channels respectively. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomAffineOperation> RandomAffine( | |||||
| const std::vector<float_t> °rees, const std::vector<float_t> &translate_range = {0.0, 0.0, 0.0, 0.0}, | |||||
| const std::vector<float_t> &scale_range = {1.0, 1.0}, const std::vector<float_t> &shear_ranges = {0.0, 0.0, 0.0, 0.0}, | |||||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||||
| /// \brief Blends an image with its grayscale version with random weights | |||||
| /// t and 1 - t generated from a given range. If the range is trivial | |||||
| /// then the weights are determinate and t equals the bound of the interval | |||||
| /// \param[in] t_lb lower bound on the range of random weights | |||||
| /// \param[in] t_lb upper bound on the range of random weights | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomColorOperation> RandomColor(float t_lb, float t_ub); | |||||
| /// \brief Randomly adjust the brightness, contrast, saturation, and hue of the input image | |||||
| /// \param[in] brightness Brightness adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] contrast Contrast adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] saturation Saturation adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it needs to be in the form of [min, max]. Default value is {1, 1} | |||||
| /// \param[in] hue Brightness adjustment factor. Must be a vector of one or two values | |||||
| /// if it's a vector of two values it must be in the form of [min, max] where -0.5 <= min <= max <= 0.5 | |||||
| /// Default value is {0, 0} | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomColorAdjustOperation> RandomColorAdjust(std::vector<float> brightness = {1.0, 1.0}, | |||||
| std::vector<float> contrast = {1.0, 1.0}, | |||||
| std::vector<float> saturation = {1.0, 1.0}, | |||||
| std::vector<float> hue = {0.0, 0.0}); | |||||
| /// \brief Function to create a RandomCrop TensorOperation. | |||||
| /// \notes Crop the input image at a random location. | |||||
| /// \param[in] size - a vector representing the output size of the cropped image. | |||||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||||
| /// If size has 2 values, it should be (height, width). | |||||
| /// \param[in] padding - a vector with the value of pixels to pad the image. If 4 values are provided, | |||||
| /// it pads the left, top, right and bottom respectively. | |||||
| /// \param[in] pad_if_needed - a boolean whether to pad the image if either side is smaller than | |||||
| /// the given output size. | |||||
| /// \param[in] fill_value - a vector representing the pixel intensity of the borders, it is used to | |||||
| /// fill R, G, B channels respectively. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomCropOperation> RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| /// \brief Function to create a RandomHorizontalFlip TensorOperation. | |||||
| /// \notes Tensor operation to perform random horizontal flip. | |||||
| /// \param[in] prob - float representing the probability of flip. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomHorizontalFlipOperation> RandomHorizontalFlip(float prob = 0.5); | |||||
| /// \brief Function to create a RandomPosterize TensorOperation. | |||||
| /// \notes Tensor operation to perform random posterize. | |||||
| /// \param[in] bit_range - uint8_t vector representing the minimum and maximum bit in range. (Default={4, 8}) | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomPosterizeOperation> RandomPosterize(const std::vector<uint8_t> &bit_range = {4, 8}); | |||||
| /// \brief Function to create a RandomRotation TensorOp | |||||
| /// \notes Rotates the image according to parameters | |||||
| /// \param[in] degrees A float vector size 2, representing the starting and ending degree | |||||
| /// \param[in] resample An enum for the mode of interpolation | |||||
| /// \param[in] expand A boolean representing whether the image is expanded after rotation | |||||
| /// \param[in] center A float vector size 2, representing the x and y center of rotation. | |||||
| /// \param[in] fill_value A uint8_t vector size 3, representing the rgb value of the fill color | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<RandomRotationOperation> RandomRotation( | |||||
| std::vector<float> degrees, InterpolationMode resample = InterpolationMode::kNearestNeighbour, bool expand = false, | |||||
| std::vector<float> center = {-1, -1}, std::vector<uint8_t> fill_value = {0, 0, 0}); | |||||
| /// \brief Function to create a RandomSharpness TensorOperation. | |||||
| /// \notes Tensor operation to perform random sharpness. | |||||
| /// \param[in] start_degree - float representing the start of the range to uniformly sample the factor from it. | |||||
| /// \param[in] end_degree - float representing the end of the range. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomSharpnessOperation> RandomSharpness(std::vector<float> degrees = {0.1, 1.9}); | |||||
| /// \brief Function to create a RandomSolarize TensorOperation. | |||||
| /// \notes Invert pixels within specified range. If min=max, then it inverts all pixel above that threshold | |||||
| /// \param[in] threshold - a vector with two elements specifying the pixel range to invert. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomSolarizeOperation> RandomSolarize(std::vector<uint8_t> threshold = {0, 255}); | |||||
| /// \brief Function to create a RandomVerticalFlip TensorOperation. | |||||
| /// \notes Tensor operation to perform random vertical flip. | |||||
| /// \param[in] prob - float representing the probability of flip. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RandomVerticalFlipOperation> RandomVerticalFlip(float prob = 0.5); | |||||
| /// \brief Function to create a Resize TensorOperation. | |||||
| /// \notes Resize the input image to the given size. | |||||
| /// \param[in] size - a vector representing the output size of the resized image. | |||||
| /// If size is a single value, the image will be resized to this value with | |||||
| /// the same image aspect ratio. If size has 2 values, it should be (height, width). | |||||
| /// \param[in] interpolation An enum for the mode of interpolation | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<ResizeOperation> Resize(std::vector<int32_t> size, | |||||
| InterpolationMode interpolation = InterpolationMode::kLinear); | |||||
| /// \brief Function to create a RgbaToBgr TensorOperation. | |||||
| /// \notes Changes the input 4 channel RGBA tensor to 3 channel BGR. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RgbaToBgrOperation> RGBA2BGR(); | |||||
| /// \brief Function to create a RgbaToRgb TensorOperation. | |||||
| /// \notes Changes the input 4 channel RGBA tensor to 3 channel RGB. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<RgbaToRgbOperation> RGBA2RGB(); | |||||
| /// \brief Function to create a SwapRedBlue TensorOp | |||||
| /// \notes Swaps the red and blue channels in image | |||||
| /// \return Shared pointer to the current TensorOp | |||||
| std::shared_ptr<SwapRedBlueOperation> SwapRedBlue(); | |||||
| /// \brief Function to create a UniformAugment TensorOperation. | |||||
| /// \notes Tensor operation to perform randomly selected augmentation. | |||||
| /// \param[in] transforms - a vector of TensorOperation transforms. | |||||
| /// \param[in] num_ops - integer representing the number of OPs to be selected and applied. | |||||
| /// \return Shared pointer to the current TensorOperation. | |||||
| std::shared_ptr<UniformAugOperation> UniformAugment(std::vector<std::shared_ptr<TensorOperation>> transforms, | |||||
| int32_t num_ops = 2); | |||||
| /* ####################################### Derived TensorOperation classes ################################# */ | |||||
| class CenterCropOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CenterCropOperation(std::vector<int32_t> size); | |||||
| ~CenterCropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| }; | |||||
| class CropOperation : public TensorOperation { | |||||
| public: | |||||
| CropOperation(std::vector<int32_t> coordinates, std::vector<int32_t> size); | |||||
| ~CropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> coordinates_; | |||||
| std::vector<int32_t> size_; | |||||
| }; | |||||
| class CutMixBatchOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CutMixBatchOperation(ImageBatchFormat image_batch_format, float alpha = 1.0, float prob = 1.0); | |||||
| ~CutMixBatchOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float alpha_; | |||||
| float prob_; | |||||
| ImageBatchFormat image_batch_format_; | |||||
| }; | |||||
| class CutOutOperation : public TensorOperation { | |||||
| public: | |||||
| explicit CutOutOperation(int32_t length, int32_t num_patches = 1); | |||||
| ~CutOutOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| int32_t length_; | |||||
| int32_t num_patches_; | |||||
| ImageBatchFormat image_batch_format_; | |||||
| }; | |||||
| class DecodeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit DecodeOperation(bool rgb = true); | |||||
| ~DecodeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| bool rgb_; | |||||
| }; | |||||
| class HwcToChwOperation : public TensorOperation { | |||||
| public: | |||||
| ~HwcToChwOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class MixUpBatchOperation : public TensorOperation { | |||||
| public: | |||||
| explicit MixUpBatchOperation(float alpha = 1); | |||||
| ~MixUpBatchOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float alpha_; | |||||
| }; | |||||
| class NormalizeOperation : public TensorOperation { | |||||
| public: | |||||
| NormalizeOperation(std::vector<float> mean, std::vector<float> std); | |||||
| ~NormalizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> mean_; | |||||
| std::vector<float> std_; | |||||
| }; | |||||
| class PadOperation : public TensorOperation { | |||||
| public: | |||||
| PadOperation(std::vector<int32_t> padding, std::vector<uint8_t> fill_value = {0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| ~PadOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> padding_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| BorderType padding_mode_; | |||||
| }; | |||||
| class RandomAffineOperation : public TensorOperation { | |||||
| public: | |||||
| RandomAffineOperation(const std::vector<float_t> °rees, const std::vector<float_t> &translate_range = {0.0, 0.0}, | |||||
| const std::vector<float_t> &scale_range = {1.0, 1.0}, | |||||
| const std::vector<float_t> &shear_ranges = {0.0, 0.0, 0.0, 0.0}, | |||||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||||
| ~RandomAffineOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float_t> degrees_; // min_degree, max_degree | |||||
| std::vector<float_t> translate_range_; // maximum x translation percentage, maximum y translation percentage | |||||
| std::vector<float_t> scale_range_; // min_scale, max_scale | |||||
| std::vector<float_t> shear_ranges_; // min_x_shear, max_x_shear, min_y_shear, max_y_shear | |||||
| InterpolationMode interpolation_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| }; | |||||
| class RandomColorOperation : public TensorOperation { | |||||
| public: | |||||
| RandomColorOperation(float t_lb, float t_ub); | |||||
| ~RandomColorOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float t_lb_; | |||||
| float t_ub_; | |||||
| }; | |||||
| class RandomColorAdjustOperation : public TensorOperation { | |||||
| public: | |||||
| RandomColorAdjustOperation(std::vector<float> brightness = {1.0, 1.0}, std::vector<float> contrast = {1.0, 1.0}, | |||||
| std::vector<float> saturation = {1.0, 1.0}, std::vector<float> hue = {0.0, 0.0}); | |||||
| ~RandomColorAdjustOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> brightness_; | |||||
| std::vector<float> contrast_; | |||||
| std::vector<float> saturation_; | |||||
| std::vector<float> hue_; | |||||
| }; | |||||
| class RandomCropOperation : public TensorOperation { | |||||
| public: | |||||
| RandomCropOperation(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||||
| BorderType padding_mode = BorderType::kConstant); | |||||
| ~RandomCropOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| std::vector<int32_t> padding_; | |||||
| bool pad_if_needed_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| BorderType padding_mode_; | |||||
| }; | |||||
| class RandomHorizontalFlipOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomHorizontalFlipOperation(float probability = 0.5); | |||||
| ~RandomHorizontalFlipOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float probability_; | |||||
| }; | |||||
| class RandomPosterizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomPosterizeOperation(const std::vector<uint8_t> &bit_range = {4, 8}); | |||||
| ~RandomPosterizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<uint8_t> bit_range_; | |||||
| }; | |||||
| class RandomRotationOperation : public TensorOperation { | |||||
| public: | |||||
| RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, bool expand, | |||||
| std::vector<float> center, std::vector<uint8_t> fill_value); | |||||
| ~RandomRotationOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> degrees_; | |||||
| InterpolationMode interpolation_mode_; | |||||
| std::vector<float> center_; | |||||
| bool expand_; | |||||
| std::vector<uint8_t> fill_value_; | |||||
| }; | |||||
| class RandomSharpnessOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomSharpnessOperation(std::vector<float> degrees = {0.1, 1.9}); | |||||
| ~RandomSharpnessOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<float> degrees_; | |||||
| }; | |||||
| class RandomSolarizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomSolarizeOperation(std::vector<uint8_t> threshold); | |||||
| ~RandomSolarizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<uint8_t> threshold_; | |||||
| }; | |||||
| class RandomVerticalFlipOperation : public TensorOperation { | |||||
| public: | |||||
| explicit RandomVerticalFlipOperation(float probability = 0.5); | |||||
| ~RandomVerticalFlipOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| float probability_; | |||||
| }; | |||||
| class ResizeOperation : public TensorOperation { | |||||
| public: | |||||
| explicit ResizeOperation(std::vector<int32_t> size, | |||||
| InterpolationMode interpolation_mode = InterpolationMode::kLinear); | |||||
| ~ResizeOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<int32_t> size_; | |||||
| InterpolationMode interpolation_; | |||||
| }; | |||||
| class RgbaToBgrOperation : public TensorOperation { | |||||
| public: | |||||
| RgbaToBgrOperation(); | |||||
| ~RgbaToBgrOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class RgbaToRgbOperation : public TensorOperation { | |||||
| public: | |||||
| RgbaToRgbOperation(); | |||||
| ~RgbaToRgbOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class SwapRedBlueOperation : public TensorOperation { | |||||
| public: | |||||
| SwapRedBlueOperation(); | |||||
| ~SwapRedBlueOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| }; | |||||
| class UniformAugOperation : public TensorOperation { | |||||
| public: | |||||
| explicit UniformAugOperation(std::vector<std::shared_ptr<TensorOperation>> transforms, int32_t num_ops = 2); | |||||
| ~UniformAugOperation() = default; | |||||
| std::shared_ptr<TensorOp> Build() override; | |||||
| bool ValidateParams() override; | |||||
| private: | |||||
| std::vector<std::shared_ptr<TensorOperation>> transforms_; | |||||
| int32_t num_ops_; | |||||
| }; | |||||
| } // namespace vision | |||||
| } // namespace api | |||||
| } // namespace dataset | |||||
| } // namespace mindspore | |||||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_VISION_H_ | |||||
| @@ -102,6 +102,7 @@ SET(DE_UT_SRCS | |||||
| build_vocab_test.cc | build_vocab_test.cc | ||||
| c_api_samplers_test.cc | c_api_samplers_test.cc | ||||
| c_api_transforms_test.cc | c_api_transforms_test.cc | ||||
| c_api_vision_test.cc | |||||
| c_api_dataset_ops_test.cc | c_api_dataset_ops_test.cc | ||||
| c_api_dataset_album_test.cc | c_api_dataset_album_test.cc | ||||
| c_api_dataset_cifar_test.cc | c_api_dataset_cifar_test.cc | ||||
| @@ -124,8 +125,8 @@ SET(DE_UT_SRCS | |||||
| swap_red_blue_test.cc | swap_red_blue_test.cc | ||||
| distributed_sampler_test.cc | distributed_sampler_test.cc | ||||
| data_helper_test.cc | data_helper_test.cc | ||||
| image_process_test.cc | |||||
| slice_op_test.cc | |||||
| image_process_test.cc | |||||
| slice_op_test.cc | |||||
| ) | ) | ||||
| if (ENABLE_PYTHON) | if (ENABLE_PYTHON) | ||||
| @@ -16,7 +16,7 @@ | |||||
| #include "common/common.h" | #include "common/common.h" | ||||
| #include "minddata/dataset/core/tensor_row.h" | #include "minddata/dataset/core/tensor_row.h" | ||||
| #include "minddata/dataset/include/datasets.h" | #include "minddata/dataset/include/datasets.h" | ||||
| #include "minddata/dataset/include/transforms.h" | |||||
| #include "minddata/dataset/include/vision.h" | |||||
| using namespace mindspore::dataset::api; | using namespace mindspore::dataset::api; | ||||
| using mindspore::dataset::Tensor; | using mindspore::dataset::Tensor; | ||||
| @@ -15,7 +15,7 @@ | |||||
| */ | */ | ||||
| #include "common/common.h" | #include "common/common.h" | ||||
| #include "minddata/dataset/include/datasets.h" | #include "minddata/dataset/include/datasets.h" | ||||
| #include "minddata/dataset/include/transforms.h" | |||||
| #include "minddata/dataset/include/vision.h" | |||||
| #include "minddata/dataset/core/config_manager.h" | #include "minddata/dataset/core/config_manager.h" | ||||
| #include "minddata/dataset/core/global_context.h" | #include "minddata/dataset/core/global_context.h" | ||||
| @@ -55,3 +55,17 @@ TEST_F(MindDataTestCenterCropOp, TestOp2) { | |||||
| EXPECT_TRUE(s.IsError()); | EXPECT_TRUE(s.IsError()); | ||||
| ASSERT_TRUE(s.get_code() == StatusCode::kUnexpectedError); | ASSERT_TRUE(s.get_code() == StatusCode::kUnexpectedError); | ||||
| } | } | ||||
| TEST_F(MindDataTestCenterCropOp, TestOp3) { | |||||
| MS_LOG(INFO) << "Doing MindDataTestCenterCropOp::TestOp3. Test single integer input for square crop."; | |||||
| std::shared_ptr<Tensor> output_tensor; | |||||
| int side = 128; | |||||
| std::unique_ptr<CenterCropOp> op(new CenterCropOp(side)); | |||||
| EXPECT_TRUE(op->OneToOne()); | |||||
| Status s = op->Compute(input_tensor_, &output_tensor); | |||||
| EXPECT_TRUE(s.IsOk()); | |||||
| // Confirm both height and width are of size <side>. | |||||
| EXPECT_EQ(side, output_tensor->shape()[0]); | |||||
| EXPECT_EQ(side, output_tensor->shape()[1]); | |||||
| std::shared_ptr<CVTensor> p = CVTensor::AsCVTensor(output_tensor); | |||||
| } | |||||