1 /**
2 * Copyright 2020-2021 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 #include "common/common.h"
17 #include "minddata/dataset/include/dataset/datasets.h"
18 #include "minddata/dataset/include/dataset/transforms.h"
19 #include "minddata/dataset/include/dataset/vision.h"
20
21 using namespace mindspore::dataset;
22
23 class MindDataTestPipeline : public UT::DatasetOpTesting {
24 protected:
25 };
26
27 // Tests for vision C++ API RandomSelectSubpolicy TensorTransform Operations
28
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicySuccess1Shr)29 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicySuccess1Shr) {
30 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicySuccess1Shr.";
31
32 // Create an ImageFolder Dataset
33 std::string folder_path = datasets_root_path_ + "/testPK/data/";
34 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
35 EXPECT_NE(ds, nullptr);
36
37 // Create objects for the tensor ops
38 // Use shared pointers
39 // Valid case: TensorTransform is not null and probability is between (0,1)
40 std::shared_ptr<TensorTransform> invert_op(new vision::Invert());
41 std::shared_ptr<TensorTransform> equalize_op(new vision::Equalize());
42 std::shared_ptr<TensorTransform> resize_op(new vision::Resize({15, 15}));
43
44 // Prepare input parameters for RandomSelectSubpolicy op
45 auto invert_pair = std::make_pair(invert_op, 0.5);
46 auto equalize_pair = std::make_pair(equalize_op, 0.5);
47 auto resize_pair = std::make_pair(resize_op, 1);
48
49 // Create RandomSelectSubpolicy op
50 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy = {invert_pair, equalize_pair, resize_pair};
51 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
52
53 // Create a Map operation on ds
54 ds = ds->Map({random_select_subpolicy_op});
55 EXPECT_NE(ds, nullptr);
56
57 // Create an iterator over the result of the above dataset
58 // This will trigger the creation of the Execution Tree and launch it.
59 std::shared_ptr<Iterator> iter = ds->CreateIterator();
60 EXPECT_NE(iter, nullptr);
61
62 // Iterate the dataset and get each row
63 std::unordered_map<std::string, mindspore::MSTensor> row;
64 ASSERT_OK(iter->GetNextRow(&row));
65
66 uint64_t i = 0;
67 while (row.size() != 0) {
68 i++;
69 auto image = row["image"];
70 MS_LOG(INFO) << "Tensor image shape: " << image.Shape();
71 ASSERT_OK(iter->GetNextRow(&row));
72 }
73
74 EXPECT_EQ(i, 7);
75
76 // Manually terminate the pipeline
77 iter->Stop();
78 }
79
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicySuccess2Auto)80 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicySuccess2Auto) {
81 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicySuccess2Auto.";
82
83 // Create an ImageFolder Dataset
84 std::string folder_path = datasets_root_path_ + "/testPK/data/";
85 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
86 EXPECT_NE(ds, nullptr);
87
88 // Create objects for the tensor ops
89 // Use auto for raw pointers
90 // Note that with auto and new, we have to explicitly delete the allocated object as shown below.
91 // Valid case: TensorTransform is not null and probability is between (0,1)
92 auto invert_op(new vision::Invert());
93 auto equalize_op(new vision::Equalize());
94 auto resize_op(new vision::Resize({15, 15}));
95
96 // Prepare input parameters for RandomSelectSubpolicy op
97 auto invert_pair = std::make_pair(invert_op, 0.5);
98 auto equalize_pair = std::make_pair(equalize_op, 0.5);
99 auto resize_pair = std::make_pair(resize_op, 1);
100
101 std::vector<std::pair<TensorTransform *, double>> policy = {invert_pair, equalize_pair, resize_pair};
102
103 // Create RandomSelectSubpolicy op
104 auto random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
105
106 // Create a Map operation on ds
107 ds = ds->Map({random_select_subpolicy_op});
108 EXPECT_NE(ds, nullptr);
109
110 // Create an iterator over the result of the above dataset
111 // This will trigger the creation of the Execution Tree and launch it.
112 std::shared_ptr<Iterator> iter = ds->CreateIterator();
113 EXPECT_NE(iter, nullptr);
114
115 // Iterate the dataset and get each row
116 std::unordered_map<std::string, mindspore::MSTensor> row;
117 ASSERT_OK(iter->GetNextRow(&row));
118
119 uint64_t i = 0;
120 while (row.size() != 0) {
121 i++;
122 auto image = row["image"];
123 MS_LOG(INFO) << "Tensor image shape: " << image.Shape();
124 ASSERT_OK(iter->GetNextRow(&row));
125 }
126
127 EXPECT_EQ(i, 7);
128
129 // Manually terminate the pipeline
130 iter->Stop();
131
132 // Delete allocated objects with raw pointers
133 delete invert_op;
134 delete equalize_op;
135 delete resize_op;
136 delete random_select_subpolicy_op;
137 }
138
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicySuccess3Obj)139 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicySuccess3Obj) {
140 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicySuccess3Obj.";
141
142 // Create an ImageFolder Dataset
143 std::string folder_path = datasets_root_path_ + "/testPK/data/";
144 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
145 EXPECT_NE(ds, nullptr);
146
147 // Create objects for the tensor ops
148 // Use object references
149 // Valid case: TensorTransform is not null and probability is between (0,1)
150 vision::Invert invert_op = vision::Invert();
151 vision::Equalize equalize_op = vision::Equalize();
152 vision::Resize resize_op = vision::Resize({15, 15});
153
154 // Prepare input parameters for RandomSelectSubpolicy op
155 auto invert_pair = std::make_pair(std::ref(invert_op), 0.5);
156 auto equalize_pair = std::make_pair(std::ref(equalize_op), 0.5);
157 auto resize_pair = std::make_pair(std::ref(resize_op), 1);
158 std::vector<std::pair<std::reference_wrapper<TensorTransform>, double>> policy = {invert_pair, equalize_pair,
159 resize_pair};
160 // Create RandomSelectSubpolicy op
161 vision::RandomSelectSubpolicy random_select_subpolicy_op = vision::RandomSelectSubpolicy({policy});
162
163 // Create a Map operation on ds
164 ds = ds->Map({random_select_subpolicy_op});
165 EXPECT_NE(ds, nullptr);
166
167 // Create an iterator over the result of the above dataset
168 // This will trigger the creation of the Execution Tree and launch it.
169 std::shared_ptr<Iterator> iter = ds->CreateIterator();
170 EXPECT_NE(iter, nullptr);
171
172 // Iterate the dataset and get each row
173 std::unordered_map<std::string, mindspore::MSTensor> row;
174 ASSERT_OK(iter->GetNextRow(&row));
175
176 uint64_t i = 0;
177 while (row.size() != 0) {
178 i++;
179 auto image = row["image"];
180 MS_LOG(INFO) << "Tensor image shape: " << image.Shape();
181 ASSERT_OK(iter->GetNextRow(&row));
182 }
183
184 EXPECT_EQ(i, 7);
185
186 // Manually terminate the pipeline
187 iter->Stop();
188 }
189
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicySuccess4MultiPolicy)190 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicySuccess4MultiPolicy) {
191 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicySuccess1MultiPolicy.";
192
193 // Create an ImageFolder Dataset
194 std::string folder_path = datasets_root_path_ + "/testPK/data/";
195 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
196 EXPECT_NE(ds, nullptr);
197
198 // Create objects for the tensor ops
199 // Tensor transform ops have shared pointers
200 // Valid case: TensorTransform is not null and probability is between (0,1)
201 std::shared_ptr<TensorTransform> invert_op(new vision::Invert());
202 std::shared_ptr<TensorTransform> equalize_op(new vision::Equalize());
203 std::shared_ptr<TensorTransform> resize_op(new vision::Resize({15, 15}));
204
205 // Prepare input parameters for RandomSelectSubpolicy op
206 auto invert_pair = std::make_pair(invert_op, 0.75);
207 auto equalize_pair = std::make_pair(equalize_op, 0.25);
208 auto resize_pair = std::make_pair(resize_op, 0.5);
209
210 // Create RandomSelectSubpolicy op with 2 policies
211 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy1 = {resize_pair, invert_pair};
212 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy2 = {equalize_pair};
213 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy1, policy2}));
214
215 // Create a Map operation on ds
216 ds = ds->Map({random_select_subpolicy_op});
217 EXPECT_NE(ds, nullptr);
218
219 // Create an iterator over the result of the above dataset
220 // This will trigger the creation of the Execution Tree and launch it.
221 std::shared_ptr<Iterator> iter = ds->CreateIterator();
222 EXPECT_NE(iter, nullptr);
223
224 // Iterate the dataset and get each row
225 std::unordered_map<std::string, mindspore::MSTensor> row;
226 ASSERT_OK(iter->GetNextRow(&row));
227
228 uint64_t i = 0;
229 while (row.size() != 0) {
230 i++;
231 auto image = row["image"];
232 MS_LOG(INFO) << "Tensor image shape: " << image.Shape();
233 ASSERT_OK(iter->GetNextRow(&row));
234 }
235
236 EXPECT_EQ(i, 7);
237
238 // Manually terminate the pipeline
239 iter->Stop();
240 }
241
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicyFail1)242 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicyFail1) {
243 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicyFail1.";
244
245 // Create an ImageFolder Dataset
246 std::string folder_path = datasets_root_path_ + "/testPK/data/";
247 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
248 EXPECT_NE(ds, nullptr);
249
250 // Create objects for the tensor ops
251 std::shared_ptr<TensorTransform> invert_op(new vision::Invert());
252 std::shared_ptr<TensorTransform> equalize_op(new vision::Equalize());
253 std::shared_ptr<TensorTransform> resize_op(new vision::Resize({15, 15}));
254
255 // Prepare input parameters for RandomSelectSubpolicy op
256 // For RandomSelectSubpolicy : probability of transform must be between 0.0 and 1.0
257 // Equalize pair has invalid negative probability
258 auto invert_pair = std::make_pair(invert_op, 0.5);
259 auto equalize_pair = std::make_pair(equalize_op, -0.5);
260 auto resize_pair = std::make_pair(resize_op, 1);
261
262 // Create RandomSelectSubpolicy op
263 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy = {invert_pair, equalize_pair, resize_pair};
264 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
265
266 // Create a Map operation on ds
267 ds = ds->Map({random_select_subpolicy_op});
268 EXPECT_NE(ds, nullptr);
269
270 // Create an iterator over the result of the above dataset
271 std::shared_ptr<Iterator> iter = ds->CreateIterator();
272 // Expect failure: Invalid RandomSelectSubpolicy input
273 EXPECT_EQ(iter, nullptr);
274 }
275
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicyFail2)276 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicyFail2) {
277 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicyFail2.";
278
279 // Create an ImageFolder Dataset
280 std::string folder_path = datasets_root_path_ + "/testPK/data/";
281 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
282 EXPECT_NE(ds, nullptr);
283
284 // Create RandomSelectSubpolicy op with invalid empty subpolicy
285 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy = {};
286 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
287
288 // Create a Map operation on ds
289 ds = ds->Map({random_select_subpolicy_op});
290 EXPECT_NE(ds, nullptr);
291
292 // Create an iterator over the result of the above dataset
293 std::shared_ptr<Iterator> iter = ds->CreateIterator();
294 // Expect failure: Invalid RandomSelectSubpolicy input
295 EXPECT_EQ(iter, nullptr);
296 }
297
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicyFail3)298 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicyFail3) {
299 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicyFail3.";
300
301 // Create an ImageFolder Dataset
302 std::string folder_path = datasets_root_path_ + "/testPK/data/";
303 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
304 EXPECT_NE(ds, nullptr);
305
306 // Create objects for the tensor ops
307 std::shared_ptr<TensorTransform> invert_op(new vision::Invert());
308 std::shared_ptr<TensorTransform> equalize_op(new vision::Equalize());
309 std::shared_ptr<TensorTransform> resize_op(new vision::Resize({15, 15}));
310
311 // Prepare input parameters for RandomSelectSubpolicy op
312 auto invert_pair = std::make_pair(invert_op, 0.5);
313 auto equalize_pair = std::make_pair(equalize_op, 0.5);
314 auto resize_pair = std::make_pair(resize_op, 1);
315
316 // Prepare pair with nullptr op
317 auto dummy_pair = std::make_pair(nullptr, 0.25);
318
319 // Create RandomSelectSubpolicy op with invalid nullptr pair
320 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy = {invert_pair, dummy_pair, equalize_pair,
321 resize_pair};
322 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
323
324 // Create a Map operation on ds
325 ds = ds->Map({random_select_subpolicy_op});
326 EXPECT_NE(ds, nullptr);
327
328 // Create an iterator over the result of the above dataset
329 std::shared_ptr<Iterator> iter = ds->CreateIterator();
330 // Expect failure: Invalid RandomSelectSubpolicy input
331 EXPECT_EQ(iter, nullptr);
332 }
333
TEST_F(MindDataTestPipeline,TestRandomSelectSubpolicyFail4)334 TEST_F(MindDataTestPipeline, TestRandomSelectSubpolicyFail4) {
335 MS_LOG(INFO) << "Doing MindDataTestPipeline-TestRandomSelectSubpolicyFail4.";
336
337 // Create an ImageFolder Dataset
338 std::string folder_path = datasets_root_path_ + "/testPK/data/";
339 std::shared_ptr<Dataset> ds = ImageFolder(folder_path, true, std::make_shared<RandomSampler>(false, 7));
340 EXPECT_NE(ds, nullptr);
341
342 // Create objects for the tensor ops
343 // Create RandomVerticalFlip op with invalid negative input
344 std::shared_ptr<TensorTransform> vertflip_op(new vision::RandomVerticalFlip(-2.0));
345
346 // Prepare input parameters for RandomSelectSubpolicy op
347 auto vertflip_pair = std::make_pair(vertflip_op, 1);
348
349 // Create RandomSelectSubpolicy op with invalid transform op within a subpolicy
350 std::vector<std::pair<std::shared_ptr<TensorTransform>, double>> policy = {vertflip_pair};
351 std::shared_ptr<TensorTransform> random_select_subpolicy_op(new vision::RandomSelectSubpolicy({policy}));
352
353 // Create a Map operation on ds
354 ds = ds->Map({random_select_subpolicy_op});
355 EXPECT_NE(ds, nullptr);
356
357 // Create an iterator over the result of the above dataset
358 std::shared_ptr<Iterator> iter = ds->CreateIterator();
359 // Expect failure: Invalid RandomSelectSubpolicy input
360 EXPECT_EQ(iter, nullptr);
361 }
362