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.

vision.cc 34 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  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 "minddata/dataset/include/vision.h"
  17. #ifdef ENABLE_ACL
  18. #include "minddata/dataset/include/vision_ascend.h"
  19. #include "minddata/dataset/kernels/ir/vision/ascend_vision_ir.h"
  20. #endif
  21. #include "minddata/dataset/include/transforms.h"
  22. #include "minddata/dataset/kernels/ir/vision/vision_ir.h"
  23. #ifndef ENABLE_ANDROID
  24. #include "minddata/dataset/kernels/image/image_utils.h"
  25. #include "utils/log_adapter.h"
  26. #else
  27. #include "mindspore/lite/src/common/log_adapter.h"
  28. #endif
  29. #include "minddata/dataset/kernels/ir/validators.h"
  30. // Kernel image headers (in alphabetical order)
  31. namespace mindspore {
  32. namespace dataset {
  33. // Transform operations for computer vision.
  34. namespace vision {
  35. #ifndef ENABLE_ANDROID
  36. // CONSTRUCTORS FOR API CLASSES TO CREATE VISION TENSOR TRANSFORM OPERATIONS
  37. // (In alphabetical order)
  38. // Affine Transform Operation.
  39. struct Affine::Data {
  40. Data(float_t degrees, const std::vector<float> &translation, float scale, const std::vector<float> &shear,
  41. InterpolationMode interpolation, const std::vector<uint8_t> &fill_value)
  42. : degrees_(degrees),
  43. translation_(translation),
  44. scale_(scale),
  45. shear_(shear),
  46. interpolation_(interpolation),
  47. fill_value_(fill_value) {}
  48. float degrees_;
  49. std::vector<float> translation_;
  50. float scale_;
  51. std::vector<float> shear_;
  52. InterpolationMode interpolation_;
  53. std::vector<uint8_t> fill_value_;
  54. };
  55. Affine::Affine(float_t degrees, const std::vector<float> &translation, float scale, const std::vector<float> &shear,
  56. InterpolationMode interpolation, const std::vector<uint8_t> &fill_value)
  57. : data_(std::make_shared<Data>(degrees, translation, scale, shear, interpolation, fill_value)) {}
  58. std::shared_ptr<TensorOperation> Affine::Parse() {
  59. return std::make_shared<AffineOperation>(data_->degrees_, data_->translation_, data_->scale_, data_->shear_,
  60. data_->interpolation_, data_->fill_value_);
  61. }
  62. // AutoContrast Transform Operation.
  63. struct AutoContrast::Data {
  64. Data(float cutoff, const std::vector<uint32_t> &ignore) : cutoff_(cutoff), ignore_(ignore) {}
  65. float cutoff_;
  66. std::vector<uint32_t> ignore_;
  67. };
  68. AutoContrast::AutoContrast(float cutoff, std::vector<uint32_t> ignore)
  69. : data_(std::make_shared<Data>(cutoff, ignore)) {}
  70. std::shared_ptr<TensorOperation> AutoContrast::Parse() {
  71. return std::make_shared<AutoContrastOperation>(data_->cutoff_, data_->ignore_);
  72. }
  73. // BoundingBoxAugment Transform Operation.
  74. struct BoundingBoxAugment::Data {
  75. std::shared_ptr<TensorOperation> transform_;
  76. float ratio_;
  77. };
  78. BoundingBoxAugment::BoundingBoxAugment(TensorTransform *transform, float ratio) : data_(std::make_shared<Data>()) {
  79. data_->transform_ = transform ? transform->Parse() : nullptr;
  80. data_->ratio_ = ratio;
  81. }
  82. BoundingBoxAugment::BoundingBoxAugment(const std::shared_ptr<TensorTransform> &transform, float ratio)
  83. : data_(std::make_shared<Data>()) {
  84. data_->transform_ = transform ? transform->Parse() : nullptr;
  85. data_->ratio_ = ratio;
  86. }
  87. BoundingBoxAugment::BoundingBoxAugment(const std::reference_wrapper<TensorTransform> transform, float ratio)
  88. : data_(std::make_shared<Data>()) {
  89. data_->transform_ = transform.get().Parse();
  90. data_->ratio_ = ratio;
  91. }
  92. std::shared_ptr<TensorOperation> BoundingBoxAugment::Parse() {
  93. return std::make_shared<BoundingBoxAugmentOperation>(data_->transform_, data_->ratio_);
  94. }
  95. #endif // not ENABLE_ANDROID
  96. // CenterCrop Transform Operation.
  97. struct CenterCrop::Data {
  98. explicit Data(const std::vector<int32_t> &size) : size_(size) {}
  99. std::vector<int32_t> size_;
  100. };
  101. CenterCrop::CenterCrop(std::vector<int32_t> size) : data_(std::make_shared<Data>(size)) {}
  102. std::shared_ptr<TensorOperation> CenterCrop::Parse() { return std::make_shared<CenterCropOperation>(data_->size_); }
  103. std::shared_ptr<TensorOperation> CenterCrop::Parse(const MapTargetDevice &env) {
  104. if (env == MapTargetDevice::kAscend310) {
  105. #ifdef ENABLE_ACL
  106. std::vector<uint32_t> usize_;
  107. usize_.reserve(data_->size_.size());
  108. std::transform(data_->size_.begin(), data_->size_.end(), std::back_inserter(usize_),
  109. [](int32_t i) { return (uint32_t)i; });
  110. return std::make_shared<DvppCropJpegOperation>(usize_);
  111. #endif // ENABLE_ACL
  112. }
  113. return std::make_shared<CenterCropOperation>(data_->size_);
  114. }
  115. // Crop Transform Operation.
  116. struct Crop::Data {
  117. Data(const std::vector<int32_t> &coordinates, const std::vector<int32_t> &size)
  118. : coordinates_(coordinates), size_(size) {}
  119. std::vector<int32_t> coordinates_;
  120. std::vector<int32_t> size_;
  121. };
  122. Crop::Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size)
  123. : data_(std::make_shared<Data>(coordinates, size)) {}
  124. std::shared_ptr<TensorOperation> Crop::Parse() {
  125. return std::make_shared<CropOperation>(data_->coordinates_, data_->size_);
  126. }
  127. #ifndef ENABLE_ANDROID
  128. // CutMixBatch Transform Operation.
  129. struct CutMixBatch::Data {
  130. Data(ImageBatchFormat image_batch_format, float alpha, float prob)
  131. : image_batch_format_(image_batch_format), alpha_(alpha), prob_(prob) {}
  132. float alpha_;
  133. float prob_;
  134. ImageBatchFormat image_batch_format_;
  135. };
  136. CutMixBatch::CutMixBatch(ImageBatchFormat image_batch_format, float alpha, float prob)
  137. : data_(std::make_shared<Data>(image_batch_format, alpha, prob)) {}
  138. std::shared_ptr<TensorOperation> CutMixBatch::Parse() {
  139. return std::make_shared<CutMixBatchOperation>(data_->image_batch_format_, data_->alpha_, data_->prob_);
  140. }
  141. // CutOutOp.
  142. struct CutOut::Data {
  143. Data(int32_t length, int32_t num_patches) : length_(length), num_patches_(num_patches) {}
  144. int32_t length_;
  145. int32_t num_patches_;
  146. };
  147. CutOut::CutOut(int32_t length, int32_t num_patches) : data_(std::make_shared<Data>(length, num_patches)) {}
  148. std::shared_ptr<TensorOperation> CutOut::Parse() {
  149. return std::make_shared<CutOutOperation>(data_->length_, data_->num_patches_);
  150. }
  151. #endif // not ENABLE_ANDROID
  152. // Decode Transform Operation.
  153. struct Decode::Data {
  154. explicit Data(bool rgb) : rgb_(rgb) {}
  155. bool rgb_;
  156. };
  157. Decode::Decode(bool rgb) : data_(std::make_shared<Data>(rgb)) {}
  158. std::shared_ptr<TensorOperation> Decode::Parse() { return std::make_shared<DecodeOperation>(data_->rgb_); }
  159. std::shared_ptr<TensorOperation> Decode::Parse(const MapTargetDevice &env) {
  160. if (env == MapTargetDevice::kAscend310) {
  161. #ifdef ENABLE_ACL
  162. return std::make_shared<DvppDecodeJpegOperation>();
  163. #endif // ENABLE_ACL
  164. }
  165. return std::make_shared<DecodeOperation>(data_->rgb_);
  166. }
  167. #ifdef ENABLE_ACL
  168. // DvppDecodeResize Transform Operation.
  169. struct DvppDecodeResizeJpeg::Data {
  170. explicit Data(const std::vector<uint32_t> &resize) : resize_(resize) {}
  171. std::vector<uint32_t> resize_;
  172. };
  173. DvppDecodeResizeJpeg::DvppDecodeResizeJpeg(std::vector<uint32_t> resize) : data_(std::make_shared<Data>(resize)) {}
  174. std::shared_ptr<TensorOperation> DvppDecodeResizeJpeg::Parse() {
  175. return std::make_shared<DvppDecodeResizeOperation>(data_->resize_);
  176. }
  177. std::shared_ptr<TensorOperation> DvppDecodeResizeJpeg::Parse(const MapTargetDevice &env) {
  178. return std::make_shared<DvppDecodeResizeOperation>(data_->resize_);
  179. }
  180. // DvppDecodeResizeCrop Transform Operation.
  181. struct DvppDecodeResizeCropJpeg::Data {
  182. Data(const std::vector<uint32_t> &crop, const std::vector<uint32_t> &resize) : crop_(crop), resize_(resize) {}
  183. std::vector<uint32_t> crop_;
  184. std::vector<uint32_t> resize_;
  185. };
  186. DvppDecodeResizeCropJpeg::DvppDecodeResizeCropJpeg(std::vector<uint32_t> crop, std::vector<uint32_t> resize)
  187. : data_(std::make_shared<Data>(crop, resize)) {}
  188. std::shared_ptr<TensorOperation> DvppDecodeResizeCropJpeg::Parse() {
  189. return std::make_shared<DvppDecodeResizeCropOperation>(data_->crop_, data_->resize_);
  190. }
  191. std::shared_ptr<TensorOperation> DvppDecodeResizeCropJpeg::Parse(const MapTargetDevice &env) {
  192. return std::make_shared<DvppDecodeResizeCropOperation>(data_->crop_, data_->resize_);
  193. }
  194. // DvppDecodePng Transform Operation.
  195. DvppDecodePng::DvppDecodePng() {}
  196. std::shared_ptr<TensorOperation> DvppDecodePng::Parse() { return std::make_shared<DvppDecodePngOperation>(); }
  197. std::shared_ptr<TensorOperation> DvppDecodePng::Parse(const MapTargetDevice &env) {
  198. return std::make_shared<DvppDecodePngOperation>();
  199. }
  200. #endif // ENABLE_ACL
  201. #ifndef ENABLE_ANDROID
  202. // Equalize Transform Operation.
  203. Equalize::Equalize() {}
  204. std::shared_ptr<TensorOperation> Equalize::Parse() { return std::make_shared<EqualizeOperation>(); }
  205. // HwcToChw Transform Operation.
  206. HWC2CHW::HWC2CHW() {}
  207. std::shared_ptr<TensorOperation> HWC2CHW::Parse() { return std::make_shared<HwcToChwOperation>(); }
  208. // Invert Transform Operation.
  209. Invert::Invert() {}
  210. std::shared_ptr<TensorOperation> Invert::Parse() { return std::make_shared<InvertOperation>(); }
  211. // MixUpBatch Transform Operation.
  212. struct MixUpBatch::Data {
  213. explicit Data(float alpha) : alpha_(alpha) {}
  214. float alpha_;
  215. };
  216. MixUpBatch::MixUpBatch(float alpha) : data_(std::make_shared<Data>(alpha)) {}
  217. std::shared_ptr<TensorOperation> MixUpBatch::Parse() { return std::make_shared<MixUpBatchOperation>(data_->alpha_); }
  218. #endif // not ENABLE_ANDROID
  219. // Normalize Transform Operation.
  220. struct Normalize::Data {
  221. Data(const std::vector<float> &mean, const std::vector<float> &std) : mean_(mean), std_(std) {}
  222. std::vector<float> mean_;
  223. std::vector<float> std_;
  224. };
  225. Normalize::Normalize(std::vector<float> mean, std::vector<float> std) : data_(std::make_shared<Data>(mean, std)) {}
  226. std::shared_ptr<TensorOperation> Normalize::Parse() {
  227. return std::make_shared<NormalizeOperation>(data_->mean_, data_->std_);
  228. }
  229. std::shared_ptr<TensorOperation> Normalize::Parse(const MapTargetDevice &env) {
  230. if (env == MapTargetDevice::kAscend310) {
  231. #ifdef ENABLE_ACL
  232. return std::make_shared<DvppNormalizeOperation>(data_->mean_, data_->std_);
  233. #endif
  234. }
  235. return std::make_shared<NormalizeOperation>(data_->mean_, data_->std_);
  236. }
  237. #ifndef ENABLE_ANDROID
  238. // NormalizePad Transform Operation.
  239. struct NormalizePad::Data {
  240. Data(const std::vector<float> &mean, const std::vector<float> &std, const std::string &dtype)
  241. : mean_(mean), std_(std), dtype_(dtype) {}
  242. std::vector<float> mean_;
  243. std::vector<float> std_;
  244. std::string dtype_;
  245. };
  246. NormalizePad::NormalizePad(const std::vector<float> &mean, const std::vector<float> &std,
  247. const std::vector<char> &dtype)
  248. : data_(std::make_shared<Data>(mean, std, CharToString(dtype))) {}
  249. std::shared_ptr<TensorOperation> NormalizePad::Parse() {
  250. return std::make_shared<NormalizePadOperation>(data_->mean_, data_->std_, data_->dtype_);
  251. }
  252. // Pad Transform Operation.
  253. struct Pad::Data {
  254. Data(const std::vector<int32_t> &padding, const std::vector<uint8_t> &fill_value, BorderType padding_mode)
  255. : padding_(padding), fill_value_(fill_value), padding_mode_(padding_mode) {}
  256. std::vector<int32_t> padding_;
  257. std::vector<uint8_t> fill_value_;
  258. BorderType padding_mode_;
  259. };
  260. Pad::Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value, BorderType padding_mode)
  261. : data_(std::make_shared<Data>(padding, fill_value, padding_mode)) {}
  262. std::shared_ptr<TensorOperation> Pad::Parse() {
  263. return std::make_shared<PadOperation>(data_->padding_, data_->fill_value_, data_->padding_mode_);
  264. }
  265. // RandomAffine Transform Operation.
  266. struct RandomAffine::Data {
  267. Data(const std::vector<float_t> &degrees, const std::vector<float_t> &translate_range,
  268. const std::vector<float_t> &scale_range, const std::vector<float_t> &shear_ranges,
  269. InterpolationMode interpolation, const std::vector<uint8_t> &fill_value)
  270. : degrees_(degrees),
  271. translate_range_(translate_range),
  272. scale_range_(scale_range),
  273. shear_ranges_(shear_ranges),
  274. interpolation_(interpolation),
  275. fill_value_(fill_value) {}
  276. std::vector<float_t> degrees_; // min_degree, max_degree
  277. std::vector<float_t> translate_range_; // maximum x translation percentage, maximum y translation percentage
  278. std::vector<float_t> scale_range_; // min_scale, max_scale
  279. std::vector<float_t> shear_ranges_; // min_x_shear, max_x_shear, min_y_shear, max_y_shear
  280. InterpolationMode interpolation_;
  281. std::vector<uint8_t> fill_value_;
  282. };
  283. RandomAffine::RandomAffine(const std::vector<float_t> &degrees, const std::vector<float_t> &translate_range,
  284. const std::vector<float_t> &scale_range, const std::vector<float_t> &shear_ranges,
  285. InterpolationMode interpolation, const std::vector<uint8_t> &fill_value)
  286. : data_(std::make_shared<Data>(degrees, translate_range, scale_range, shear_ranges, interpolation, fill_value)) {}
  287. std::shared_ptr<TensorOperation> RandomAffine::Parse() {
  288. return std::make_shared<RandomAffineOperation>(data_->degrees_, data_->translate_range_, data_->scale_range_,
  289. data_->shear_ranges_, data_->interpolation_, data_->fill_value_);
  290. }
  291. // RandomColor Transform Operation.
  292. struct RandomColor::Data {
  293. Data(float t_lb, float t_ub) : t_lb_(t_lb), t_ub_(t_ub) {}
  294. float t_lb_;
  295. float t_ub_;
  296. };
  297. RandomColor::RandomColor(float t_lb, float t_ub) : data_(std::make_shared<Data>(t_lb, t_ub)) {}
  298. std::shared_ptr<TensorOperation> RandomColor::Parse() {
  299. return std::make_shared<RandomColorOperation>(data_->t_lb_, data_->t_ub_);
  300. }
  301. // RandomColorAdjust Transform Operation.
  302. struct RandomColorAdjust::Data {
  303. Data(const std::vector<float> &brightness, const std::vector<float> &contrast, const std::vector<float> &saturation,
  304. const std::vector<float> &hue)
  305. : brightness_(brightness), contrast_(contrast), saturation_(saturation), hue_(hue) {}
  306. std::vector<float> brightness_;
  307. std::vector<float> contrast_;
  308. std::vector<float> saturation_;
  309. std::vector<float> hue_;
  310. };
  311. RandomColorAdjust::RandomColorAdjust(std::vector<float> brightness, std::vector<float> contrast,
  312. std::vector<float> saturation, std::vector<float> hue)
  313. : data_(std::make_shared<Data>(brightness, contrast, saturation, hue)) {}
  314. std::shared_ptr<TensorOperation> RandomColorAdjust::Parse() {
  315. return std::make_shared<RandomColorAdjustOperation>(data_->brightness_, data_->contrast_, data_->saturation_,
  316. data_->hue_);
  317. }
  318. // RandomCrop Transform Operation.
  319. struct RandomCrop::Data {
  320. Data(const std::vector<int32_t> &size, const std::vector<int32_t> &padding, bool pad_if_needed,
  321. const std::vector<uint8_t> &fill_value, BorderType padding_mode)
  322. : size_(size),
  323. padding_(padding),
  324. pad_if_needed_(pad_if_needed),
  325. fill_value_(fill_value),
  326. padding_mode_(padding_mode) {}
  327. std::vector<int32_t> size_;
  328. std::vector<int32_t> padding_;
  329. bool pad_if_needed_;
  330. std::vector<uint8_t> fill_value_;
  331. BorderType padding_mode_;
  332. };
  333. RandomCrop::RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding, bool pad_if_needed,
  334. std::vector<uint8_t> fill_value, BorderType padding_mode)
  335. : data_(std::make_shared<Data>(size, padding, pad_if_needed, fill_value, padding_mode)) {}
  336. std::shared_ptr<TensorOperation> RandomCrop::Parse() {
  337. return std::make_shared<RandomCropOperation>(data_->size_, data_->padding_, data_->pad_if_needed_, data_->fill_value_,
  338. data_->padding_mode_);
  339. }
  340. // RandomCropDecodeResize Transform Operation.
  341. struct RandomCropDecodeResize::Data {
  342. Data(const std::vector<int32_t> &size, const std::vector<float> &scale, const std::vector<float> &ratio,
  343. InterpolationMode interpolation, int32_t max_attempts)
  344. : size_(size), scale_(scale), ratio_(ratio), interpolation_(interpolation), max_attempts_(max_attempts) {}
  345. std::vector<int32_t> size_;
  346. std::vector<float> scale_;
  347. std::vector<float> ratio_;
  348. InterpolationMode interpolation_;
  349. int32_t max_attempts_;
  350. };
  351. RandomCropDecodeResize::RandomCropDecodeResize(std::vector<int32_t> size, std::vector<float> scale,
  352. std::vector<float> ratio, InterpolationMode interpolation,
  353. int32_t max_attempts)
  354. : data_(std::make_shared<Data>(size, scale, ratio, interpolation, max_attempts)) {}
  355. std::shared_ptr<TensorOperation> RandomCropDecodeResize::Parse() {
  356. return std::make_shared<RandomCropDecodeResizeOperation>(data_->size_, data_->scale_, data_->ratio_,
  357. data_->interpolation_, data_->max_attempts_);
  358. }
  359. // RandomCropWithBBox Transform Operation.
  360. struct RandomCropWithBBox::Data {
  361. Data(const std::vector<int32_t> &size, const std::vector<int32_t> &padding, bool pad_if_needed,
  362. const std::vector<uint8_t> &fill_value, BorderType padding_mode)
  363. : size_(size),
  364. padding_(padding),
  365. pad_if_needed_(pad_if_needed),
  366. fill_value_(fill_value),
  367. padding_mode_(padding_mode) {}
  368. std::vector<int32_t> size_;
  369. std::vector<int32_t> padding_;
  370. bool pad_if_needed_;
  371. std::vector<uint8_t> fill_value_;
  372. BorderType padding_mode_;
  373. };
  374. RandomCropWithBBox::RandomCropWithBBox(std::vector<int32_t> size, std::vector<int32_t> padding, bool pad_if_needed,
  375. std::vector<uint8_t> fill_value, BorderType padding_mode)
  376. : data_(std::make_shared<Data>(size, padding, pad_if_needed, fill_value, padding_mode)) {}
  377. std::shared_ptr<TensorOperation> RandomCropWithBBox::Parse() {
  378. return std::make_shared<RandomCropWithBBoxOperation>(data_->size_, data_->padding_, data_->pad_if_needed_,
  379. data_->fill_value_, data_->padding_mode_);
  380. }
  381. // RandomHorizontalFlip.
  382. struct RandomHorizontalFlip::Data {
  383. explicit Data(float prob) : probability_(prob) {}
  384. float probability_;
  385. };
  386. RandomHorizontalFlip::RandomHorizontalFlip(float prob) : data_(std::make_shared<Data>(prob)) {}
  387. std::shared_ptr<TensorOperation> RandomHorizontalFlip::Parse() {
  388. return std::make_shared<RandomHorizontalFlipOperation>(data_->probability_);
  389. }
  390. // RandomHorizontalFlipWithBBox
  391. struct RandomHorizontalFlipWithBBox::Data {
  392. explicit Data(float prob) : probability_(prob) {}
  393. float probability_;
  394. };
  395. RandomHorizontalFlipWithBBox::RandomHorizontalFlipWithBBox(float prob) : data_(std::make_shared<Data>(prob)) {}
  396. std::shared_ptr<TensorOperation> RandomHorizontalFlipWithBBox::Parse() {
  397. return std::make_shared<RandomHorizontalFlipWithBBoxOperation>(data_->probability_);
  398. }
  399. // RandomPosterize Transform Operation.
  400. struct RandomPosterize::Data {
  401. explicit Data(const std::vector<uint8_t> &bit_range) : bit_range_(bit_range) {}
  402. std::vector<uint8_t> bit_range_;
  403. };
  404. RandomPosterize::RandomPosterize(const std::vector<uint8_t> &bit_range) : data_(std::make_shared<Data>(bit_range)) {}
  405. std::shared_ptr<TensorOperation> RandomPosterize::Parse() {
  406. return std::make_shared<RandomPosterizeOperation>(data_->bit_range_);
  407. }
  408. // RandomResize Transform Operation.
  409. struct RandomResize::Data {
  410. explicit Data(const std::vector<int32_t> &size) : size_(size) {}
  411. std::vector<int32_t> size_;
  412. };
  413. RandomResize::RandomResize(std::vector<int32_t> size) : data_(std::make_shared<Data>(size)) {}
  414. std::shared_ptr<TensorOperation> RandomResize::Parse() { return std::make_shared<RandomResizeOperation>(data_->size_); }
  415. // RandomResizeWithBBox Transform Operation.
  416. struct RandomResizeWithBBox::Data {
  417. explicit Data(const std::vector<int32_t> &size) : size_(size) {}
  418. std::vector<int32_t> size_;
  419. };
  420. RandomResizeWithBBox::RandomResizeWithBBox(std::vector<int32_t> size) : data_(std::make_shared<Data>(size)) {}
  421. std::shared_ptr<TensorOperation> RandomResizeWithBBox::Parse() {
  422. return std::make_shared<RandomResizeWithBBoxOperation>(data_->size_);
  423. }
  424. // RandomResizedCrop Transform Operation.
  425. struct RandomResizedCrop::Data {
  426. Data(const std::vector<int32_t> &size, const std::vector<float> &scale, const std::vector<float> &ratio,
  427. InterpolationMode interpolation, int32_t max_attempts)
  428. : size_(size), scale_(scale), ratio_(ratio), interpolation_(interpolation), max_attempts_(max_attempts) {}
  429. std::vector<int32_t> size_;
  430. std::vector<float> scale_;
  431. std::vector<float> ratio_;
  432. InterpolationMode interpolation_;
  433. int32_t max_attempts_;
  434. };
  435. RandomResizedCrop::RandomResizedCrop(std::vector<int32_t> size, std::vector<float> scale, std::vector<float> ratio,
  436. InterpolationMode interpolation, int32_t max_attempts)
  437. : data_(std::make_shared<Data>(size, scale, ratio, interpolation, max_attempts)) {}
  438. std::shared_ptr<TensorOperation> RandomResizedCrop::Parse() {
  439. return std::make_shared<RandomResizedCropOperation>(data_->size_, data_->scale_, data_->ratio_, data_->interpolation_,
  440. data_->max_attempts_);
  441. }
  442. // RandomResizedCrop Transform Operation.
  443. struct RandomResizedCropWithBBox::Data {
  444. Data(const std::vector<int32_t> &size, const std::vector<float> &scale, const std::vector<float> &ratio,
  445. InterpolationMode interpolation, int32_t max_attempts)
  446. : size_(size), scale_(scale), ratio_(ratio), interpolation_(interpolation), max_attempts_(max_attempts) {}
  447. std::vector<int32_t> size_;
  448. std::vector<float> scale_;
  449. std::vector<float> ratio_;
  450. InterpolationMode interpolation_;
  451. int32_t max_attempts_;
  452. };
  453. RandomResizedCropWithBBox::RandomResizedCropWithBBox(std::vector<int32_t> size, std::vector<float> scale,
  454. std::vector<float> ratio, InterpolationMode interpolation,
  455. int32_t max_attempts)
  456. : data_(std::make_shared<Data>(size, scale, ratio, interpolation, max_attempts)) {}
  457. std::shared_ptr<TensorOperation> RandomResizedCropWithBBox::Parse() {
  458. return std::make_shared<RandomResizedCropWithBBoxOperation>(data_->size_, data_->scale_, data_->ratio_,
  459. data_->interpolation_, data_->max_attempts_);
  460. }
  461. // RandomRotation Transform Operation.
  462. struct RandomRotation::Data {
  463. Data(const std::vector<float> &degrees, InterpolationMode interpolation_mode, bool expand,
  464. const std::vector<float> &center, const std::vector<uint8_t> &fill_value)
  465. : degrees_(degrees),
  466. interpolation_mode_(interpolation_mode),
  467. expand_(expand),
  468. center_(center),
  469. fill_value_(fill_value) {}
  470. std::vector<float> degrees_;
  471. InterpolationMode interpolation_mode_;
  472. std::vector<float> center_;
  473. bool expand_;
  474. std::vector<uint8_t> fill_value_;
  475. };
  476. RandomRotation::RandomRotation(std::vector<float> degrees, InterpolationMode interpolation_mode, bool expand,
  477. std::vector<float> center, std::vector<uint8_t> fill_value)
  478. : data_(std::make_shared<Data>(degrees, interpolation_mode, expand, center, fill_value)) {}
  479. std::shared_ptr<TensorOperation> RandomRotation::Parse() {
  480. return std::make_shared<RandomRotationOperation>(data_->degrees_, data_->interpolation_mode_, data_->expand_,
  481. data_->center_, data_->fill_value_);
  482. }
  483. // RandomSelectSubpolicy Transform Operation.
  484. struct RandomSelectSubpolicy::Data {
  485. std::vector<std::vector<std::pair<std::shared_ptr<TensorOperation>, double>>> policy_;
  486. };
  487. RandomSelectSubpolicy::RandomSelectSubpolicy(std::vector<std::vector<std::pair<TensorTransform *, double>>> policy)
  488. : data_(std::make_shared<Data>()) {
  489. for (int32_t i = 0; i < policy.size(); i++) {
  490. std::vector<std::pair<std::shared_ptr<TensorOperation>, double>> subpolicy;
  491. for (int32_t j = 0; j < policy[i].size(); j++) {
  492. TensorTransform *op = policy[i][j].first;
  493. std::shared_ptr<TensorOperation> operation = (op ? op->Parse() : nullptr);
  494. double prob = policy[i][j].second;
  495. subpolicy.emplace_back(std::move(std::make_pair(operation, prob)));
  496. }
  497. data_->policy_.emplace_back(subpolicy);
  498. }
  499. }
  500. RandomSelectSubpolicy::RandomSelectSubpolicy(
  501. std::vector<std::vector<std::pair<std::shared_ptr<TensorTransform>, double>>> policy)
  502. : data_(std::make_shared<Data>()) {
  503. for (int32_t i = 0; i < policy.size(); i++) {
  504. std::vector<std::pair<std::shared_ptr<TensorOperation>, double>> subpolicy;
  505. for (int32_t j = 0; j < policy[i].size(); j++) {
  506. std::shared_ptr<TensorTransform> op = policy[i][j].first;
  507. std::shared_ptr<TensorOperation> operation = (op ? op->Parse() : nullptr);
  508. double prob = policy[i][j].second;
  509. subpolicy.emplace_back(std::move(std::make_pair(operation, prob)));
  510. }
  511. data_->policy_.emplace_back(subpolicy);
  512. }
  513. }
  514. RandomSelectSubpolicy::RandomSelectSubpolicy(
  515. std::vector<std::vector<std::pair<std::reference_wrapper<TensorTransform>, double>>> policy)
  516. : data_(std::make_shared<Data>()) {
  517. for (int32_t i = 0; i < policy.size(); i++) {
  518. std::vector<std::pair<std::shared_ptr<TensorOperation>, double>> subpolicy;
  519. for (int32_t j = 0; j < policy[i].size(); j++) {
  520. TensorTransform &op = policy[i][j].first;
  521. std::shared_ptr<TensorOperation> operation = op.Parse();
  522. double prob = policy[i][j].second;
  523. subpolicy.emplace_back(std::move(std::make_pair(operation, prob)));
  524. }
  525. data_->policy_.emplace_back(subpolicy);
  526. }
  527. }
  528. std::shared_ptr<TensorOperation> RandomSelectSubpolicy::Parse() {
  529. return std::make_shared<RandomSelectSubpolicyOperation>(data_->policy_);
  530. }
  531. // RandomSharpness Transform Operation.
  532. struct RandomSharpness::Data {
  533. explicit Data(const std::vector<float> &degrees) : degrees_(degrees) {}
  534. std::vector<float> degrees_;
  535. };
  536. RandomSharpness::RandomSharpness(std::vector<float> degrees) : data_(std::make_shared<Data>(degrees)) {}
  537. std::shared_ptr<TensorOperation> RandomSharpness::Parse() {
  538. return std::make_shared<RandomSharpnessOperation>(data_->degrees_);
  539. }
  540. // RandomSolarize Transform Operation.
  541. struct RandomSolarize::Data {
  542. explicit Data(const std::vector<uint8_t> &threshold) : threshold_(threshold) {}
  543. std::vector<uint8_t> threshold_;
  544. };
  545. RandomSolarize::RandomSolarize(std::vector<uint8_t> threshold) : data_(std::make_shared<Data>(threshold)) {}
  546. std::shared_ptr<TensorOperation> RandomSolarize::Parse() {
  547. return std::make_shared<RandomSolarizeOperation>(data_->threshold_);
  548. }
  549. // RandomVerticalFlip Transform Operation.
  550. struct RandomVerticalFlip::Data {
  551. explicit Data(float prob) : probability_(prob) {}
  552. float probability_;
  553. };
  554. RandomVerticalFlip::RandomVerticalFlip(float prob) : data_(std::make_shared<Data>(prob)) {}
  555. std::shared_ptr<TensorOperation> RandomVerticalFlip::Parse() {
  556. return std::make_shared<RandomVerticalFlipOperation>(data_->probability_);
  557. }
  558. // RandomVerticalFlipWithBBox Transform Operation.
  559. struct RandomVerticalFlipWithBBox::Data {
  560. explicit Data(float prob) : probability_(prob) {}
  561. float probability_;
  562. };
  563. RandomVerticalFlipWithBBox::RandomVerticalFlipWithBBox(float prob) : data_(std::make_shared<Data>(prob)) {}
  564. std::shared_ptr<TensorOperation> RandomVerticalFlipWithBBox::Parse() {
  565. return std::make_shared<RandomVerticalFlipWithBBoxOperation>(data_->probability_);
  566. }
  567. // Rescale Transform Operation.
  568. struct Rescale::Data {
  569. Data(float rescale, float shift) : rescale_(rescale), shift_(shift) {}
  570. float rescale_;
  571. float shift_;
  572. };
  573. Rescale::Rescale(float rescale, float shift) : data_(std::make_shared<Data>(rescale, shift)) {}
  574. std::shared_ptr<TensorOperation> Rescale::Parse() {
  575. return std::make_shared<RescaleOperation>(data_->rescale_, data_->shift_);
  576. }
  577. #endif // not ENABLE_ANDROID
  578. // Resize Transform Operation.
  579. struct Resize::Data {
  580. Data(const std::vector<int32_t> &size, InterpolationMode interpolation)
  581. : size_(size), interpolation_(interpolation) {}
  582. std::vector<int32_t> size_;
  583. InterpolationMode interpolation_;
  584. };
  585. Resize::Resize(std::vector<int32_t> size, InterpolationMode interpolation)
  586. : data_(std::make_shared<Data>(size, interpolation)) {}
  587. std::shared_ptr<TensorOperation> Resize::Parse() {
  588. return std::make_shared<ResizeOperation>(data_->size_, data_->interpolation_);
  589. }
  590. std::shared_ptr<TensorOperation> Resize::Parse(const MapTargetDevice &env) {
  591. if (env == MapTargetDevice::kAscend310) {
  592. #ifdef ENABLE_ACL
  593. std::vector<uint32_t> usize_;
  594. usize_.reserve(data_->size_.size());
  595. std::transform(data_->size_.begin(), data_->size_.end(), std::back_inserter(usize_),
  596. [](int32_t i) { return (uint32_t)i; });
  597. return std::make_shared<DvppResizeJpegOperation>(usize_);
  598. #endif // ENABLE_ACL
  599. }
  600. return std::make_shared<ResizeOperation>(data_->size_, data_->interpolation_);
  601. }
  602. #ifdef ENABLE_ANDROID
  603. // Rotate Transform Operation.
  604. Rotate::Rotate() {}
  605. std::shared_ptr<TensorOperation> Rotate::Parse() { return std::make_shared<RotateOperation>(); }
  606. #endif // ENABLE_ANDROID
  607. #ifndef ENABLE_ANDROID
  608. // ResizeWithBBox Transform Operation.
  609. struct ResizeWithBBox::Data {
  610. Data(const std::vector<int32_t> &size, InterpolationMode interpolation)
  611. : size_(size), interpolation_(interpolation) {}
  612. std::vector<int32_t> size_;
  613. InterpolationMode interpolation_;
  614. };
  615. ResizeWithBBox::ResizeWithBBox(std::vector<int32_t> size, InterpolationMode interpolation)
  616. : data_(std::make_shared<Data>(size, interpolation)) {}
  617. std::shared_ptr<TensorOperation> ResizeWithBBox::Parse() {
  618. return std::make_shared<ResizeWithBBoxOperation>(data_->size_, data_->interpolation_);
  619. }
  620. // RgbaToBgr Transform Operation.
  621. RGBA2BGR::RGBA2BGR() {}
  622. std::shared_ptr<TensorOperation> RGBA2BGR::Parse() { return std::make_shared<RgbaToBgrOperation>(); }
  623. // RgbaToRgb Transform Operation.
  624. RGBA2RGB::RGBA2RGB() {}
  625. std::shared_ptr<TensorOperation> RGBA2RGB::Parse() { return std::make_shared<RgbaToRgbOperation>(); }
  626. // SoftDvppDecodeRandomCropResizeJpeg Transform Operation.
  627. struct SoftDvppDecodeRandomCropResizeJpeg::Data {
  628. Data(const std::vector<int32_t> &size, const std::vector<float> &scale, const std::vector<float> &ratio,
  629. int32_t max_attempts)
  630. : size_(size), scale_(scale), ratio_(ratio), max_attempts_(max_attempts) {}
  631. std::vector<int32_t> size_;
  632. std::vector<float> scale_;
  633. std::vector<float> ratio_;
  634. int32_t max_attempts_;
  635. };
  636. SoftDvppDecodeRandomCropResizeJpeg::SoftDvppDecodeRandomCropResizeJpeg(std::vector<int32_t> size,
  637. std::vector<float> scale,
  638. std::vector<float> ratio, int32_t max_attempts)
  639. : data_(std::make_shared<Data>(size, scale, ratio, max_attempts)) {}
  640. std::shared_ptr<TensorOperation> SoftDvppDecodeRandomCropResizeJpeg::Parse() {
  641. return std::make_shared<SoftDvppDecodeRandomCropResizeJpegOperation>(data_->size_, data_->scale_, data_->ratio_,
  642. data_->max_attempts_);
  643. }
  644. // SoftDvppDecodeResizeJpeg Transform Operation.
  645. struct SoftDvppDecodeResizeJpeg::Data {
  646. explicit Data(const std::vector<int32_t> &size) : size_(size) {}
  647. std::vector<int32_t> size_;
  648. };
  649. SoftDvppDecodeResizeJpeg::SoftDvppDecodeResizeJpeg(std::vector<int32_t> size) : data_(std::make_shared<Data>(size)) {}
  650. std::shared_ptr<TensorOperation> SoftDvppDecodeResizeJpeg::Parse() {
  651. return std::make_shared<SoftDvppDecodeResizeJpegOperation>(data_->size_);
  652. }
  653. // SwapRedBlue Transform Operation.
  654. SwapRedBlue::SwapRedBlue() {}
  655. std::shared_ptr<TensorOperation> SwapRedBlue::Parse() { return std::make_shared<SwapRedBlueOperation>(); }
  656. // UniformAug Transform Operation.
  657. struct UniformAugment::Data {
  658. std::vector<std::shared_ptr<TensorOperation>> transforms_;
  659. int32_t num_ops_;
  660. };
  661. UniformAugment::UniformAugment(const std::vector<TensorTransform *> &transforms, int32_t num_ops)
  662. : data_(std::make_shared<Data>()) {
  663. (void)std::transform(
  664. transforms.begin(), transforms.end(), std::back_inserter(data_->transforms_),
  665. [](TensorTransform *op) -> std::shared_ptr<TensorOperation> { return op ? op->Parse() : nullptr; });
  666. data_->num_ops_ = num_ops;
  667. }
  668. UniformAugment::UniformAugment(const std::vector<std::shared_ptr<TensorTransform>> &transforms, int32_t num_ops)
  669. : data_(std::make_shared<Data>()) {
  670. (void)std::transform(
  671. transforms.begin(), transforms.end(), std::back_inserter(data_->transforms_),
  672. [](std::shared_ptr<TensorTransform> op) -> std::shared_ptr<TensorOperation> { return op ? op->Parse() : nullptr; });
  673. data_->num_ops_ = num_ops;
  674. }
  675. UniformAugment::UniformAugment(const std::vector<std::reference_wrapper<TensorTransform>> &transforms, int32_t num_ops)
  676. : data_(std::make_shared<Data>()) {
  677. (void)std::transform(transforms.begin(), transforms.end(), std::back_inserter(data_->transforms_),
  678. [](TensorTransform &op) -> std::shared_ptr<TensorOperation> { return op.Parse(); });
  679. data_->num_ops_ = num_ops;
  680. }
  681. std::shared_ptr<TensorOperation> UniformAugment::Parse() {
  682. return std::make_shared<UniformAugOperation>(data_->transforms_, data_->num_ops_);
  683. }
  684. #endif // not ENABLE_ANDROID
  685. } // namespace vision
  686. } // namespace dataset
  687. } // namespace mindspore