1 /**
2 * Copyright 2019 Huawei Technologies Co., Ltd
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <memory>
18 #include <string>
19 #include <vector>
20 #include "cvop_common.h"
21 #include "minddata/dataset/include/dataset/constants.h"
22 #include "utils/ms_utils.h"
23 #include "minddata/dataset/core/cv_tensor.h"
24 #include "utils/log_adapter.h"
25 #include <fstream>
26 #include <opencv2/opencv.hpp>
27
28 namespace common = mindspore::common;
29
30 using namespace mindspore::dataset;
31 using mindspore::LogStream;
32 using mindspore::ExceptionType::NoExceptionType;
33 using mindspore::MsLogLevel::INFO;
34 using UT::CVOP::CVOpCommon;
35
CVOpCommon()36 CVOpCommon::CVOpCommon() {}
37
~CVOpCommon()38 CVOpCommon::~CVOpCommon() {}
39
SetUp()40 void CVOpCommon::SetUp() {
41 MS_LOG(INFO) << "starting test.";
42 filename_ = GetFilename();
43 GetInputImage(filename_);
44 }
45
GetFilename()46 std::string CVOpCommon::GetFilename() {
47 std::string de_home = "data/dataset";
48 std::string filename = de_home + "/apple.jpg";
49 MS_LOG(INFO) << "Reading " << common::SafeCStr(filename) << ".";
50 return filename;
51 }
52
GetInputImage(std::string filename)53 void CVOpCommon::GetInputImage(std::string filename) {
54 try {
55 Tensor::CreateFromFile(filename, &raw_input_tensor_);
56 raw_cv_image_ = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR);
57 std::shared_ptr<CVTensor> input_cv_tensor;
58 CVTensor::CreateFromMat(raw_cv_image_, 3, &input_cv_tensor);
59 input_tensor_ = std::dynamic_pointer_cast<Tensor>(input_cv_tensor);
60 SwapRedAndBlue(input_tensor_, &input_tensor_);
61 if (raw_cv_image_.data) {
62 MS_LOG(INFO) << "Reading was successful. Height:" << raw_cv_image_.rows << " Width: " << raw_cv_image_.cols
63 << " Channels:" << raw_cv_image_.channels() << ".";
64 }
65 } catch (...) {
66 MS_LOG(INFO) << "Error in GetInputImage.";
67 }
68 }
69
Save(const std::shared_ptr<Tensor> & tensor,std::string filename)70 void CVOpCommon::Save(const std::shared_ptr<Tensor> &tensor, std::string filename) {
71 std::shared_ptr<Tensor> output;
72 SwapRedAndBlue(tensor, &output);
73
74 cv::Mat output_image_CV = std::dynamic_pointer_cast<CVTensor>(output)->mat();
75 cv::imwrite(filename, output_image_CV);
76 }
77
GetJPGStr(const cv::Mat & image)78 std::string CVOpCommon::GetJPGStr(const cv::Mat &image) {
79 std::vector<unsigned char> buff_jpg;
80 cv::imencode(".jpg", image, buff_jpg);
81 return std::string(buff_jpg.begin(), buff_jpg.end());
82 }
83
CompareCVMat(const cv::Mat & actual,const cv::Mat & expect,OperatorType type)84 bool CVOpCommon::CompareCVMat(const cv::Mat &actual, const cv::Mat &expect, OperatorType type) {
85 if (actual.size() != expect.size() || actual.channels() != expect.channels() || actual.type() != expect.type()) {
86 return false;
87 }
88 std::string strJPGData_actual = GetJPGStr(actual);
89 std::string strJPGData_expect = GetJPGStr(expect);
90
91 bool success = strJPGData_actual.compare(strJPGData_expect) == 0;
92 if (type == kFlipHorizontal || type == kFlipVertical) {
93 std::string raw_filename = filename_;
94 raw_filename.replace(raw_filename.end() - 9, raw_filename.end(), "imagefolder/apple_expect_not_flip.jpg");
95 cv::Mat raw;
96 raw = cv::imread(raw_filename, cv::ImreadModes::IMREAD_COLOR);
97 std::string strJPGData_raw = GetJPGStr(raw);
98 success = success || strJPGData_actual.compare(strJPGData_raw) == 0;
99 } else if (type == kCrop) {
100 success = expect.rows == actual.rows && expect.cols == actual.cols && expect.channels(), actual.channels();
101 }
102 return success;
103 }
104
CheckImageShapeAndData(const std::shared_ptr<Tensor> & output_tensor,OperatorType type)105 void CVOpCommon::CheckImageShapeAndData(const std::shared_ptr<Tensor> &output_tensor, OperatorType type) {
106 std::string dir_path = filename_.substr(0, filename_.length() - 9);
107 std::string expect_image_path, actual_image_path;
108 switch (type) {
109 case kRescale:
110 expect_image_path = dir_path + "imagefolder/apple_expect_rescaled.jpg";
111 actual_image_path = dir_path + "imagefolder/apple_actual_rescaled.jpg";
112 break;
113 case kResizeBilinear:
114 expect_image_path = dir_path + "imagefolder/apple_expect_resize_bilinear.jpg";
115 actual_image_path = dir_path + "imagefolder/apple_actual_resize_bilinear.jpg";
116 break;
117 case kFlipHorizontal:
118 expect_image_path = dir_path + "imagefolder/apple_expect_flipped_horizontal.jpg";
119 actual_image_path = dir_path + "imagefolder/apple_actual_flipped_horizontal.jpg";
120 break;
121 case kFlipVertical:
122 expect_image_path = dir_path + "imagefolder/apple_expect_flipped_vertical.jpg";
123 actual_image_path = dir_path + "imagefolder/apple_actual_flipped_vertical.jpg";
124 break;
125 case kDecode:
126 expect_image_path = dir_path + "imagefolder/apple_expect_decoded.jpg";
127 actual_image_path = dir_path + "imagefolder/apple_actual_decoded.jpg";
128 break;
129 case kChangeMode:
130 expect_image_path = dir_path + "imagefolder/apple_expect_changemode.jpg";
131 actual_image_path = dir_path + "imagefolder/apple_actual_changemode.jpg";
132 break;
133 case kRandomAffine:
134 expect_image_path = dir_path + "imagefolder/apple_expect_randomaffine.jpg";
135 actual_image_path = dir_path + "imagefolder/apple_actual_randomaffine.jpg";
136 break;
137 case kAdjustGamma:
138 expect_image_path = dir_path + "imagefolder/apple_expect_adjustgamma.png";
139 actual_image_path = dir_path + "imagefolder/apple_actual_adjustgamma.png";
140 break;
141 case kAutoContrast:
142 expect_image_path = dir_path + "imagefolder/apple_expect_autocontrast.jpg";
143 actual_image_path = dir_path + "imagefolder/apple_actual_autocontrast.jpg";
144 break;
145 case kEqualize:
146 expect_image_path = dir_path + "imagefolder/apple_expect_equalize.jpg";
147 actual_image_path = dir_path + "imagefolder/apple_actual_equalize.jpg";
148 break;
149 case kRandomSolarize:
150 expect_image_path = dir_path + "imagefolder/apple_expect_random_solarize.jpg";
151 actual_image_path = dir_path + "imagefolder/apple_actual_random_solarize.jpg";
152 break;
153 case kInvert:
154 expect_image_path = dir_path + "imagefolder/apple_expect_invert.jpg";
155 actual_image_path = dir_path + "imagefolder/apple_actual_invert.jpg";
156 break;
157 case kRandomSharpness:
158 expect_image_path = dir_path + "imagefolder/apple_expect_random_sharpness.jpg";
159 actual_image_path = dir_path + "imagefolder/apple_actual_random_sharpness.jpg";
160 break;
161 case kRandomPosterize:
162 expect_image_path = dir_path + "imagefolder/apple_expect_random_posterize.jpg";
163 actual_image_path = dir_path + "imagefolder/apple_actual_random_posterize.jpg";
164 break;
165 default:
166 MS_LOG(INFO) << "Not pass verification! Operation type does not exists.";
167 EXPECT_EQ(0, 1);
168 }
169 cv::Mat expect_img = cv::imread(expect_image_path, cv::IMREAD_COLOR);
170 cv::Mat actual_img;
171 // Saving
172 MS_LOG(INFO) << "output_tensor.shape is " << output_tensor->shape();
173 Save(output_tensor, actual_image_path);
174 actual_img = cv::imread(actual_image_path, cv::IMREAD_COLOR);
175 if (actual_img.data) {
176 EXPECT_EQ(CompareCVMat(actual_img, expect_img, type), true);
177 } else {
178 MS_LOG(INFO) << "Not pass verification! Image data is null.";
179 EXPECT_EQ(0, 1);
180 }
181 }
182