• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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