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

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