1 /** 2 * Copyright 2020 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 <iostream> 17 #include <string> 18 #include <vector> 19 #include "common/common_test.h" 20 #include "include/api/types.h" 21 #include "minddata/dataset/include/dataset/execute.h" 22 #include "minddata/dataset/include/dataset/transforms.h" 23 #include "minddata/dataset/include/dataset/vision.h" 24 #ifdef ENABLE_ACL 25 #include "minddata/dataset/include/dataset/vision_ascend.h" 26 #endif 27 #include "minddata/dataset/kernels/tensor_op.h" 28 #include "include/api/model.h" 29 #include "include/api/serialization.h" 30 #include "include/api/context.h" 31 32 using namespace mindspore; 33 using namespace mindspore::dataset; 34 using namespace mindspore::dataset::vision; 35 36 class TestDE : public ST::Common { 37 public: 38 TestDE() {} 39 }; 40 41 mindspore::MSTensor ReadFileToTensor(const std::string &file) { 42 if (file.empty()) { 43 std::cout << "[ERROR]Pointer file is nullptr, return an empty Tensor." << std::endl; 44 return mindspore::MSTensor(); 45 } 46 std::ifstream ifs(file); 47 if (!ifs.good()) { 48 std::cout << "[ERROR]File: " << file << " does not exist, return an empty Tensor." << std::endl; 49 return mindspore::MSTensor(); 50 } 51 if (!ifs.is_open()) { 52 std::cout << "[ERROR]File: " << file << "open failed, return an empty Tensor." << std::endl; 53 return mindspore::MSTensor(); 54 } 55 56 ifs.seekg(0, std::ios::end); 57 size_t size = ifs.tellg(); 58 mindspore::MSTensor buf("file", mindspore::DataType::kNumberTypeUInt8, {static_cast<int64_t>(size)}, nullptr, size); 59 60 ifs.seekg(0, std::ios::beg); 61 ifs.read(reinterpret_cast<char *>(buf.MutableData()), size); 62 ifs.close(); 63 64 return buf; 65 } 66 67 TEST_F(TestDE, TestResNetPreprocess) { 68 // Read images 69 auto image = ReadFileToTensor("./data/dataset/apple.jpg"); 70 71 // Define transform operations 72 std::shared_ptr<TensorTransform> decode(new vision::Decode()); 73 std::shared_ptr<TensorTransform> resize(new vision::Resize({224, 224})); 74 std::shared_ptr<TensorTransform> normalize( 75 new vision::Normalize({0.485 * 255, 0.456 * 255, 0.406 * 255}, {0.229 * 255, 0.224 * 255, 0.225 * 255})); 76 std::shared_ptr<TensorTransform> hwc2chw(new vision::HWC2CHW()); 77 78 mindspore::dataset::Execute Transform({decode, resize, normalize, hwc2chw}); 79 80 // Apply transform on images 81 Status rc = Transform(image, &image); 82 83 // Check image info 84 ASSERT_TRUE(rc.IsOk()); 85 ASSERT_EQ(image.Shape().size(), 3); 86 ASSERT_EQ(image.Shape()[0], 3); 87 ASSERT_EQ(image.Shape()[1], 224); 88 ASSERT_EQ(image.Shape()[2], 224); 89 } 90 91 TEST_F(TestDE, TestDvpp) { 92 #ifdef ENABLE_ACL 93 // Read images from target directory 94 95 /* Old internal method, we deprecate it 96 std::shared_ptr<mindspore::dataset::Tensor> de_tensor; 97 Status rc = mindspore::dataset::Tensor::CreateFromFile("./data/dataset/apple.jpg", &de_tensor); 98 ASSERT_TRUE(rc.IsOk()); 99 auto image = MSTensor(std::make_shared<mindspore::dataset::DETensor>(de_tensor)); 100 */ 101 auto context = ContextAutoSet(); 102 ASSERT_TRUE(context != nullptr); 103 ASSERT_TRUE(context->MutableDeviceInfo().size() == 1); 104 auto ascend310_info = context->MutableDeviceInfo()[0]->Cast<Ascend310DeviceInfo>(); 105 ASSERT_TRUE(ascend310_info != nullptr); 106 auto device_id = ascend310_info->GetDeviceID(); 107 108 auto image = ReadFileToTensor("./data/dataset/apple.jpg"); 109 110 // Define dvpp transform 111 std::vector<uint32_t> crop_paras = {224, 224}; 112 std::vector<uint32_t> resize_paras = {256, 256}; 113 std::shared_ptr<TensorTransform> decode_resize_crop(new vision::DvppDecodeResizeCropJpeg(crop_paras, resize_paras)); 114 mindspore::dataset::Execute Transform(decode_resize_crop, MapTargetDevice::kAscend310, device_id); 115 116 // Apply transform on images 117 Status rc = Transform(image, &image); 118 std::string aipp_cfg = Transform.AippCfgGenerator(); 119 ASSERT_EQ(aipp_cfg, "./aipp.cfg"); 120 121 // Check image info 122 ASSERT_TRUE(rc.IsOk()); 123 ASSERT_EQ(image.Shape().size(), 2); 124 int32_t real_h = 0; 125 int32_t real_w = 0; 126 int32_t remainder = crop_paras[crop_paras.size() - 1] % 16; 127 if (crop_paras.size() == 1) { 128 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 129 real_w = (remainder == 0) ? crop_paras[0] : crop_paras[0] + 16 - remainder; 130 } else { 131 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 132 real_w = (remainder == 0) ? crop_paras[1] : crop_paras[1] + 16 - remainder; 133 } 134 135 ASSERT_EQ(image.Shape()[0], real_h); // For image in YUV format, each pixel takes 1.5 byte 136 ASSERT_EQ(image.Shape()[1], real_w); 137 ASSERT_EQ(image.DataSize(), real_h * real_w * 1.5); 138 139 ASSERT_TRUE(image.Data().get() != nullptr); 140 ASSERT_EQ(image.DataType(), mindspore::DataType::kNumberTypeUInt8); 141 ASSERT_EQ(image.IsDevice(), true); 142 143 /* This is the criterion for previous method(Without pop) 144 ASSERT_EQ(image.Shape()[0], 1.5 * real_h * real_w); // For image in YUV format, each pixel takes 1.5 byte 145 ASSERT_EQ(image.Shape()[1], 1); 146 ASSERT_EQ(image.Shape()[2], 1); 147 ASSERT_EQ(image.DataSize(), real_h * real_w * 1.5); 148 */ 149 #endif 150 } 151 152 TEST_F(TestDE, TestDvppSinkMode) { 153 #ifdef ENABLE_ACL 154 auto context = ContextAutoSet(); 155 ASSERT_TRUE(context != nullptr); 156 ASSERT_TRUE(context->MutableDeviceInfo().size() == 1); 157 auto ascend310_info = context->MutableDeviceInfo()[0]->Cast<Ascend310DeviceInfo>(); 158 ASSERT_TRUE(ascend310_info != nullptr); 159 auto device_id = ascend310_info->GetDeviceID(); 160 161 // Read images from target directory 162 auto image = ReadFileToTensor("./data/dataset/apple.jpg"); 163 164 // Define dvpp transform 165 std::vector<int32_t> crop_paras = {224, 224}; 166 std::vector<int32_t> resize_paras = {256}; 167 std::shared_ptr<TensorTransform> decode(new vision::Decode()); 168 std::shared_ptr<TensorTransform> resize(new vision::Resize(resize_paras)); 169 std::shared_ptr<TensorTransform> centercrop(new vision::CenterCrop(crop_paras)); 170 std::vector<std::shared_ptr<TensorTransform>> trans_list = {decode, resize, centercrop}; 171 mindspore::dataset::Execute Transform(trans_list, MapTargetDevice::kAscend310, device_id); 172 173 // Apply transform on images 174 Status rc = Transform(image, &image); 175 176 // Check image info 177 ASSERT_TRUE(rc.IsOk()); 178 ASSERT_EQ(image.Shape().size(), 2); 179 int32_t real_h = 0; 180 int32_t real_w = 0; 181 int32_t remainder = crop_paras[crop_paras.size() - 1] % 16; 182 if (crop_paras.size() == 1) { 183 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 184 real_w = (remainder == 0) ? crop_paras[0] : crop_paras[0] + 16 - remainder; 185 } else { 186 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 187 real_w = (remainder == 0) ? crop_paras[1] : crop_paras[1] + 16 - remainder; 188 } 189 ASSERT_EQ(image.Shape()[0], real_h); // For image in YUV format, each pixel takes 1.5 byte 190 ASSERT_EQ(image.Shape()[1], real_w); 191 ASSERT_EQ(image.DataSize(), real_h * real_w * 1.5); 192 193 ASSERT_TRUE(image.Data().get() != nullptr); 194 ASSERT_EQ(image.DataType(), mindspore::DataType::kNumberTypeUInt8); 195 ASSERT_EQ(image.IsDevice(), true); 196 Transform.DeviceMemoryRelease(); 197 #endif 198 } 199 200 TEST_F(TestDE, TestDvppDecodeResizeCropNormalize) { 201 #ifdef ENABLE_ACL 202 auto context = ContextAutoSet(); 203 ASSERT_TRUE(context != nullptr); 204 ASSERT_TRUE(context->MutableDeviceInfo().size() == 1); 205 auto ascend310_info = context->MutableDeviceInfo()[0]->Cast<Ascend310DeviceInfo>(); 206 ASSERT_TRUE(ascend310_info != nullptr); 207 auto device_id = ascend310_info->GetDeviceID(); 208 209 auto image = ReadFileToTensor("./data/dataset/apple.jpg"); 210 211 // Define dvpp transform 212 std::vector<int32_t> crop_paras = {416}; 213 std::vector<int32_t> resize_paras = {512}; 214 std::vector<float> mean = {0.485 * 255, 0.456 * 255, 0.406 * 255}; 215 std::vector<float> std = {0.229 * 255, 0.224 * 255, 0.225 * 255}; 216 217 std::shared_ptr<TensorTransform> decode(new vision::Decode()); 218 std::shared_ptr<TensorTransform> resize(new vision::Resize(resize_paras)); 219 std::shared_ptr<TensorTransform> centercrop(new vision::CenterCrop(crop_paras)); 220 std::shared_ptr<TensorTransform> normalize(new vision::Normalize(mean, std)); 221 222 std::vector<std::shared_ptr<TensorTransform>> trans_list = {decode, resize, centercrop, normalize}; 223 mindspore::dataset::Execute Transform(trans_list, MapTargetDevice::kAscend310, device_id); 224 225 std::string aipp_cfg = Transform.AippCfgGenerator(); 226 ASSERT_EQ(aipp_cfg, "./aipp.cfg"); 227 228 // Apply transform on images 229 Status rc = Transform(image, &image); 230 231 // Check image info 232 ASSERT_TRUE(rc.IsOk()); 233 ASSERT_EQ(image.Shape().size(), 2); 234 int32_t real_h = 0; 235 int32_t real_w = 0; 236 int32_t remainder = crop_paras[crop_paras.size() - 1] % 16; 237 if (crop_paras.size() == 1) { 238 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 239 real_w = (remainder == 0) ? crop_paras[0] : crop_paras[0] + 16 - remainder; 240 } else { 241 real_h = (crop_paras[0] % 2 == 0) ? crop_paras[0] : crop_paras[0] + 1; 242 real_w = (remainder == 0) ? crop_paras[1] : crop_paras[1] + 16 - remainder; 243 } 244 245 ASSERT_EQ(image.Shape()[0], real_h); // For image in YUV format, each pixel takes 1.5 byte 246 ASSERT_EQ(image.Shape()[1], real_w); 247 ASSERT_EQ(image.DataSize(), real_h * real_w * 1.5); 248 249 ASSERT_TRUE(image.Data().get() != nullptr); 250 ASSERT_EQ(image.DataType(), mindspore::DataType::kNumberTypeUInt8); 251 ASSERT_EQ(image.IsDevice(), true); 252 Transform.DeviceMemoryRelease(); 253 #endif 254 } 255