You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

execute_test.cc 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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 "include/api/types.h"
  18. #include "minddata/dataset/core/de_tensor.h"
  19. #include "minddata/dataset/include/dataset/execute.h"
  20. #include "minddata/dataset/include/dataset/transforms.h"
  21. #include "minddata/dataset/include/dataset/vision.h"
  22. #include "minddata/dataset/include/dataset/text.h"
  23. #include "utils/log_adapter.h"
  24. using namespace mindspore::dataset;
  25. using mindspore::LogStream;
  26. using mindspore::ExceptionType::NoExceptionType;
  27. using mindspore::MsLogLevel::INFO;
  28. class MindDataTestExecute : public UT::DatasetOpTesting {
  29. protected:
  30. };
  31. TEST_F(MindDataTestExecute, TestComposeTransforms) {
  32. MS_LOG(INFO) << "Doing TestComposeTransforms.";
  33. // Read images
  34. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  35. // Transform params
  36. std::shared_ptr<TensorTransform> decode = std::make_shared<vision::Decode>();
  37. std::shared_ptr<TensorTransform> center_crop(new vision::CenterCrop({30}));
  38. std::shared_ptr<TensorTransform> rescale = std::make_shared<vision::Rescale>(1. / 3, 0.5);
  39. auto transform = Execute({decode, center_crop, rescale});
  40. Status rc = transform(image, &image);
  41. EXPECT_EQ(rc, Status::OK());
  42. EXPECT_EQ(30, image.Shape()[0]);
  43. EXPECT_EQ(30, image.Shape()[1]);
  44. }
  45. TEST_F(MindDataTestExecute, TestCrop) {
  46. MS_LOG(INFO) << "Doing MindDataTestExecute-TestCrop.";
  47. // Read images
  48. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  49. // Transform params
  50. auto decode = vision::Decode();
  51. auto crop = vision::Crop({10, 30}, {10, 15});
  52. auto transform = Execute({decode, crop});
  53. Status rc = transform(image, &image);
  54. EXPECT_EQ(rc, Status::OK());
  55. EXPECT_EQ(image.Shape()[0], 10);
  56. EXPECT_EQ(image.Shape()[1], 15);
  57. }
  58. TEST_F(MindDataTestExecute, TestTransformInput1) {
  59. MS_LOG(INFO) << "Doing MindDataTestExecute-TestTransformInput1.";
  60. // Test Execute with transform op input using API constructors, with std::shared_ptr<TensorTransform pointers,
  61. // instantiated via mix of make_shared and new
  62. // Read images
  63. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  64. // Define transform operations
  65. std::shared_ptr<TensorTransform> decode = std::make_shared<vision::Decode>();
  66. std::shared_ptr<TensorTransform> resize(new vision::Resize({224, 224}));
  67. std::shared_ptr<TensorTransform> normalize(
  68. new vision::Normalize({0.485 * 255, 0.456 * 255, 0.406 * 255}, {0.229 * 255, 0.224 * 255, 0.225 * 255}));
  69. std::shared_ptr<TensorTransform> hwc2chw = std::make_shared<vision::HWC2CHW>();
  70. mindspore::dataset::Execute Transform({decode, resize, normalize, hwc2chw});
  71. // Apply transform on image
  72. Status rc = Transform(image, &image);
  73. // Check image info
  74. ASSERT_TRUE(rc.IsOk());
  75. ASSERT_EQ(image.Shape().size(), 3);
  76. ASSERT_EQ(image.Shape()[0], 3);
  77. ASSERT_EQ(image.Shape()[1], 224);
  78. ASSERT_EQ(image.Shape()[2], 224);
  79. }
  80. TEST_F(MindDataTestExecute, TestTransformInput2) {
  81. MS_LOG(INFO) << "Doing MindDataTestExecute-TestTransformInput2.";
  82. // Test Execute with transform op input using API constructors, with std::shared_ptr<TensorTransform pointers,
  83. // instantiated via new
  84. // With this way of creating TensorTransforms, we don't need to explicitly delete the object created with the
  85. // "new" keyword. When the shared pointer goes out of scope the object destructor will be called.
  86. // Read image, construct MSTensor from dataset tensor
  87. std::shared_ptr<mindspore::dataset::Tensor> de_tensor;
  88. mindspore::dataset::Tensor::CreateFromFile("data/dataset/apple.jpg", &de_tensor);
  89. auto image = mindspore::MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor));
  90. // Define transform operations
  91. std::shared_ptr<TensorTransform> decode(new vision::Decode());
  92. std::shared_ptr<TensorTransform> resize(new vision::Resize({224, 224}));
  93. std::shared_ptr<TensorTransform> normalize(
  94. new vision::Normalize({0.485 * 255, 0.456 * 255, 0.406 * 255}, {0.229 * 255, 0.224 * 255, 0.225 * 255}));
  95. std::shared_ptr<TensorTransform> hwc2chw(new vision::HWC2CHW());
  96. mindspore::dataset::Execute Transform({decode, resize, normalize, hwc2chw});
  97. // Apply transform on image
  98. Status rc = Transform(image, &image);
  99. // Check image info
  100. ASSERT_TRUE(rc.IsOk());
  101. ASSERT_EQ(image.Shape().size(), 3);
  102. ASSERT_EQ(image.Shape()[0], 3);
  103. ASSERT_EQ(image.Shape()[1], 224);
  104. ASSERT_EQ(image.Shape()[2], 224);
  105. }
  106. TEST_F(MindDataTestExecute, TestTransformInput3) {
  107. MS_LOG(INFO) << "Doing MindDataTestExecute-TestTransformInput3.";
  108. // Test Execute with transform op input using API constructors, with auto pointers
  109. // Read image, construct MSTensor from dataset tensor
  110. std::shared_ptr<mindspore::dataset::Tensor> de_tensor;
  111. mindspore::dataset::Tensor::CreateFromFile("data/dataset/apple.jpg", &de_tensor);
  112. auto image = mindspore::MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor));
  113. // Define transform operations
  114. auto decode = vision::Decode();
  115. mindspore::dataset::Execute Transform1(decode);
  116. auto resize = vision::Resize({224, 224});
  117. mindspore::dataset::Execute Transform2(resize);
  118. // Apply transform on image
  119. Status rc;
  120. rc = Transform1(image, &image);
  121. ASSERT_TRUE(rc.IsOk());
  122. rc = Transform2(image, &image);
  123. ASSERT_TRUE(rc.IsOk());
  124. // Check image info
  125. ASSERT_EQ(image.Shape().size(), 3);
  126. ASSERT_EQ(image.Shape()[0], 224);
  127. ASSERT_EQ(image.Shape()[1], 224);
  128. ASSERT_EQ(image.Shape()[2], 3);
  129. }
  130. TEST_F(MindDataTestExecute, TestTransformInputSequential) {
  131. MS_LOG(INFO) << "Doing MindDataTestExecute-TestTransformInputSequential.";
  132. // Test Execute with transform op input using API constructors, with auto pointers;
  133. // Apply 2 transformations sequentially, including single non-vector Transform op input
  134. // Read image, construct MSTensor from dataset tensor
  135. std::shared_ptr<mindspore::dataset::Tensor> de_tensor;
  136. mindspore::dataset::Tensor::CreateFromFile("data/dataset/apple.jpg", &de_tensor);
  137. auto image = mindspore::MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor));
  138. // Define transform#1 operations
  139. std::shared_ptr<TensorTransform> decode(new vision::Decode());
  140. std::shared_ptr<TensorTransform> resize(new vision::Resize({224, 224}));
  141. std::shared_ptr<TensorTransform> normalize(
  142. new vision::Normalize({0.485 * 255, 0.456 * 255, 0.406 * 255}, {0.229 * 255, 0.224 * 255, 0.225 * 255}));
  143. std::vector<std::shared_ptr<TensorTransform>> op_list = {decode, resize, normalize};
  144. mindspore::dataset::Execute Transform(op_list);
  145. // Apply transform#1 on image
  146. Status rc = Transform(image, &image);
  147. // Define transform#2 operations
  148. std::shared_ptr<TensorTransform> hwc2chw(new vision::HWC2CHW());
  149. mindspore::dataset::Execute Transform2(hwc2chw);
  150. // Apply transform#2 on image
  151. rc = Transform2(image, &image);
  152. // Check image info
  153. ASSERT_TRUE(rc.IsOk());
  154. ASSERT_EQ(image.Shape().size(), 3);
  155. ASSERT_EQ(image.Shape()[0], 3);
  156. ASSERT_EQ(image.Shape()[1], 224);
  157. ASSERT_EQ(image.Shape()[2], 224);
  158. }
  159. TEST_F(MindDataTestExecute, TestTransformDecodeResizeCenterCrop1) {
  160. MS_LOG(INFO) << "Doing MindDataTestExecute-TestTransformDecodeResizeCenterCrop1.";
  161. // Test Execute with Decode, Resize and CenterCrop transform ops input using API constructors, with shared pointers
  162. // Read image, construct MSTensor from dataset tensor
  163. std::shared_ptr<mindspore::dataset::Tensor> de_tensor;
  164. mindspore::dataset::Tensor::CreateFromFile("data/dataset/apple.jpg", &de_tensor);
  165. auto image = mindspore::MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor));
  166. // Define transform operations
  167. std::vector<int32_t> resize_paras = {256, 256};
  168. std::vector<int32_t> crop_paras = {224, 224};
  169. std::shared_ptr<TensorTransform> decode(new vision::Decode());
  170. std::shared_ptr<TensorTransform> resize(new vision::Resize(resize_paras));
  171. std::shared_ptr<TensorTransform> centercrop(new vision::CenterCrop(crop_paras));
  172. std::shared_ptr<TensorTransform> hwc2chw(new vision::HWC2CHW());
  173. std::vector<std::shared_ptr<TensorTransform>> op_list = {decode, resize, centercrop, hwc2chw};
  174. mindspore::dataset::Execute Transform(op_list, MapTargetDevice::kCpu);
  175. // Apply transform on image
  176. Status rc = Transform(image, &image);
  177. // Check image info
  178. ASSERT_TRUE(rc.IsOk());
  179. ASSERT_EQ(image.Shape().size(), 3);
  180. ASSERT_EQ(image.Shape()[0], 3);
  181. ASSERT_EQ(image.Shape()[1], 224);
  182. ASSERT_EQ(image.Shape()[2], 224);
  183. }
  184. TEST_F(MindDataTestExecute, TestUniformAugment) {
  185. // Read images
  186. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  187. std::vector<mindspore::MSTensor> image2;
  188. // Transform params
  189. std::shared_ptr<TensorTransform> decode = std::make_shared<vision::Decode>();
  190. std::shared_ptr<TensorTransform> resize_op(new vision::Resize({16, 16}));
  191. std::shared_ptr<TensorTransform> vertical = std::make_shared<vision::RandomVerticalFlip>();
  192. std::shared_ptr<TensorTransform> horizontal = std::make_shared<vision::RandomHorizontalFlip>();
  193. std::shared_ptr<TensorTransform> uniform_op(new vision::UniformAugment({resize_op, vertical, horizontal}, 3));
  194. auto transform1 = Execute({decode});
  195. Status rc = transform1(image, &image);
  196. ASSERT_TRUE(rc.IsOk());
  197. auto transform2 = Execute({uniform_op});
  198. rc = transform2({image}, &image2);
  199. ASSERT_TRUE(rc.IsOk());
  200. }
  201. TEST_F(MindDataTestExecute, TestBasicTokenizer) {
  202. std::shared_ptr<Tensor> de_tensor;
  203. Tensor::CreateScalar<std::string>("Welcome to China.", &de_tensor);
  204. auto txt = mindspore::MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor));
  205. std::vector<mindspore::MSTensor> txt_result;
  206. // Transform params
  207. std::shared_ptr<TensorTransform> tokenizer =
  208. std::make_shared<text::BasicTokenizer>(false, false, NormalizeForm::kNone, false, true);
  209. // BasicTokenizer has 3 outputs so we need a vector to receive its result
  210. auto transform1 = Execute({tokenizer});
  211. Status rc = transform1({txt}, &txt_result);
  212. ASSERT_EQ(txt_result.size(), 3);
  213. ASSERT_TRUE(rc.IsOk());
  214. }
  215. TEST_F(MindDataTestExecute, TestRotate) {
  216. MS_LOG(INFO) << "Doing MindDataTestExecute-TestRotate.";
  217. // Read images
  218. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  219. // Transform params
  220. auto decode = vision::Decode();
  221. auto rotate = vision::Rotate(10.5);
  222. auto transform = Execute({decode, rotate});
  223. Status rc = transform(image, &image);
  224. EXPECT_EQ(rc, Status::OK());
  225. }
  226. TEST_F(MindDataTestExecute, TestResizeWithBBox) {
  227. auto image = ReadFileToTensor("data/dataset/apple.jpg");
  228. std::shared_ptr<TensorTransform> decode_op = std::make_shared<vision::Decode>();
  229. std::shared_ptr<TensorTransform> resizewithbbox_op =
  230. std::make_shared<vision::ResizeWithBBox>(std::vector<int32_t>{250, 500});
  231. // Test Compute(Tensor, Tensor) method of ResizeWithBBox
  232. auto transform = Execute({decode_op, resizewithbbox_op});
  233. // Expect fail since Compute(Tensor, Tensor) is not a valid behaviour for this Op,
  234. // while Compute(TensorRow, TensorRow) is the correct one.
  235. Status rc = transform(image, &image);
  236. EXPECT_FALSE(rc.IsOk());
  237. }