Added input check

pull/6094/head
eric 4 years ago
parent 600704ddde
commit cd5af9472e

@ -321,6 +321,16 @@ std::shared_ptr<UniformAugOperation> UniformAugment(std::vector<std::shared_ptr<
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
@ -331,6 +341,13 @@ bool CenterCropOperation::ValidateParams() {
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 || size_[i] == INT_MAX) {
MS_LOG(ERROR) << "Crop: invalid size, size must be greater than zero, got: " << size_[i];
return false;
}
}
return true;
}
@ -353,14 +370,22 @@ CropOperation::CropOperation(std::vector<int32_t> coordinates, std::vector<int32
bool CropOperation::ValidateParams() {
// Do some input validation.
if (coordinates_.empty() || coordinates_.size() > 2) {
MS_LOG(ERROR) << "Crop: coordinates must be a vector of one or two values";
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 || size_[i] == INT_MAX) {
MS_LOG(ERROR) << "Crop: invalid size, size must be greater than zero, got: " << size_[i];
return false;
}
}
return true;
}
@ -452,12 +477,24 @@ bool NormalizeOperation::ValidateParams() {
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 || mean_[i] > 255.0f || CmpFloat(std_[i], 0.0f)) {
MS_LOG(ERROR) << "Normalize: std vector has incorrect value: " << std_[i];
return false;
}
}
return true;
}
@ -886,6 +923,9 @@ bool ResizeOperation::ValidateParams() {
MS_LOG(ERROR) << "Resize: size vector has incorrect size: " << size_.size();
return false;
}
if (!CheckVectorPositive(size_)) {
return false;
}
return true;
}

@ -1262,3 +1262,53 @@ TEST_F(MindDataTestPipeline, TestRandomSolarizeFail) {
random_solarize = mindspore::dataset::api::vision::RandomSolarize(threshold);
EXPECT_EQ(random_solarize, nullptr);
}
TEST_F(MindDataTestPipeline, TestResizeFail) {
MS_LOG(INFO) << "Doing MindDataTestPipeline-TestResize with invalid params.";
// negative resize value
std::shared_ptr<TensorOperation> resize = mindspore::dataset::api::vision::Resize({30, -30});
EXPECT_EQ(resize, nullptr);
// zero resize value
resize = mindspore::dataset::api::vision::Resize({0, 30});
EXPECT_EQ(resize, nullptr);
}
TEST_F(MindDataTestPipeline, TestCropFail) {
MS_LOG(INFO) << "Doing MindDataTestPipeline-TestCrop with invalid params.";
// wrong width
std::shared_ptr<TensorOperation> crop = mindspore::dataset::api::vision::Crop({0, 0}, {32, -32});
EXPECT_EQ(crop, nullptr);
// wrong height
crop = mindspore::dataset::api::vision::Crop({0, 0}, {-32, -32});
EXPECT_EQ(crop, nullptr);
// zero height
crop = mindspore::dataset::api::vision::Crop({0, 0}, {0, 32});
EXPECT_EQ(crop, nullptr);
}
TEST_F(MindDataTestPipeline, TestCenterCropFail) {
MS_LOG(INFO) << "Doing MindDataTestPipeline-TestCenterCrop with invalid params.";
// center crop height value negative
std::shared_ptr<TensorOperation> center_crop = mindspore::dataset::api::vision::CenterCrop({-32, 32});
EXPECT_EQ(center_crop, nullptr);
// center crop width value negative
center_crop = mindspore::dataset::api::vision::CenterCrop({32, -32});
EXPECT_EQ(center_crop, nullptr);
// 0 value would result in nullptr
center_crop = mindspore::dataset::api::vision::CenterCrop({0, 32});
EXPECT_EQ(center_crop, nullptr);
}
TEST_F(MindDataTestPipeline, TestNormalizeFail) {
MS_LOG(INFO) << "Doing MindDataTestPipeline-TestNormalize with invalid params.";
// mean value 0.0
std::shared_ptr<TensorOperation> normalize = mindspore::dataset::api::vision::Normalize({0.0, 115.0, 100.0},
{70.0, 68.0, 71.0});
EXPECT_EQ(normalize, nullptr);
// std value at 0.0
normalize = mindspore::dataset::api::vision::Normalize({121.0, 115.0, 100.0}, {0.0, 68.0, 71.0});
EXPECT_EQ(normalize, nullptr);
// mean value 300.0 greater than 255.0
normalize = mindspore::dataset::api::vision::Normalize({300.0, 115.0, 100.0}, {70.0, 68.0, 71.0});
EXPECT_EQ(normalize, nullptr);
}

Loading…
Cancel
Save