C++ API: Move vision ops to new vision files; create transforms namespace
This commit is contained in:
parent
c1b9efe8e6
commit
2aa26d245c
|
@ -28,4 +28,5 @@ add_library(cpp-API OBJECT
|
|||
transforms.cc
|
||||
samplers.cc
|
||||
text.cc
|
||||
vision.cc
|
||||
)
|
||||
|
|
|
@ -20,8 +20,13 @@
|
|||
namespace mindspore {
|
||||
namespace dataset {
|
||||
namespace api {
|
||||
|
||||
// Transform operations for 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,
|
||||
const DataType &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;
|
||||
}
|
||||
|
||||
/* ####################################### Validator Functions ############################################ */
|
||||
|
||||
/* ####################################### Derived TensorOperation classes ################################# */
|
||||
|
||||
// (In alphabetical order)
|
||||
|
||||
// LookupOperation
|
||||
LookupOperation::LookupOperation(const std::shared_ptr<Vocab> &vocab, const std::string &unknown_token,
|
||||
const DataType &data_type)
|
||||
|
|
|
@ -17,31 +17,8 @@
|
|||
#include "minddata/dataset/include/transforms.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/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 {
|
||||
|
@ -49,88 +26,11 @@ namespace api {
|
|||
|
||||
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.
|
||||
std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes) {
|
||||
|
@ -142,373 +42,11 @@ std::shared_ptr<OneHotOperation> OneHot(int32_t num_classes) {
|
|||
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 ################################# */
|
||||
|
||||
// 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(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_); }
|
||||
|
||||
// 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 dataset
|
||||
} // 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.
|
||||
*/
|
||||
|
||||
#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 <memory>
|
||||
|
@ -68,4 +68,4 @@ class LookupOperation : public TensorOperation {
|
|||
} // namespace api
|
||||
} // namespace dataset
|
||||
} // 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.
|
||||
*/
|
||||
|
||||
#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 <memory>
|
||||
|
@ -43,92 +43,11 @@ class TensorOperation : public std::enable_shared_from_this<TensorOperation> {
|
|||
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)
|
||||
class CenterCropOperation;
|
||||
class CropOperation;
|
||||
class CutMixBatchOperation;
|
||||
class CutOutOperation;
|
||||
class DecodeOperation;
|
||||
class HwcToChwOperation;
|
||||
class MixUpBatchOperation;
|
||||
class NormalizeOperation;
|
||||
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.
|
||||
/// \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.
|
||||
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 ################################# */
|
||||
|
||||
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 {
|
||||
public:
|
||||
explicit OneHotOperation(int32_t num_classes_);
|
||||
|
@ -424,254 +70,8 @@ class OneHotOperation : public TensorOperation {
|
|||
private:
|
||||
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 dataset
|
||||
} // 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
|
||||
c_api_samplers_test.cc
|
||||
c_api_transforms_test.cc
|
||||
c_api_vision_test.cc
|
||||
c_api_dataset_ops_test.cc
|
||||
c_api_dataset_album_test.cc
|
||||
c_api_dataset_cifar_test.cc
|
||||
|
@ -124,8 +125,8 @@ SET(DE_UT_SRCS
|
|||
swap_red_blue_test.cc
|
||||
distributed_sampler_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)
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include "common/common.h"
|
||||
#include "minddata/dataset/core/tensor_row.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 mindspore::dataset::Tensor;
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
*/
|
||||
#include "common/common.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/global_context.h"
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -55,3 +55,17 @@ TEST_F(MindDataTestCenterCropOp, TestOp2) {
|
|||
EXPECT_TRUE(s.IsError());
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue