| @@ -631,13 +631,9 @@ std::shared_ptr<TensorOperation> RandomResizedCropWithBBox::Parse() { | |||
| // RandomRotation Transform Operation. | |||
| struct RandomRotation::Data { | |||
| Data(const std::vector<float> °rees, InterpolationMode interpolation_mode, bool expand, | |||
| const std::vector<float> ¢er, const std::vector<uint8_t> &fill_value) | |||
| : degrees_(degrees), | |||
| interpolation_mode_(interpolation_mode), | |||
| expand_(expand), | |||
| center_(center), | |||
| fill_value_(fill_value) {} | |||
| Data(const std::vector<float> °rees, InterpolationMode resample, bool expand, const std::vector<float> ¢er, | |||
| const std::vector<uint8_t> &fill_value) | |||
| : degrees_(degrees), interpolation_mode_(resample), expand_(expand), center_(center), fill_value_(fill_value) {} | |||
| std::vector<float> degrees_; | |||
| InterpolationMode interpolation_mode_; | |||
| std::vector<float> center_; | |||
| @@ -645,9 +641,9 @@ struct RandomRotation::Data { | |||
| std::vector<uint8_t> fill_value_; | |||
| }; | |||
| RandomRotation::RandomRotation(std::vector<float> degrees, InterpolationMode interpolation_mode, bool expand, | |||
| RandomRotation::RandomRotation(std::vector<float> degrees, InterpolationMode resample, bool expand, | |||
| std::vector<float> center, std::vector<uint8_t> fill_value) | |||
| : data_(std::make_shared<Data>(degrees, interpolation_mode, expand, center, fill_value)) {} | |||
| : data_(std::make_shared<Data>(degrees, resample, expand, center, fill_value)) {} | |||
| std::shared_ptr<TensorOperation> RandomRotation::Parse() { | |||
| return std::make_shared<RandomRotationOperation>(data_->degrees_, data_->interpolation_mode_, data_->expand_, | |||
| @@ -448,6 +448,13 @@ void Tensor::Print(std::ostream &out) const { | |||
| out << "[Data area is null]"; | |||
| } | |||
| } | |||
| void Tensor::Print_data(std::ostream &out) const { | |||
| if (data_) { | |||
| PrintRecursive(out, 0, std::vector<dsize_t>{}); | |||
| } | |||
| } | |||
| Status Tensor::AllocateBuffer(const dsize_t &length) { | |||
| RETURN_UNEXPECTED_IF_NULL(data_allocator_); | |||
| if (data_ == nullptr) { | |||
| @@ -620,6 +627,17 @@ Status Tensor::GetBufferInfo(Tensor *t, py::buffer_info *out) { | |||
| } | |||
| #endif | |||
| Status Tensor::to_json(nlohmann::json *out_json) { | |||
| nlohmann::json args; | |||
| args["shape"] = shape_.ToString(); | |||
| args["type"] = type_.ToString(); | |||
| std::stringstream ss; | |||
| this->Print_data(ss); | |||
| args["data"] = ss.str(); | |||
| *out_json = args; | |||
| return Status::OK(); | |||
| } | |||
| template <typename T> | |||
| Status Tensor::GetItemAt(T *o, const std::vector<dsize_t> &index) const { | |||
| if (data_ == nullptr) { | |||
| @@ -217,6 +217,8 @@ class Tensor { | |||
| bool operator!=(const Tensor &rhs) const { return !((*this) == rhs); } | |||
| Status to_json(nlohmann::json *out_json); | |||
| /// Get item located at `index`, caller needs to provide the type. | |||
| /// \tparam T | |||
| /// \param[in] index vector<dsize_t> | |||
| @@ -661,6 +663,10 @@ class Tensor { | |||
| /// \param[out] out output stream | |||
| void Print(std::ostream &out) const; | |||
| /// A function that prints info about the tensor | |||
| /// \param[out] out output stream | |||
| void Print_data(std::ostream &out) const; | |||
| /// A function that print the value as specified by its index | |||
| /// \param[in] index vector representing the index | |||
| /// \param[out] out | |||
| @@ -35,7 +35,7 @@ ConcatOp::Builder::Builder() { | |||
| // The builder "build" method creates the final object. | |||
| Status ConcatOp::Builder::Build(std::shared_ptr<ConcatOp> *ptr) { | |||
| if (builder_sampler_ == nullptr) { | |||
| builder_sampler_ = std::make_shared<DistributedSamplerRT>(0, 1, 0, false); | |||
| builder_sampler_ = std::make_shared<DistributedSamplerRT>(1, 0, false, 0); | |||
| } | |||
| *ptr = std::make_shared<ConcatOp>(builder_sampler_, children_flag_and_nums_, children_start_end_index_); | |||
| return Status::OK(); | |||
| @@ -23,13 +23,13 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| DistributedSamplerRT::DistributedSamplerRT(int64_t num_samples, int64_t num_dev, int64_t dev_id, bool shuffle, | |||
| DistributedSamplerRT::DistributedSamplerRT(int64_t num_shards, int64_t shard_id, bool shuffle, int64_t num_samples, | |||
| uint32_t seed, int64_t offset, bool even_dist) | |||
| : SamplerRT(num_samples, std::numeric_limits<int64_t>::max()), | |||
| cnt_(0), | |||
| seed_(seed == std::numeric_limits<uint32_t>::max() ? GetSeed() : seed), | |||
| device_id_(dev_id), | |||
| num_devices_(num_dev), | |||
| device_id_(shard_id), | |||
| num_devices_(num_shards), | |||
| shuffle_(shuffle), | |||
| even_dist_(even_dist), | |||
| offset_(offset), | |||
| @@ -28,10 +28,10 @@ namespace dataset { | |||
| class DistributedSamplerRT : public SamplerRT { | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] num_samples The total number of rows in the dataset | |||
| /// \param[in] num_dev Total number of shards for the distributed sampler | |||
| /// \param[in] dev_id Device id of the shard | |||
| /// \param[in] num_shards Total number of shards for the distributed sampler | |||
| /// \param[in] shard_id Device id of the shard | |||
| /// \param[in] shuffle Option to shuffle | |||
| /// \param[in] num_samples The total number of rows in the dataset | |||
| /// \param seed Seed parameter to shuffle, default to max unsigned int (different seed in sampler will | |||
| /// result in different samples being picked | |||
| /// \param[in] offset The starting device id where the elements in the dataset are send to, which should be no more | |||
| @@ -40,7 +40,7 @@ class DistributedSamplerRT : public SamplerRT { | |||
| /// This option is not exposed in the python API. Current behavior is that the remainder will always | |||
| /// be handled by the first n shards, n being the corresponding device id. Please notice that when offset is set, | |||
| /// even_dist will be forcibly converted to false for sending rest datasets in concatdataset scenario. | |||
| DistributedSamplerRT(int64_t num_samples, int64_t num_dev, int64_t dev_id, bool shuffle, | |||
| DistributedSamplerRT(int64_t num_shards, int64_t shard_id, bool shuffle, int64_t num_samples, | |||
| uint32_t seed = std::numeric_limits<uint32_t>::max(), int64_t offset = -1, | |||
| bool even_dist = true); | |||
| @@ -20,12 +20,12 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| PKSamplerRT::PKSamplerRT(int64_t num_samples, int64_t val, bool shuffle, int64_t samples_per_tensor) | |||
| PKSamplerRT::PKSamplerRT(int64_t num_val, bool shuffle, int64_t num_samples, int64_t samples_per_tensor) | |||
| : SamplerRT(num_samples, samples_per_tensor), | |||
| shuffle_(shuffle), | |||
| seed_(GetSeed()), | |||
| next_id_(0), | |||
| samples_per_class_(val) {} | |||
| samples_per_class_(num_val) {} | |||
| Status PKSamplerRT::InitSampler() { | |||
| if (is_initialized) { | |||
| @@ -28,11 +28,11 @@ namespace mindspore { | |||
| namespace dataset { | |||
| class PKSamplerRT : public SamplerRT { // NOT YET FINISHED | |||
| public: | |||
| // @param num_samples - the number of samples to draw. value of 0 means to take the full amount | |||
| // @param int64_t val | |||
| // @param int64_t num_val | |||
| // @param bool shuffle - shuffle all classIds or not, if true, classes may be 5,1,4,3,2 | |||
| // @param num_samples - the number of samples to draw. value of 0 means to take the full amount | |||
| // @param int64_t samples_per_tensor - Num of Sampler Ids to fetch via 1 GetNextSample call | |||
| PKSamplerRT(int64_t num_samples, int64_t val, bool shuffle, | |||
| PKSamplerRT(int64_t num_val, bool shuffle, int64_t num_samples, | |||
| int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| // default destructor | |||
| @@ -22,7 +22,7 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| RandomSamplerRT::RandomSamplerRT(int64_t num_samples, bool replacement, bool reshuffle_each_epoch, | |||
| RandomSamplerRT::RandomSamplerRT(bool replacement, int64_t num_samples, bool reshuffle_each_epoch, | |||
| int64_t samples_per_tensor) | |||
| : SamplerRT(num_samples, samples_per_tensor), | |||
| seed_(GetSeed()), | |||
| @@ -27,11 +27,11 @@ namespace dataset { | |||
| class RandomSamplerRT : public SamplerRT { | |||
| public: | |||
| // Constructor | |||
| // @param int64_t num_samples - number samples to draw | |||
| // @param bool replacement - put he id back / or not after a sample | |||
| // @param int64_t num_samples - number samples to draw | |||
| // @param reshuffle_each_epoch - T/F to reshuffle after epoch | |||
| // @param int64_t samples_per_tensor - Num of Sampler Ids to fetch via 1 GetNextSample call | |||
| RandomSamplerRT(int64_t num_samples, bool replacement, bool reshuffle_each_epoch, | |||
| RandomSamplerRT(bool replacement, int64_t num_samples, bool reshuffle_each_epoch, | |||
| int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| // Destructor. | |||
| @@ -21,7 +21,7 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| SequentialSamplerRT::SequentialSamplerRT(int64_t num_samples, int64_t start_index, int64_t samples_per_tensor) | |||
| SequentialSamplerRT::SequentialSamplerRT(int64_t start_index, int64_t num_samples, int64_t samples_per_tensor) | |||
| : SamplerRT(num_samples, samples_per_tensor), current_id_(start_index), start_index_(start_index), id_count_(0) {} | |||
| Status SequentialSamplerRT::GetNextSample(TensorRow *out) { | |||
| @@ -26,11 +26,11 @@ namespace dataset { | |||
| class SequentialSamplerRT : public SamplerRT { | |||
| public: | |||
| // Constructor | |||
| // @param start_index - The starting index value | |||
| // @param num_samples - The number of samples to draw. A value of 0 indicates the sampler should produce the | |||
| // full amount of ids from the dataset | |||
| // @param start_index - The starting index value | |||
| // @param int64_t samples_per_tensor - Num of Sampler Ids to fetch via 1 GetNextSample call | |||
| SequentialSamplerRT(int64_t num_samples, int64_t start_index, | |||
| SequentialSamplerRT(int64_t start_index, int64_t num_samples, | |||
| int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| // Destructor. | |||
| @@ -25,9 +25,9 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Constructor. | |||
| SubsetRandomSamplerRT::SubsetRandomSamplerRT(int64_t num_samples, const std::vector<int64_t> &indices, | |||
| SubsetRandomSamplerRT::SubsetRandomSamplerRT(const std::vector<int64_t> &indices, int64_t num_samples, | |||
| int64_t samples_per_tensor) | |||
| : SubsetSamplerRT(num_samples, indices, samples_per_tensor) {} | |||
| : SubsetSamplerRT(indices, num_samples, samples_per_tensor) {} | |||
| // Initialized this Sampler. | |||
| Status SubsetRandomSamplerRT::InitSampler() { | |||
| @@ -29,11 +29,11 @@ namespace dataset { | |||
| class SubsetRandomSamplerRT : public SubsetSamplerRT { | |||
| public: | |||
| /// Constructor. | |||
| /// \param num_samples The number of samples to draw. 0 for the full amount. | |||
| /// \param indices List of indices from where we will randomly draw samples. | |||
| /// \param num_samples The number of samples to draw. 0 for the full amount. | |||
| /// \param samples_per_tensor The number of ids we draw on each call to GetNextSample(). | |||
| /// When samples_per_tensor=0, GetNextSample() will draw all the sample ids and return them at once. | |||
| SubsetRandomSamplerRT(int64_t num_samples, const std::vector<int64_t> &indices, | |||
| SubsetRandomSamplerRT(const std::vector<int64_t> &indices, int64_t num_samples, | |||
| std::int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| /// Destructor. | |||
| @@ -22,7 +22,7 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Constructor. | |||
| SubsetSamplerRT::SubsetSamplerRT(int64_t num_samples, const std::vector<int64_t> &indices, int64_t samples_per_tensor) | |||
| SubsetSamplerRT::SubsetSamplerRT(const std::vector<int64_t> &indices, int64_t num_samples, int64_t samples_per_tensor) | |||
| : SamplerRT(num_samples, samples_per_tensor), indices_(indices), sample_id_(0) {} | |||
| // Initialized this Sampler. | |||
| @@ -28,11 +28,11 @@ namespace dataset { | |||
| class SubsetSamplerRT : public SamplerRT { | |||
| public: | |||
| /// Constructor. | |||
| /// \param num_samples The number of elements to sample. 0 for the full amount. | |||
| /// \param indices List of indices. | |||
| /// \param num_samples The number of elements to sample. 0 for the full amount. | |||
| /// \param samples_per_tensor The number of ids we draw on each call to GetNextSample(). | |||
| /// When samples_per_tensor=0, GetNextSample() will draw all the sample ids and return them at once. | |||
| SubsetSamplerRT(int64_t num_samples, const std::vector<int64_t> &indices, | |||
| SubsetSamplerRT(const std::vector<int64_t> &indices, int64_t num_samples, | |||
| std::int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| /// Destructor. | |||
| @@ -27,7 +27,7 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Constructor. | |||
| WeightedRandomSamplerRT::WeightedRandomSamplerRT(int64_t num_samples, const std::vector<double> &weights, | |||
| WeightedRandomSamplerRT::WeightedRandomSamplerRT(const std::vector<double> &weights, int64_t num_samples, | |||
| bool replacement, int64_t samples_per_tensor) | |||
| : SamplerRT(num_samples, samples_per_tensor), weights_(weights), replacement_(replacement), sample_id_(0) {} | |||
| @@ -29,12 +29,12 @@ namespace dataset { | |||
| class WeightedRandomSamplerRT : public SamplerRT { | |||
| public: | |||
| // Constructor. | |||
| // @param num_samples Number of samples to be drawn. | |||
| // @param weights A lift of sample weights. | |||
| // @param num_samples Number of samples to be drawn. | |||
| // @param replacement Determine if samples are drawn with/without replacement. | |||
| // @param samples_per_tensor The number of ids we draw on each call to GetNextSample(). | |||
| // When samples_per_tensor=0, GetNextSample() will draw all the sample ids and return them at once. | |||
| WeightedRandomSamplerRT(int64_t num_samples, const std::vector<double> &weights, bool replacement, | |||
| WeightedRandomSamplerRT(const std::vector<double> &weights, int64_t num_samples, bool replacement, | |||
| int64_t samples_per_tensor = std::numeric_limits<int64_t>::max()); | |||
| // Destructor. | |||
| @@ -77,7 +77,7 @@ Status DistributedSamplerObj::ValidateParams() { | |||
| Status DistributedSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::DistributedSamplerRT>(num_samples_, num_shards_, shard_id_, shuffle_, seed_, | |||
| *sampler = std::make_shared<dataset::DistributedSamplerRT>(num_shards_, shard_id_, shuffle_, num_samples_, seed_, | |||
| offset_, even_dist_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| @@ -71,7 +71,7 @@ Status PKSamplerObj::to_json(nlohmann::json *const out_json) { | |||
| Status PKSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::PKSamplerRT>(num_samples_, num_val_, shuffle_); | |||
| *sampler = std::make_shared<dataset::PKSamplerRT>(num_val_, shuffle_, num_samples_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -67,7 +67,7 @@ Status RandomSamplerObj::to_json(nlohmann::json *const out_json) { | |||
| Status RandomSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::RandomSamplerRT>(num_samples_, replacement_, reshuffle_each_epoch_); | |||
| *sampler = std::make_shared<dataset::RandomSamplerRT>(replacement_, num_samples_, reshuffle_each_epoch_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -72,7 +72,7 @@ Status SequentialSamplerObj::to_json(nlohmann::json *const out_json) { | |||
| Status SequentialSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::SequentialSamplerRT>(num_samples_, start_index_); | |||
| *sampler = std::make_shared<dataset::SequentialSamplerRT>(start_index_, num_samples_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -40,7 +40,7 @@ SubsetRandomSamplerObj::~SubsetRandomSamplerObj() = default; | |||
| Status SubsetRandomSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::SubsetRandomSamplerRT>(num_samples_, indices_); | |||
| *sampler = std::make_shared<dataset::SubsetRandomSamplerRT>(indices_, num_samples_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -49,7 +49,7 @@ Status SubsetSamplerObj::ValidateParams() { | |||
| Status SubsetSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| // runtime sampler object | |||
| *sampler = std::make_shared<dataset::SubsetSamplerRT>(num_samples_, indices_); | |||
| *sampler = std::make_shared<dataset::SubsetSamplerRT>(indices_, num_samples_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -73,7 +73,7 @@ Status WeightedRandomSamplerObj::to_json(nlohmann::json *const out_json) { | |||
| } | |||
| Status WeightedRandomSamplerObj::SamplerBuild(std::shared_ptr<SamplerRT> *sampler) { | |||
| *sampler = std::make_shared<dataset::WeightedRandomSamplerRT>(num_samples_, weights_, replacement_); | |||
| *sampler = std::make_shared<dataset::WeightedRandomSamplerRT>(weights_, num_samples_, replacement_); | |||
| Status s = BuildChildren(sampler); | |||
| sampler = s.IsOk() ? sampler : nullptr; | |||
| return s; | |||
| @@ -0,0 +1,27 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_AUDIO_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_AUDIO_H_ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| namespace audio {} // namespace audio | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_AUDIO_H_ | |||
| @@ -0,0 +1,86 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONFIG_H | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONFIG_H | |||
| #include <cstdint> | |||
| #include <string> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Config operations for setting and getting the configuration. | |||
| namespace config { | |||
| /// \brief Function to set the seed to be used in any random generator. This is used to produce deterministic results. | |||
| /// \param[in] seed the default seed to use. | |||
| bool set_seed(int32_t seed); | |||
| /// \brief Function to get the seed. | |||
| /// \return the seed set in the configuration. | |||
| uint32_t get_seed(); | |||
| /// \brief Function to set the number of rows to be prefetched. | |||
| /// \param[in] prefetch_size total number of rows to be prefetched. | |||
| bool set_prefetch_size(int32_t prefetch_size); | |||
| /// \brief Function to get the prefetch size in number of rows. | |||
| /// \return total number of rows to be prefetched. | |||
| int32_t get_prefetch_size(); | |||
| /// \brief Function to set the default number of parallel workers. | |||
| /// \param[in] num_parallel_workers number of parallel workers to be used as a default for each operation. | |||
| bool set_num_parallel_workers(int32_t num_parallel_workers); | |||
| /// \brief Function to get the default number of parallel workers. | |||
| /// \return number of parallel workers to be used as a default for each operation. | |||
| int32_t get_num_parallel_workers(); | |||
| /// \brief Function to set the default interval (in milliseconds) for monitor sampling. | |||
| /// \param[in] interval interval (in milliseconds) to be used for performance monitor sampling. | |||
| bool set_monitor_sampling_interval(int32_t interval); | |||
| /// \brief Function to get the default interval of performance monitor sampling. | |||
| /// \return interval (in milliseconds) for performance monitor sampling. | |||
| int32_t get_monitor_sampling_interval(); | |||
| /// \brief Function to set the default timeout (in seconds) for DSWaitedCallback. In case of a deadlock, the wait | |||
| /// function will exit after the timeout period. | |||
| /// \param[in] timeout timeout (in seconds) to be used to end the wait in DSWaitedCallback in case of a deadlock. | |||
| bool set_callback_timeout(int32_t timeout); | |||
| /// \brief Function to get the default timeout for DSWaitedCallback. In case of a deadback, the wait function will exit | |||
| /// after the timeout period. | |||
| /// \return the duration in seconds. | |||
| int32_t get_callback_timeout(); | |||
| /// \brief Function to load configuration from a file. | |||
| /// \param[in] file path of the configuration file to be loaded. | |||
| /// \note This API exists because std::string will constrained by ABI compile option while char don't. | |||
| bool load(const std::vector<char> &file); | |||
| /// \brief Function to load configuration from a file. | |||
| /// \param[in] file path of the configuration file to be loaded. | |||
| inline bool load(std::string file) { return load(StringToChar(file)); } | |||
| } // namespace config | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONFIG_H | |||
| @@ -0,0 +1,123 @@ | |||
| /** | |||
| * Copyright 2019-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONSTANTS_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONSTANTS_H_ | |||
| #include <cstdint> | |||
| #include <limits> | |||
| #include <random> | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Various type defines for convenience | |||
| using uchar = unsigned char; | |||
| using dsize_t = int64_t; | |||
| /// \brief Target devices to perform map operation | |||
| enum class MapTargetDevice { kCpu, kGpu, kAscend310 }; | |||
| /// \brief Possible dataset types for holding the data and client type | |||
| enum class DatasetType { kUnknown, kArrow, kTf }; | |||
| /// \brief Possible flavours of Tensor implementations | |||
| enum class TensorImpl { kNone, kFlexible, kCv, kNP }; | |||
| /// \brief Possible values for shuffle | |||
| enum class ShuffleMode { kFalse = 0, kFiles = 1, kGlobal = 2, kInfile = 3 }; | |||
| /// \brief Possible values for Border types | |||
| enum class BorderType { kConstant = 0, kEdge = 1, kReflect = 2, kSymmetric = 3 }; | |||
| /// \brief Possible values for Image format types in a batch | |||
| enum class ImageBatchFormat { kNHWC = 0, kNCHW = 1 }; | |||
| /// \brief Possible values for Image format types | |||
| enum class ImageFormat { HWC = 0, CHW = 1, HW = 2 }; | |||
| /// \brief Possible interpolation modes | |||
| enum class InterpolationMode { kLinear = 0, kNearestNeighbour = 1, kCubic = 2, kArea = 3, kCubicPil = 4 }; | |||
| /// \brief Possible JiebaMode modes | |||
| enum class JiebaMode { kMix = 0, kMp = 1, kHmm = 2 }; | |||
| /// \brief Possible values for SPieceTokenizerOutType | |||
| enum class SPieceTokenizerOutType { kString = 0, kInt = 1 }; | |||
| /// \brief Possible values for SPieceTokenizerLoadType | |||
| enum class SPieceTokenizerLoadType { kFile = 0, kModel = 1 }; | |||
| /// \brief Possible values for SentencePieceModel | |||
| enum class SentencePieceModel { kUnigram = 0, kBpe = 1, kChar = 2, kWord = 3 }; | |||
| /// \brief Possible values for NormalizeForm | |||
| enum class NormalizeForm { | |||
| kNone = 0, | |||
| kNfc, | |||
| kNfkc, | |||
| kNfd, | |||
| kNfkd, | |||
| }; | |||
| /// \brief Possible values for Mask | |||
| enum class RelationalOp { | |||
| kEqual = 0, // == | |||
| kNotEqual, // != | |||
| kLess, // < | |||
| kLessEqual, // <= | |||
| kGreater, // > | |||
| kGreaterEqual, // >= | |||
| }; | |||
| /// \brief Possible values for SamplingStrategy | |||
| enum class SamplingStrategy { kRandom = 0, kEdgeWeight = 1 }; | |||
| // convenience functions for 32bit int bitmask | |||
| inline bool BitTest(uint32_t bits, uint32_t bitMask) { return (bits & bitMask) == bitMask; } | |||
| inline void BitSet(uint32_t *bits, uint32_t bitMask) { *bits |= bitMask; } | |||
| inline void BitClear(uint32_t *bits, uint32_t bitMask) { *bits &= (~bitMask); } | |||
| constexpr int64_t kDeMaxDim = std::numeric_limits<int64_t>::max(); | |||
| constexpr int32_t kDeMaxRank = std::numeric_limits<int32_t>::max(); | |||
| constexpr int64_t kDeMaxFreq = std::numeric_limits<int64_t>::max(); // 9223372036854775807 or 2^(64-1) | |||
| constexpr int64_t kDeMaxTopk = std::numeric_limits<int64_t>::max(); | |||
| constexpr uint32_t kCfgRowsPerBuffer = 1; | |||
| constexpr uint32_t kCfgParallelWorkers = 8; | |||
| constexpr uint32_t kCfgWorkerConnectorSize = 16; | |||
| constexpr uint32_t kCfgOpConnectorSize = 16; | |||
| constexpr int32_t kCfgDefaultRankId = -1; | |||
| constexpr uint32_t kCfgDefaultSeed = std::mt19937::default_seed; | |||
| constexpr uint32_t kCfgMonitorSamplingInterval = 10; | |||
| constexpr uint32_t kCfgCallbackTimeout = 60; // timeout value for callback in seconds | |||
| constexpr int32_t kCfgDefaultCachePort = 50052; | |||
| constexpr char kCfgDefaultCacheHost[] = "127.0.0.1"; | |||
| constexpr int32_t kDftPrefetchSize = 20; | |||
| constexpr int32_t kDftNumConnections = 12; | |||
| constexpr int32_t kDftAutoNumWorkers = false; | |||
| constexpr char kDftMetaColumnPrefix[] = "_meta-"; | |||
| // Invalid OpenCV type should not be from 0 to 7 (opencv4/opencv2/core/hal/interface.h) | |||
| constexpr uint8_t kCVInvalidType = 255; | |||
| using connection_id_type = uint64_t; | |||
| using session_id_type = uint32_t; | |||
| using row_id_type = int64_t; | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_CONSTANTS_H_ | |||
| @@ -0,0 +1,448 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_DATA_HELPER_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_DATA_HELPER_H_ | |||
| #include <sys/stat.h> | |||
| #include <fstream> | |||
| #include <iostream> | |||
| #include <map> | |||
| #include <memory> | |||
| #include <sstream> | |||
| #include <string> | |||
| #include <unordered_map> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| #include "include/api/status.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| /// \brief Simple class to do data manipulation, contains helper function to update json files in dataset | |||
| class DataHelper { | |||
| public: | |||
| /// \brief constructor | |||
| DataHelper() {} | |||
| /// \brief Destructor | |||
| ~DataHelper() = default; | |||
| /// \brief Create an Album dataset while taking in a path to a image folder | |||
| /// Creates the output directory if doesn't exist | |||
| /// \param[in] in_dir Image folder directory that takes in images | |||
| /// \param[in] out_dir Directory containing output json files | |||
| Status CreateAlbum(const std::string &in_dir, const std::string &out_dir) { | |||
| return CreateAlbumIF(StringToChar(in_dir), StringToChar(out_dir)); | |||
| } | |||
| /// \brief Update a json file field with a vector of string values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional input for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<std::string> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), VectorStringToChar(value), StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of bool values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<bool> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of int8 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<int8_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of uint8 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<uint8_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of int16 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<int16_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of uint16 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<uint16_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of int32 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<int32_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of uint32 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<uint32_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of int64 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<int64_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of uint64 values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<uint64_t> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of float values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<float> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a vector of double values | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value array to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateArray(const std::string &in_file, const std::string &key, const std::vector<double> &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateArrayIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a string value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const std::string &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), StringToChar(value), StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a bool value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const bool &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an int8 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const int8_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an uint8 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const uint8_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an int16 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const int16_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an uint16 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const uint16_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an int32 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const int32_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an uint32 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const uint32_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an int64 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const int64_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with an uint64 value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const uint64_t &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a float value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const float &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Update a json file field with a double value | |||
| /// \param in_file The input file name to read in | |||
| /// \param key Key of field to write to | |||
| /// \param value Value to write to file | |||
| /// \param out_file Optional parameter for output file path, will write to input file if not specified | |||
| /// \return Status The status code returned | |||
| Status UpdateValue(const std::string &in_file, const std::string &key, const double &value, | |||
| const std::string &out_file = "") { | |||
| return UpdateValueIF(StringToChar(in_file), StringToChar(key), value, StringToChar(out_file)); | |||
| } | |||
| /// \brief Template function to write tensor to file | |||
| /// \param[in] in_file File to write to | |||
| /// \param[in] data Array of type T values | |||
| /// \return Status The status code returned | |||
| template <typename T> | |||
| Status WriteBinFile(const std::string &in_file, const std::vector<T> &data) { | |||
| try { | |||
| std::ofstream o(in_file, std::ios::binary | std::ios::out); | |||
| if (!o.is_open()) { | |||
| return Status(kMDUnexpectedError, "Error opening Bin file to write"); | |||
| } | |||
| size_t length = data.size(); | |||
| o.write(reinterpret_cast<const char *>(&data[0]), std::streamsize(length * sizeof(T))); | |||
| o.close(); | |||
| } | |||
| // Catch any exception and convert to Status return code | |||
| catch (const std::exception &err) { | |||
| return Status(kMDUnexpectedError, "Write bin file failed "); | |||
| } | |||
| return Status::OK(); | |||
| } | |||
| /// \brief Write pointer to bin, use pointer to avoid memcpy | |||
| /// \param[in] in_file File name to write to | |||
| /// \param[in] data Pointer to data | |||
| /// \param[in] length Length of values to write from pointer | |||
| /// \return Status The status code returned | |||
| template <typename T> | |||
| Status WriteBinFile(const std::string &in_file, T *data, size_t length) { | |||
| try { | |||
| std::ofstream o(in_file, std::ios::binary | std::ios::out); | |||
| if (!o.is_open()) { | |||
| return Status(kMDUnexpectedError, "Error opening Bin file to write"); | |||
| } | |||
| o.write(reinterpret_cast<const char *>(data), std::streamsize(length * sizeof(T))); | |||
| o.close(); | |||
| } | |||
| // Catch any exception and convert to Status return code | |||
| catch (const std::exception &err) { | |||
| return Status(kMDUnexpectedError, "Write bin file failed "); | |||
| } | |||
| return Status::OK(); | |||
| } | |||
| /// \brief Helper function to copy content of a tensor to buffer | |||
| /// \note This function iterates over the tensor in bytes, since | |||
| /// \param[in] tensor_addr The memory held by a tensor | |||
| /// \param[in] tensor_size The amount of data in bytes in tensor_addr, e.g. tensor->SizeInBytes() | |||
| /// \param[out] addr The address to copy tensor data to | |||
| /// \param[in] buffer_size The buffer size of addr | |||
| /// \return The size of the tensor (bytes copied | |||
| size_t DumpData(const unsigned char *tensor_addr, const size_t &tensor_size, void *addr, const size_t &buffer_size); | |||
| /// \brief Helper function to delete key in json file | |||
| /// note This function will return okay even if key not found | |||
| /// \param[in] in_file Json file to remove key from | |||
| /// \param[in] key The key to remove | |||
| /// \return Status The status code returned | |||
| Status RemoveKey(const std::string &in_file, const std::string &key, const std::string &out_file = "") { | |||
| return RemoveKeyIF(StringToChar(in_file), StringToChar(key), StringToChar(out_file)); | |||
| } | |||
| /// \brief A print method typically used for debugging | |||
| /// \param out - The output stream to write output to | |||
| void Print(std::ostream &out) const; | |||
| /// \brief << Stream output operator overload | |||
| /// \notes This allows you to write the debug print info using stream operators | |||
| /// \param out Reference to the output stream being overloaded | |||
| /// \param ds Reference to the DataSchema to display | |||
| /// \return The output stream must be returned | |||
| friend std::ostream &operator<<(std::ostream &out, const DataHelper &dh) { | |||
| dh.Print(out); | |||
| return out; | |||
| } | |||
| private: | |||
| // Helper function for dual ABI support | |||
| Status CreateAlbumIF(const std::vector<char> &in_dir, const std::vector<char> &out_dir); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<std::vector<char>> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<bool> &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<int8_t> &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<uint8_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<int16_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<uint16_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<int32_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<uint32_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<int64_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, | |||
| const std::vector<uint64_t> &value, const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<float> &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateArrayIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<double> &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<char> &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const bool &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const int8_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const uint8_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const int16_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const uint16_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const int32_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const uint32_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const int64_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const uint64_t &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const float &value, | |||
| const std::vector<char> &out_file); | |||
| Status UpdateValueIF(const std::vector<char> &in_file, const std::vector<char> &key, const double &value, | |||
| const std::vector<char> &out_file); | |||
| Status RemoveKeyIF(const std::vector<char> &in_file, const std::vector<char> &key, const std::vector<char> &out_file); | |||
| }; | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_DATA_HELPER_H_ | |||
| @@ -0,0 +1,128 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_EXECUTE_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_EXECUTE_H_ | |||
| #include <string> | |||
| #include <vector> | |||
| #include <map> | |||
| #include <memory> | |||
| #include "include/api/context.h" | |||
| #include "include/api/types.h" | |||
| #include "include/dataset/constants.h" | |||
| #include "include/dataset/transforms.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| class DeviceResource; | |||
| // class to run tensor operations in eager mode | |||
| class Execute { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] op TensorOperation to be applied in Eager mode, it accepts op in type of shared pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(std::shared_ptr<TensorOperation> op, MapTargetDevice deviceType = MapTargetDevice::kCpu, | |||
| uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] op TensorTransform to be applied in Eager mode, it accepts op in type of shared pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(std::shared_ptr<TensorTransform> op, MapTargetDevice deviceType = MapTargetDevice::kCpu, | |||
| uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] op TensorTransform to be applied in Eager mode, it accepts op in type of reference. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(std::reference_wrapper<TensorTransform> op, MapTargetDevice deviceType = MapTargetDevice::kCpu, | |||
| uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] op TensorTransform to be applied in Eager mode, it accepts op in type of raw pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(TensorTransform *op, MapTargetDevice deviceType = MapTargetDevice::kCpu, uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] ops A vector of TensorOperations to be applied in Eager mode, it accepts op in type of shared pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(std::vector<std::shared_ptr<TensorOperation>> ops, | |||
| MapTargetDevice deviceType = MapTargetDevice::kCpu, uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] ops A vector of TensorTransforms to be applied in Eager mode, it accepts op in type of shared pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(std::vector<std::shared_ptr<TensorTransform>> ops, | |||
| MapTargetDevice deviceType = MapTargetDevice::kCpu, uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] ops A vector of TensorTransforms to be applied in Eager mode, it accepts op in type of raw pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(const std::vector<std::reference_wrapper<TensorTransform>> ops, | |||
| MapTargetDevice deviceType = MapTargetDevice::kCpu, uint32_t device_id = 0); | |||
| /// \brief Constructor. | |||
| /// \param[in] ops A vector of TensorTransforms to be applied in Eager mode, it accepts op in type of raw pointer. | |||
| /// \param[in] deviceType Target device env to perform operation, can be kCPU/kGPU/kAscend310 (default=kCPU). | |||
| /// \param[in] device_id Target device id to perform operation, only valid when deviceType=kAscend310 (default=0). | |||
| explicit Execute(const std::vector<TensorTransform *> &ops, MapTargetDevice deviceType = MapTargetDevice::kCpu, | |||
| uint32_t device_id = 0); | |||
| /// \brief Destructor. | |||
| ~Execute(); | |||
| /// \brief Callable function to execute the TensorTransform in eager mode. | |||
| /// \param[in] input Tensor to be transformed. | |||
| /// \param[out] output Transformed tensor. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status operator()(const mindspore::MSTensor &input, mindspore::MSTensor *output); | |||
| /// \brief Callable function to execute the TensorTransform in eager mode. | |||
| /// \param[in] input_tensor_list List of Tensor to be transformed. | |||
| /// \param[out] out Result tensor after transform. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status operator()(const std::vector<mindspore::MSTensor> &input_tensor_list, std::vector<mindspore::MSTensor> *out); | |||
| Status DeviceMemoryRelease(); | |||
| std::string AippCfgGenerator(); | |||
| private: | |||
| Status ParseTransforms_(); | |||
| Status validate_device_(); | |||
| std::vector<std::shared_ptr<TensorTransform>> transforms_; | |||
| std::vector<std::shared_ptr<TensorOperation>> ops_; | |||
| MapTargetDevice device_type_; | |||
| std::shared_ptr<DeviceResource> device_resource_; | |||
| struct ExtraInfo; | |||
| std::shared_ptr<ExtraInfo> info_; | |||
| }; | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_EXECUTE_H_ | |||
| @@ -0,0 +1,153 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_ITERATOR_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_ITERATOR_H_ | |||
| #include <map> | |||
| #include <memory> | |||
| #include <string> | |||
| #include <unordered_map> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| #include "include/api/status.h" | |||
| #include "include/api/types.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Forward declare | |||
| class ExecutionTree; | |||
| class DatasetOp; | |||
| class Tensor; | |||
| class NativeRuntimeContext; | |||
| class IteratorConsumer; | |||
| class PullBasedIteratorConsumer; | |||
| class Dataset; | |||
| using MSTensorMap = std::unordered_map<std::string, mindspore::MSTensor>; | |||
| using MSTensorMapChar = std::map<std::vector<char>, mindspore::MSTensor>; | |||
| using MSTensorVec = std::vector<mindspore::MSTensor>; | |||
| // Abstract class for iterating over the dataset. | |||
| class Iterator { | |||
| public: | |||
| /// \brief Constructor | |||
| Iterator(); | |||
| /// \brief Destructor | |||
| ~Iterator(); | |||
| /// \brief Method for building and launching the pipeline. | |||
| /// \param[in] ops - a vector of DatasetOp in the data pipeline. | |||
| /// \param[in] num_epochs Number of epochs passed down to EpochCtrlNode, default -1, infinite epochs | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status BuildAndLaunchTree(std::shared_ptr<Dataset> ds, int32_t num_epochs); | |||
| /// \brief Function to get the next row from the data pipeline. | |||
| /// \note Type of return data is a map(with column name). | |||
| /// \param[out] row - the output tensor row. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status GetNextRow(MSTensorMap *row) { | |||
| MSTensorMapChar row_; | |||
| row_.clear(); | |||
| row->clear(); | |||
| Status s = GetNextRowCharIF(&row_); | |||
| TensorMapCharToString(&row_, row); | |||
| return s; | |||
| } | |||
| // Char interface(CharIF) of GetNextRow | |||
| // This This API exists because std::string will constrained by ABI compile option while char don't. | |||
| Status GetNextRowCharIF(MSTensorMapChar *row); | |||
| /// \brief Function to get the next row from the data pipeline. | |||
| /// \note Type of return data is a vector(without column name). | |||
| /// \param[out] row - the output tensor row. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| virtual Status GetNextRow(MSTensorVec *row); | |||
| /// \brief Function to shut down the data pipeline. | |||
| void Stop(); | |||
| class _Iterator { | |||
| public: | |||
| explicit _Iterator(Iterator *lt); | |||
| // Destructor | |||
| ~_Iterator() { | |||
| if (cur_row_) { | |||
| delete cur_row_; | |||
| } | |||
| } | |||
| _Iterator &operator++(); // prefix ++ overload | |||
| MSTensorMap &operator*() { return *cur_row_; } // dereference operator | |||
| MSTensorMap *operator->() { return cur_row_; } | |||
| bool operator!=(const _Iterator &rhs) { return cur_row_ != rhs.cur_row_; } | |||
| private: | |||
| int ind_; // the cur node our Iterator points to | |||
| Iterator *lt_; | |||
| MSTensorMap *cur_row_; | |||
| }; | |||
| _Iterator begin() { return _Iterator(this); } | |||
| _Iterator end() { return _Iterator(nullptr); } | |||
| private: | |||
| std::unique_ptr<NativeRuntimeContext> runtime_context_; | |||
| IteratorConsumer *consumer_; | |||
| }; | |||
| class PullIterator : public Iterator { | |||
| public: | |||
| /// \brief Constructor | |||
| PullIterator(); | |||
| /// \brief Destructor | |||
| ~PullIterator() = default; | |||
| /// \brief Function to get next row from the data pipeline. | |||
| /// \note Type of return data is a vector(without column name). | |||
| /// \param[out] row The output tensor row. | |||
| /// \return Status error code, returns OK if no error encountered else false. | |||
| Status GetNextRow(MSTensorVec *const row) override; | |||
| /// \brief Function to get specified rows from the data pipeline. | |||
| /// \note Type of return data is a vector(without column name). | |||
| /// \note This behavior is subject to change | |||
| /// \param[in] num_rows The number of rows to fetch. | |||
| /// \param[out] row The output tensor row. | |||
| /// \return Status error code, returns OK if no error encountered else false. | |||
| Status GetRows(int32_t num_rows, std::vector<MSTensorVec> *const row); | |||
| /// \brief Method for building and launching the pipeline. | |||
| /// \note Consider making this function protected. | |||
| /// \param[in] ds - The root node that calls the function | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status BuildAndLaunchTree(std::shared_ptr<Dataset> ds); | |||
| private: | |||
| std::unique_ptr<PullBasedIteratorConsumer> pull_consumer_; | |||
| }; | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_ITERATOR_H_ | |||
| @@ -0,0 +1,74 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ | |||
| #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ | |||
| #include <cstdint> // int64_t, uint64_t | |||
| #include <map> // map | |||
| #include <memory> // allocator | |||
| #include <string> // string | |||
| #include <vector> // vector | |||
| /*! | |||
| @brief namespace for Niels Lohmann | |||
| @see https://github.com/nlohmann | |||
| @since version 1.0.0 | |||
| */ | |||
| namespace nlohmann { | |||
| /*! | |||
| @brief default JSONSerializer template argument | |||
| This serializer ignores the template arguments and uses ADL | |||
| ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) | |||
| for serialization. | |||
| */ | |||
| template <typename T = void, typename SFINAE = void> | |||
| struct adl_serializer; | |||
| template <template <typename U, typename V, typename... Args> class ObjectType = std::map, | |||
| template <typename U, typename... Args> class ArrayType = std::vector, class StringType = std::string, | |||
| class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, | |||
| class NumberFloatType = double, template <typename U> class AllocatorType = std::allocator, | |||
| template <typename T, typename SFINAE = void> class JSONSerializer = adl_serializer> | |||
| class basic_json; | |||
| /*! | |||
| @brief JSON Pointer | |||
| A JSON pointer defines a string syntax for identifying a specific value | |||
| within a JSON document. It can be used with functions `at` and | |||
| `operator[]`. Furthermore, JSON pointers are the base for JSON patches. | |||
| @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) | |||
| @since version 2.0.0 | |||
| */ | |||
| template <typename BasicJsonType> | |||
| class json_pointer; | |||
| /*! | |||
| @brief default JSON class | |||
| This type is the default specialization of the @ref basic_json class which | |||
| uses the standard template types. | |||
| @since version 1.0.0 | |||
| */ | |||
| using json = basic_json<>; | |||
| } // namespace nlohmann | |||
| #endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ | |||
| @@ -0,0 +1,251 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_SAMPLERS_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_SAMPLERS_H_ | |||
| #include <memory> | |||
| #include <vector> | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Forward declare | |||
| class SamplerObj; | |||
| // Abstract class to represent a sampler in the data pipeline. | |||
| /// \class Sampler samplers.h | |||
| /// \brief An abstract base class to represent a sampler in the data pipeline. | |||
| class Sampler : std::enable_shared_from_this<Sampler> { | |||
| friend class AlbumDataset; | |||
| friend class CelebADataset; | |||
| friend class Cifar10Dataset; | |||
| friend class Cifar100Dataset; | |||
| friend class CLUEDataset; | |||
| friend class CocoDataset; | |||
| friend class CSVDataset; | |||
| friend class ImageFolderDataset; | |||
| friend class ManifestDataset; | |||
| friend class MindDataDataset; | |||
| friend class MnistDataset; | |||
| friend class RandomDataDataset; | |||
| friend class TextFileDataset; | |||
| friend class TFRecordDataset; | |||
| friend class VOCDataset; | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| Sampler() {} | |||
| /// \brief Destructor | |||
| ~Sampler() = default; | |||
| /// \brief A virtual function to add a child sampler. | |||
| /// \param[in] child The child sampler to be added as a children of this sampler. | |||
| virtual void AddChild(std::shared_ptr<Sampler> child) { children_.push_back(child); } | |||
| protected: | |||
| /// \brief Pure virtual function to convert a Sampler class into an IR Sampler object. | |||
| /// \return shared pointer to the newly created TensorOperation. | |||
| virtual std::shared_ptr<SamplerObj> Parse() const = 0; | |||
| std::vector<std::shared_ptr<Sampler>> children_; | |||
| }; | |||
| /// \brief A class to represent a Distributed Sampler in the data pipeline. | |||
| /// \note A Sampler that accesses a shard of the dataset. | |||
| class DistributedSampler final : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] num_shards Number of shards to divide the dataset into. | |||
| /// \param[in] shard_id Shard ID of the current shard within num_shards. | |||
| /// \param[in] shuffle If true, the indices are shuffled (default=true). | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| /// \param[in] seed The seed in use when shuffle is true (default=1). | |||
| /// \param[in] offset The starting position where access to elements in the dataset begins (default=-1). | |||
| /// \param[in] even_dist If true, each shard would return the same number of rows (default=true). | |||
| /// If false the total rows returned by all the shards would not have overlap. | |||
| explicit DistributedSampler(int64_t num_shards, int64_t shard_id, bool shuffle = true, int64_t num_samples = 0, | |||
| uint32_t seed = 1, int64_t offset = -1, bool even_dist = true); | |||
| /// \brief Destructor. | |||
| ~DistributedSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| private: | |||
| int64_t num_shards_; | |||
| int64_t shard_id_; | |||
| bool shuffle_; | |||
| int64_t num_samples_; | |||
| uint32_t seed_; | |||
| int64_t offset_; | |||
| bool even_dist_; | |||
| }; | |||
| /// \brief A class to represent a PK Sampler in the data pipeline. | |||
| /// \note Samples K elements for each P class in the dataset. | |||
| /// This will sample all classes. | |||
| class PKSampler final : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] num_val Number of elements to sample for each class. | |||
| /// \param[in] shuffle If true, the class IDs are shuffled (default=false). | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| explicit PKSampler(int64_t num_val, bool shuffle = false, int64_t num_samples = 0); | |||
| /// \brief Destructor. | |||
| ~PKSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| private: | |||
| int64_t num_val_; | |||
| bool shuffle_; | |||
| int64_t num_samples_; | |||
| }; | |||
| /// \brief A class to represent a Random Sampler in the data pipeline. | |||
| /// \note Samples the elements randomly. | |||
| class RandomSampler final : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] replacement If true, put the sample ID back for the next draw (default=false). | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| explicit RandomSampler(bool replacement = false, int64_t num_samples = 0); | |||
| /// \brief Destructor. | |||
| ~RandomSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| private: | |||
| bool replacement_; | |||
| int64_t num_samples_; | |||
| }; | |||
| /// \brief A class to represent a Sequential Sampler in the data pipeline. | |||
| /// \note Samples the dataset elements sequentially, same as not having a sampler. | |||
| class SequentialSampler final : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] start_index Index to start sampling at (default=0, start at first id). | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| explicit SequentialSampler(int64_t start_index = 0, int64_t num_samples = 0); | |||
| /// \brief Destructor. | |||
| ~SequentialSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| private: | |||
| int64_t start_index_; | |||
| int64_t num_samples_; | |||
| }; | |||
| /// \brief A class to represent a Subset Sampler in the data pipeline. | |||
| /// \note Samples the elements from a sequence of indices. | |||
| class SubsetSampler : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] indices A vector sequence of indices. | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| explicit SubsetSampler(std::vector<int64_t> indices, int64_t num_samples = 0); | |||
| /// \brief Destructor. | |||
| ~SubsetSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| std::vector<int64_t> indices_; | |||
| int64_t num_samples_; | |||
| }; | |||
| /// \brief A class to represent a Subset Random Sampler in the data pipeline. | |||
| /// \note Samples the elements randomly from a sequence of indices. | |||
| class SubsetRandomSampler final : public SubsetSampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] indices A vector sequence of indices. | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| explicit SubsetRandomSampler(std::vector<int64_t> indices, int64_t num_samples = 0); | |||
| /// \brief Destructor. | |||
| ~SubsetRandomSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| }; | |||
| /// \brief A class to represent a Weighted Random Sampler in the data pipeline. | |||
| /// \note Samples the elements from [0, len(weights) - 1] randomly with the given | |||
| /// weights (probabilities). | |||
| class WeightedRandomSampler final : public Sampler { | |||
| friend std::shared_ptr<SamplerObj> SelectSampler(int64_t, bool, int32_t, int32_t); | |||
| public: | |||
| /// \brief Constructor | |||
| /// \param[in] weights A vector sequence of weights, not necessarily summing up to 1. | |||
| /// \param[in] num_samples The number of samples to draw (default=0, return all samples). | |||
| /// \param[in] replacement If true, put the sample ID back for the next draw (default=true). | |||
| explicit WeightedRandomSampler(std::vector<double> weights, int64_t num_samples = 0, bool replacement = true); | |||
| /// \brief Destructor. | |||
| ~WeightedRandomSampler() = default; | |||
| protected: | |||
| /// \brief Function to convert a Sampler into an IR SamplerObj. | |||
| /// \return shared pointer to the newly created SamplerObj. | |||
| std::shared_ptr<SamplerObj> Parse() const override; | |||
| private: | |||
| std::vector<double> weights_; | |||
| int64_t num_samples_; | |||
| bool replacement_; | |||
| }; | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_SAMPLERS_H_ | |||
| @@ -0,0 +1,545 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TEXT_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TEXT_H_ | |||
| #include <memory> | |||
| #include <optional> | |||
| #include <string> | |||
| #include <utility> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| #include "include/api/status.h" | |||
| #include "include/dataset/constants.h" | |||
| #include "include/dataset/transforms.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| class Vocab; | |||
| class SentencePieceVocab; | |||
| class TensorOperation; | |||
| // Transform operations for text | |||
| namespace text { | |||
| #ifndef _WIN32 | |||
| /// \brief Tokenize a scalar tensor of UTF-8 string by specific rules. | |||
| /// \note BasicTokenizer is not supported on Windows platform yet. | |||
| class BasicTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] lower_case If true, apply CaseFold, NormalizeUTF8 (NFD mode), RegexReplace operation on input text to | |||
| /// fold the text to lower case and strip accents characters. If false, only apply | |||
| /// NormalizeUTF8('normalization_form' mode) operation on input text (default=false). | |||
| /// \param[in] keep_whitespace If true, the whitespace will be kept in out tokens (default=false). | |||
| /// \param[in] normalize_form Used to specify a specific normalize mode. This is only effective when 'lower_case' is | |||
| /// false. See NormalizeUTF8 for details (default=NormalizeForm::kNone). | |||
| /// \param[in] preserve_unused_token If true, do not split special tokens like '[CLS]', '[SEP]', '[UNK]', '[PAD]', | |||
| /// '[MASK]' (default=true). | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit BasicTokenizer(bool lower_case = false, bool keep_whitespace = false, | |||
| const NormalizeForm normalize_form = NormalizeForm::kNone, bool preserve_unused_token = true, | |||
| bool with_offsets = false); | |||
| /// \brief Destructor | |||
| ~BasicTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tokenizer used for Bert text process. | |||
| /// \note BertTokenizer is not supported on Windows platform yet. | |||
| class BertTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] vocab A Vocab object. | |||
| /// \param[in] suffix_indicator Used to show that the subword is the last part of a word (default='##'). | |||
| /// \param[in] max_bytes_per_token Tokens exceeding this length will not be further split (default=100). | |||
| /// \param[in] unknown_token When a token cannot be found, return the token directly if 'unknown_token' is an empty | |||
| /// string, else return the string specified(default='[UNK]'). | |||
| /// \param[in] lower_case If true, apply CaseFold, NormalizeUTF8 (NFD mode), RegexReplace operation on input text to | |||
| /// fold the text to lower case and strip accents characters. If false, only apply | |||
| /// NormalizeUTF8('normalization_form' mode) operation on input text (default=false). | |||
| /// \param[in] keep_whitespace If true, the whitespace will be kept in out tokens (default=false). | |||
| /// \param[in] normalize_form Used to specify a specific normalize mode. This is only effective when 'lower_case' is | |||
| /// false. See NormalizeUTF8 for details (default=NormalizeForm::kNone). | |||
| /// \param[in] preserve_unused_token If true, do not split special tokens like '[CLS]', '[SEP]', '[UNK]', '[PAD]', | |||
| /// '[MASK]' (default=true). | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit BertTokenizer(const std::shared_ptr<Vocab> &vocab, const std::string &suffix_indicator = "##", | |||
| int32_t max_bytes_per_token = 100, const std::string &unknown_token = "[UNK]", | |||
| bool lower_case = false, bool keep_whitespace = false, | |||
| const NormalizeForm normalize_form = NormalizeForm::kNone, bool preserve_unused_token = true, | |||
| bool with_offsets = false) | |||
| : BertTokenizer(vocab, StringToChar(suffix_indicator), max_bytes_per_token, StringToChar(unknown_token), | |||
| lower_case, keep_whitespace, normalize_form, preserve_unused_token, with_offsets) {} | |||
| explicit BertTokenizer(const std::shared_ptr<Vocab> &vocab, const std::vector<char> &suffix_indicator, | |||
| int32_t max_bytes_per_token, const std::vector<char> &unknown_token, bool lower_case, | |||
| bool keep_whitespace, const NormalizeForm normalize_form, bool preserve_unused_token, | |||
| bool with_offsets); | |||
| /// \brief Destructor | |||
| ~BertTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Apply case fold operation on UTF-8 string tensor. | |||
| /// \return Shared pointer to the current TensorOperation. | |||
| class CaseFold final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| CaseFold(); | |||
| /// \brief Destructor | |||
| ~CaseFold() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| #endif | |||
| /// \brief Tokenize Chinese string into words based on dictionary. | |||
| /// \note The integrity of the HMMSEgment algorithm and MPSegment algorithm files must be confirmed. | |||
| class JiebaTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] hmm_path Dictionary file is used by HMMSegment algorithm. The dictionary can be obtained on the | |||
| /// official website of cppjieba. | |||
| /// \param[in] mp_path Dictionary file is used by MPSegment algorithm. The dictionary can be obtained on the | |||
| /// official website of cppjieba. | |||
| /// \param[in] mode Valid values can be any of [JiebaMode.MP, JiebaMode.HMM, JiebaMode.MIX](default=JiebaMode.MIX). | |||
| /// - JiebaMode.kMP, tokenize with MPSegment algorithm. | |||
| /// - JiebaMode.kHMM, tokenize with Hiddel Markov Model Segment algorithm. | |||
| /// - JiebaMode.kMIX, tokenize with a mix of MPSegment and HMMSegment algorithm. | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit JiebaTokenizer(const std::string &hmm_path, const std::string &mp_path, | |||
| const JiebaMode &mode = JiebaMode::kMix, bool with_offsets = false) | |||
| : JiebaTokenizer(StringToChar(hmm_path), StringToChar(mp_path), mode, with_offsets) {} | |||
| explicit JiebaTokenizer(const std::vector<char> &hmm_path, const std::vector<char> &mp_path, const JiebaMode &mode, | |||
| bool with_offsets); | |||
| /// \brief Destructor | |||
| ~JiebaTokenizer() = default; | |||
| /// \brief Add user defined word to JiebaTokenizer's dictionary. | |||
| /// \param[in] word The word to be added to the JiebaTokenizer instance. | |||
| /// The added word will not be written into the built-in dictionary on disk. | |||
| /// \param[in] freq The frequency of the word to be added. The higher the frequency, | |||
| /// the better chance the word will be tokenized (default=None, use default frequency). | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status AddWord(const std::string &word, int64_t freq = 0) { return AddWordChar(StringToChar(word), freq); } | |||
| /// \brief Add user defined dictionary of word-freq pairs to JiebaTokenizer's dictionary. | |||
| /// \param[in] user_dict Vector of word-freq pairs to be added to JiebaTokenizer's dictionary. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status AddDict(const std::vector<std::pair<std::string, int64_t>> &user_dict) { | |||
| return AddDictChar(PairStringInt64ToPairCharInt64(user_dict)); | |||
| } | |||
| /// \brief Add user defined dictionary of word-freq pairs to JiebaTokenizer's dictionary from a file. | |||
| /// Only valid word-freq pairs in user provided file will be added into the dictionary. | |||
| /// Rows containing invalid input will be ignored, no error nor warning Status is returned. | |||
| /// \param[in] file_path Path to the dictionary which includes user defined word-freq pairs. | |||
| /// \return Status error code, returns OK if no error encountered. | |||
| Status AddDict(const std::string &file_path) { return AddDictChar(StringToChar(file_path)); } | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| /// \brief Parser user defined word by file. | |||
| /// \param[in] file_path Path to the user defined file. | |||
| /// \param[in] user_dict Vector of word-freq pairs extracted from the user provided file. | |||
| Status ParserFile(const std::string &file_path, std::vector<std::pair<std::string, int64_t>> *const user_dict); | |||
| /// \brief Used to translate all API string to vector of char and back | |||
| Status AddWordChar(const std::vector<char> &word, int64_t freq = 0); | |||
| /// \brief Used to translate all API string to vector of char and back | |||
| Status AddDictChar(const std::vector<std::pair<std::vector<char>, int64_t>> &user_dict); | |||
| /// \brief Used to translate all API string to vector of char and back | |||
| Status AddDictChar(const std::vector<char> &file_path); | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Look up a word into an id according to the input vocabulary table. | |||
| class Lookup final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] vocab a Vocab object. | |||
| /// \param[in] unknown_token word to use for lookup if the word being looked up is out of Vocabulary (oov). | |||
| /// If unknown_token is oov, runtime error will be thrown. If unknown_token is {}, which means that not to | |||
| /// specify unknown_token when word being out of Vocabulary (default={}). | |||
| /// \param[in] data_type mindspore::DataType of the tensor after lookup; must be numeric, including bool. | |||
| /// (default=mindspore::DataType::kNumberTypeInt32). | |||
| explicit Lookup(const std::shared_ptr<Vocab> &vocab, const std::optional<std::string> &unknown_token = {}, | |||
| mindspore::DataType data_type = mindspore::DataType::kNumberTypeInt32) | |||
| : Lookup(vocab, OptionalStringToChar(unknown_token), data_type) {} | |||
| explicit Lookup(const std::shared_ptr<Vocab> &vocab, const std::optional<std::vector<char>> &unknown_token, | |||
| mindspore::DataType data_type = mindspore::DataType::kNumberTypeInt32); | |||
| /// \brief Destructor | |||
| ~Lookup() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief TensorOp to generate n-gram from a 1-D string Tensor. | |||
| class Ngram final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] ngrams ngrams is a vector of positive integers. For example, if ngrams={4, 3}, then the result | |||
| /// would be a 4-gram followed by a 3-gram in the same tensor. If the number of words is not enough to make up | |||
| /// for a n-gram, an empty string will be returned. | |||
| /// \param[in] left_pad {"pad_token", pad_width}. Padding performed on left side of the sequence. pad_width will | |||
| /// be capped at n-1. left_pad=("_",2) would pad left side of the sequence with "__" (default={"", 0}}). | |||
| /// \param[in] right_pad {"pad_token", pad_width}. Padding performed on right side of the sequence.pad_width will | |||
| /// be capped at n-1. right_pad=("-":2) would pad right side of the sequence with "--" (default={"", 0}}). | |||
| /// \param[in] separator Symbol used to join strings together (default=" "). | |||
| explicit Ngram(const std::vector<int32_t> &ngrams, const std::pair<std::string, int32_t> &left_pad = {"", 0}, | |||
| const std::pair<std::string, int32_t> &right_pad = {"", 0}, const std::string &separator = " ") | |||
| : Ngram(ngrams, PairStringToChar(left_pad), PairStringToChar(right_pad), StringToChar(separator)) {} | |||
| explicit Ngram(const std::vector<int32_t> &ngrams, const std::pair<std::vector<char>, int32_t> &left_pad, | |||
| const std::pair<std::vector<char>, int32_t> &right_pad, const std::vector<char> &separator); | |||
| /// \brief Destructor | |||
| ~Ngram() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| #ifndef _WIN32 | |||
| /// \brief Apply normalize operation on UTF-8 string tensor. | |||
| class NormalizeUTF8 final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] normalize_form Valid values can be any of [NormalizeForm::kNone,NormalizeForm::kNfc, | |||
| /// NormalizeForm::kNfkc, | |||
| /// NormalizeForm::kNfd, NormalizeForm::kNfkd](default=NormalizeForm::kNfkc). | |||
| /// See http://unicode.org/reports/tr15/ for details. | |||
| /// - NormalizeForm.NONE, do nothing for input string tensor. | |||
| /// - NormalizeForm.NFC, normalize with Normalization Form C. | |||
| /// - NormalizeForm.NFKC, normalize with Normalization Form KC. | |||
| /// - NormalizeForm.NFD, normalize with Normalization Form D. | |||
| /// - NormalizeForm.NFKD, normalize with Normalization Form KD. | |||
| explicit NormalizeUTF8(NormalizeForm normalize_form = NormalizeForm::kNfkc); | |||
| /// \brief Destructor | |||
| ~NormalizeUTF8() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Replace UTF-8 string tensor with 'replace' according to regular expression 'pattern'. | |||
| class RegexReplace final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] pattern The regex expression patterns. | |||
| /// \param[in] replace The string to replace matched element. | |||
| /// \param[in] replace_all Confirm whether to replace all. If false, only replace first matched element; | |||
| /// if true, replace all matched elements (default=true). | |||
| explicit RegexReplace(std::string pattern, std::string replace, bool replace_all = true) | |||
| : RegexReplace(StringToChar(pattern), StringToChar(replace), replace_all) {} | |||
| explicit RegexReplace(const std::vector<char> &pattern, const std::vector<char> &replace, bool replace_all); | |||
| /// \brief Destructor | |||
| ~RegexReplace() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tokenize a scalar tensor of UTF-8 string by regex expression pattern. | |||
| class RegexTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] delim_pattern The pattern of regex delimiters. | |||
| /// \param[in] keep_delim_pattern The string matched by 'delim_pattern' can be kept as a token if it can be | |||
| /// matched by 'keep_delim_pattern'. The default value is an empty string (""). | |||
| /// which means that delimiters will not be kept as an output token (default=""). | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit RegexTokenizer(std::string delim_pattern, std::string keep_delim_pattern = "", bool with_offsets = false) | |||
| : RegexTokenizer(StringToChar(delim_pattern), StringToChar(keep_delim_pattern), with_offsets) {} | |||
| explicit RegexTokenizer(const std::vector<char> &delim_pattern, const std::vector<char> &keep_delim_pattern, | |||
| bool with_offsets); | |||
| /// \brief Destructor | |||
| ~RegexTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| #endif | |||
| /// \brief Tokenize scalar token or 1-D tokens to tokens by sentencepiece. | |||
| class SentencePieceTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] vocab a SentencePieceVocab object. | |||
| /// \param[in] out_type The type of output. | |||
| SentencePieceTokenizer(const std::shared_ptr<SentencePieceVocab> &vocab, | |||
| mindspore::dataset::SPieceTokenizerOutType out_type); | |||
| /// \brief Constructor. | |||
| /// \param[in] vocab_path vocab model file path. | |||
| /// \param[in] out_type The type of output. | |||
| SentencePieceTokenizer(const std::string &vocab_path, mindspore::dataset::SPieceTokenizerOutType out_type) | |||
| : SentencePieceTokenizer(StringToChar(vocab_path), out_type) {} | |||
| SentencePieceTokenizer(const std::vector<char> &vocab_path, mindspore::dataset::SPieceTokenizerOutType out_type); | |||
| /// \brief Destructor | |||
| ~SentencePieceTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief TensorOp to construct a tensor from data (only 1-D for now), where each element in the dimension | |||
| /// axis is a slice of data starting at the corresponding position, with a specified width. | |||
| class SlidingWindow final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] width The width of the window. It must be an integer and greater than zero. | |||
| /// \param[in] axis The axis along which the sliding window is computed (default=0), axis support 0 or -1 only | |||
| /// for now. | |||
| explicit SlidingWindow(const int32_t width, const int32_t axis = 0); | |||
| /// \brief Destructor | |||
| ~SlidingWindow() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tensor operation to convert every element of a string tensor to a number. | |||
| /// Strings are cast according to the rules specified in the following links: | |||
| /// https://en.cppreference.com/w/cpp/string/basic_string/stof, | |||
| /// https://en.cppreference.com/w/cpp/string/basic_string/stoul, | |||
| /// except that any strings which represent negative numbers cannot be cast to an unsigned integer type. | |||
| class ToNumber final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] data_type mindspore::DataType of the tensor to be cast to. Must be a numeric type, excluding bool. | |||
| explicit ToNumber(mindspore::DataType data_type); | |||
| /// \brief Destructor | |||
| ~ToNumber() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Truncate a pair of rank-1 tensors such that the total length is less than max_length. | |||
| class TruncateSequencePair final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] max_length Maximum length required. | |||
| explicit TruncateSequencePair(int32_t max_length); | |||
| /// \brief Destructor | |||
| ~TruncateSequencePair() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tokenize a scalar tensor of UTF-8 string to Unicode characters. | |||
| class UnicodeCharTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit UnicodeCharTokenizer(bool with_offsets = false); | |||
| /// \brief Destructor | |||
| ~UnicodeCharTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tokenize scalar token or 1-D tokens to 1-D subword tokens. | |||
| class WordpieceTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] vocab A Vocab object. | |||
| /// \param[in] suffix_indicator Used to show that the subword is the last part of a word (default='##'). | |||
| /// \param[in] max_bytes_per_token Tokens exceeding this length will not be further split (default=100). | |||
| /// \param[in] unknown_token When a token cannot be found, return the token directly if 'unknown_token' is an empty | |||
| /// string, else return the string specified (default='[UNK]'). | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit WordpieceTokenizer(const std::shared_ptr<Vocab> &vocab, const std::string &suffix_indicator = "##", | |||
| int32_t max_bytes_per_token = 100, const std::string &unknown_token = "[UNK]", | |||
| bool with_offsets = false) | |||
| : WordpieceTokenizer(vocab, StringToChar(suffix_indicator), max_bytes_per_token, StringToChar(unknown_token), | |||
| with_offsets) {} | |||
| explicit WordpieceTokenizer(const std::shared_ptr<Vocab> &vocab, const std::vector<char> &suffix_indicator, | |||
| int32_t max_bytes_per_token, const std::vector<char> &unknown_token, bool with_offsets); | |||
| /// \brief Destructor | |||
| ~WordpieceTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| #ifndef _WIN32 | |||
| /// \brief Tokenize a scalar tensor of UTF-8 string on Unicode script boundaries. | |||
| class UnicodeScriptTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] keep_whitespace Whether or not emit whitespace tokens (default=false). | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit UnicodeScriptTokenizer(bool keep_whitespace = false, bool with_offsets = false); | |||
| /// \brief Destructor | |||
| ~UnicodeScriptTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Tokenize a scalar tensor of UTF-8 string on ICU4C defined whitespaces. | |||
| class WhitespaceTokenizer final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] with_offsets Whether or not output offsets of tokens (default=false). | |||
| explicit WhitespaceTokenizer(bool with_offsets = false); | |||
| /// \brief Destructor | |||
| ~WhitespaceTokenizer() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| #endif | |||
| } // namespace text | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TEXT_H_ | |||
| @@ -0,0 +1,413 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TRANSFORMS_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TRANSFORMS_H_ | |||
| #include <map> | |||
| #include <memory> | |||
| #include <string> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| #include "include/api/status.h" | |||
| #include "include/api/types.h" | |||
| #include "include/dataset/constants.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| class TensorOperation; | |||
| // We need the following two groups of forward declaration to friend the class in class TensorTransform. | |||
| namespace transforms { | |||
| class Compose; | |||
| class RandomApply; | |||
| class RandomChoice; | |||
| } // namespace transforms | |||
| namespace vision { | |||
| class BoundingBoxAugment; | |||
| class RandomSelectSubpolicy; | |||
| class UniformAugment; | |||
| } // namespace vision | |||
| // Abstract class to represent a tensor transform operation in the data pipeline. | |||
| /// \class TensorTransform transforms.h | |||
| /// \brief A base class to represent a tensor transform operation in the data pipeline. | |||
| class TensorTransform : public std::enable_shared_from_this<TensorTransform> { | |||
| friend class Dataset; | |||
| friend class Execute; | |||
| friend class transforms::Compose; | |||
| friend class transforms::RandomApply; | |||
| friend class transforms::RandomChoice; | |||
| friend class vision::BoundingBoxAugment; | |||
| friend class vision::RandomSelectSubpolicy; | |||
| friend class vision::UniformAugment; | |||
| public: | |||
| /// \brief Constructor | |||
| TensorTransform() {} | |||
| /// \brief Destructor | |||
| ~TensorTransform() = default; | |||
| protected: | |||
| /// \brief Pure virtual function to convert a TensorTransform class into a IR TensorOperation object. | |||
| /// \return shared pointer to the newly created TensorOperation. | |||
| virtual std::shared_ptr<TensorOperation> Parse() = 0; | |||
| /// \brief Virtual function to convert a TensorTransform class into a IR TensorOperation object. | |||
| /// \param[in] env A string to determine the running environment | |||
| /// \return shared pointer to the newly created TensorOperation. | |||
| virtual std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) { return nullptr; } | |||
| }; | |||
| /// \brief Slice object used in SliceOption. | |||
| class Slice { | |||
| public: | |||
| /// \brief Constructor, with start, stop and step default to 0. | |||
| Slice() : start_(0), stop_(0), step_(0) {} | |||
| /// \brief Constructor. | |||
| /// \param[in] start Starting integer specifying where to start the slicing. | |||
| /// \param[in] stop Ending integer specifying where to stop the slicing. | |||
| /// \param[in] step An integer specifying the step of the slicing. | |||
| Slice(dsize_t start, dsize_t stop, dsize_t step) : start_(start), stop_(stop), step_(step) {} | |||
| /// \brief Constructor, with step=1 | |||
| /// \param[in] start Starting integer specifying where to start the slicing. | |||
| /// \param[in] stop Ending integer specifying where to stop the slicing. | |||
| Slice(dsize_t start, dsize_t stop) : start_(start), stop_(stop), step_(1) {} | |||
| /// \brief Constructor, with start=0 and step=1 | |||
| /// \param[in] stop Ending integer specifying where to stop the slicing. | |||
| explicit Slice(dsize_t stop) : start_(0), stop_(stop), step_(1) {} | |||
| Slice(Slice const &slice) = default; | |||
| ~Slice() = default; | |||
| bool valid() const { return step_ != 0; } | |||
| dsize_t start_; | |||
| dsize_t stop_; | |||
| dsize_t step_; | |||
| }; | |||
| /// \brief SliceOption used in Slice Op. | |||
| class SliceOption { | |||
| public: | |||
| /// \param[in] all Slice the whole dimension | |||
| explicit SliceOption(bool all) : all_(all) {} | |||
| /// \param[in] indices Slice these indices along the dimension. Negative indices are supported. | |||
| explicit SliceOption(std::vector<dsize_t> indices) : indices_(indices) {} | |||
| /// \param[in] slice Slice the generated indices from the slice object along the dimension. | |||
| explicit SliceOption(Slice slice) : slice_(slice) {} | |||
| SliceOption(SliceOption const &slice) = default; | |||
| ~SliceOption() = default; | |||
| // only one of the following will be valid | |||
| // given indices to slice the Tensor. | |||
| std::vector<dsize_t> indices_ = {}; | |||
| // Slice object. All start, stop and step are 0 if invalid. | |||
| Slice slice_; | |||
| bool all_ = false; | |||
| }; | |||
| // Transform operations for performing data transformation. | |||
| namespace transforms { | |||
| /// \brief Compose Op. | |||
| /// \note Compose a list of transforms into a single transform. | |||
| class Compose final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of raw pointers to TensorTransform objects to be applied. | |||
| explicit Compose(const std::vector<TensorTransform *> &transforms); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of shared pointers to TensorTransform objects to be applied. | |||
| explicit Compose(const std::vector<std::shared_ptr<TensorTransform>> &transforms); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of TensorTransform objects to be applied. | |||
| explicit Compose(const std::vector<std::reference_wrapper<TensorTransform>> &transforms); | |||
| /// \brief Destructor | |||
| ~Compose() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Concatenate Op. | |||
| /// \note Tensor operation that concatenates all columns into a single tensor. | |||
| class Concatenate final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] axis Concatenate the tensors along given axis, only support 0 or -1 so far (default=0). | |||
| /// \param[in] prepend MSTensor to be prepended to the already concatenated tensors (default={}). | |||
| /// \param[in] append MSTensor to be appended to the already concatenated tensors (default={}). | |||
| explicit Concatenate(int8_t axis = 0, MSTensor prepend = {}, MSTensor append = {}); | |||
| /// \brief Destructor | |||
| ~Concatenate() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Duplicate Op. | |||
| /// \note Duplicate the input tensor to a new output tensor. | |||
| /// The input tensor is carried over to the output list. | |||
| class Duplicate final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| Duplicate(); | |||
| /// \brief Destructor | |||
| ~Duplicate() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief Fill Op. | |||
| /// \note Tensor operation to fill all elements in the tensor with the specified value. | |||
| /// The output tensor will have the same shape and type as the input tensor. | |||
| class Fill final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] fill_value Scalar value to fill the tensor with. | |||
| /// Can only be MSTensor of the following types from mindspore::DataType: | |||
| /// String, Bool, Int8/16/32/64, UInt8/16/32/64, Float16/32/64. | |||
| explicit Fill(MSTensor fill_value); | |||
| /// \brief Destructor | |||
| ~Fill() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Mask Op. | |||
| /// \note Mask content of the input tensor with the given predicate. | |||
| /// Any element of the tensor that matches the predicate will be evaluated to True, otherwise False. | |||
| class Mask final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] op One of the relational operators EQ, NE LT, GT, LE or GE. | |||
| /// \param[in] constant Constant to be compared to. | |||
| /// Can only be MSTensor of str, int, float, bool. | |||
| /// \param[in] de_type Type of the generated mask. Can only be numeric or boolean datatype. | |||
| /// (default=mindspore::DataType::kNumberTypeBool) | |||
| explicit Mask(RelationalOp op, MSTensor constant, | |||
| mindspore::DataType ms_type = mindspore::DataType(mindspore::DataType::kNumberTypeBool)); | |||
| /// \brief Destructor | |||
| ~Mask() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief OneHot Op. | |||
| /// \note Convert the labels into OneHot format. | |||
| class OneHot final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] num_classes number of classes. | |||
| explicit OneHot(int32_t num_classes); | |||
| /// \brief Destructor | |||
| ~OneHot() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief PadEnd Op. | |||
| /// \note Pad input tensor according to pad_shape, need to have same rank. | |||
| class PadEnd final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] pad_shape List of integers representing the shape needed. | |||
| /// Dimensions that set to `None` will not be padded (i.e., original dim will be used). | |||
| /// Shorter dimensions will truncate the values. | |||
| /// \param[in] pad_value Value used to pad (default={}). | |||
| explicit PadEnd(const std::vector<dsize_t> &pad_shape, MSTensor pad_value = {}); | |||
| /// \brief Destructor | |||
| ~PadEnd() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomApply Op. | |||
| /// \note Randomly perform a series of transforms with a given probability. | |||
| class RandomApply final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of raw pointers to TensorTransform objects to be applied. | |||
| /// \param[in] prob The probability to apply the transformation list (default=0.5). | |||
| explicit RandomApply(const std::vector<TensorTransform *> &transforms, double prob = 0.5); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of shared pointers to TensorTransform objects to be applied. | |||
| /// \param[in] prob The probability to apply the transformation list (default=0.5). | |||
| explicit RandomApply(const std::vector<std::shared_ptr<TensorTransform>> &transforms, double prob = 0.5); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of TensorTransform objects to be applied. | |||
| /// \param[in] prob The probability to apply the transformation list (default=0.5). | |||
| explicit RandomApply(const std::vector<std::reference_wrapper<TensorTransform>> &transforms, double prob = 0.5); | |||
| /// \brief Destructor | |||
| ~RandomApply() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomChoice Op. | |||
| /// \note Randomly selects one transform from a list of transforms to perform operation. | |||
| class RandomChoice final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of raw pointers to TensorTransform objects to be applied. | |||
| explicit RandomChoice(const std::vector<TensorTransform *> &transforms); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of shared pointers to TensorTransform objects to be applied. | |||
| explicit RandomChoice(const std::vector<std::shared_ptr<TensorTransform>> &transforms); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms A vector of TensorTransform objects to be applied. | |||
| explicit RandomChoice(const std::vector<std::reference_wrapper<TensorTransform>> &transforms); | |||
| /// \brief Destructor | |||
| ~RandomChoice() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Slice Op. | |||
| /// \note Slice operation to extract a tensor out using the given n slices. | |||
| /// The functionality of Slice is similar to NumPy's indexing feature. | |||
| /// (Currently only rank-1 tensors are supported). | |||
| class Slice final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] slice_input Vector of SliceOption | |||
| explicit Slice(const std::vector<SliceOption> &slice_input); | |||
| /// \brief Destructor | |||
| ~Slice() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief TypeCast Op. | |||
| /// \note Tensor operation to cast to a given MindSpore data type. | |||
| class TypeCast final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] data_type mindspore::DataType to be cast to. | |||
| explicit TypeCast(mindspore::DataType data_type); | |||
| /// \brief Destructor | |||
| ~TypeCast() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Unique Op. | |||
| /// \note Return an output tensor containing all the unique elements of the input tensor in | |||
| /// the same order that they occur in the input tensor. | |||
| class Unique final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| Unique(); | |||
| /// \brief Destructor | |||
| ~Unique() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| } // namespace transforms | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_TRANSFORMS_H_ | |||
| @@ -0,0 +1,955 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_H_ | |||
| #include <map> | |||
| #include <memory> | |||
| #include <string> | |||
| #include <utility> | |||
| #include <vector> | |||
| #include "include/api/dual_abi_helper.h" | |||
| #include "include/api/status.h" | |||
| #include "include/dataset/constants.h" | |||
| #include "include/dataset/transforms.h" | |||
| #include "include/dataset/vision_lite.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| class TensorOperation; | |||
| // Transform operations for performing computer vision. | |||
| namespace vision { | |||
| /// \brief AutoContrast TensorTransform. | |||
| /// \note Apply automatic contrast on input image. | |||
| class AutoContrast final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] cutoff Percent of pixels to cut off from the histogram, the valid range of cutoff value is 0 to 100. | |||
| /// \param[in] ignore Pixel values to ignore. | |||
| explicit AutoContrast(float cutoff = 0.0, std::vector<uint32_t> ignore = {}); | |||
| /// \brief Destructor. | |||
| ~AutoContrast() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief BoundingBoxAugment TensorTransform. | |||
| /// \note Apply a given image transform on a random selection of bounding box regions of a given image. | |||
| class BoundingBoxAugment final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] transform Raw pointer to a TensorTransform operation. | |||
| /// \param[in] ratio Ratio of bounding boxes to apply augmentation on. Range: [0, 1] (default=0.3). | |||
| explicit BoundingBoxAugment(TensorTransform *transform, float ratio = 0.3); | |||
| /// \brief Constructor. | |||
| /// \param[in] transform Smart pointer to a TensorTransform operation. | |||
| /// \param[in] ratio Ratio of bounding boxes to apply augmentation on. Range: [0, 1] (default=0.3). | |||
| explicit BoundingBoxAugment(const std::shared_ptr<TensorTransform> &transform, float ratio = 0.3); | |||
| /// \brief Constructor. | |||
| /// \param[in] transform Object pointer to a TensorTransform operation. | |||
| /// \param[in] ratio Ratio of bounding boxes to apply augmentation on. Range: [0, 1] (default=0.3). | |||
| explicit BoundingBoxAugment(const std::reference_wrapper<TensorTransform> transform, float ratio = 0.3); | |||
| /// \brief Destructor. | |||
| ~BoundingBoxAugment() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Constructor to apply CutMix on a batch of images. | |||
| /// \note Masks a random section of each image with the corresponding part of another randomly | |||
| /// selected image in that batch. | |||
| class CutMixBatch final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] image_batch_format The format of the batch. | |||
| /// \param[in] alpha The hyperparameter of beta distribution (default = 1.0). | |||
| /// \param[in] prob The probability by which CutMix is applied to each image (default = 1.0). | |||
| explicit CutMixBatch(ImageBatchFormat image_batch_format, float alpha = 1.0, float prob = 1.0); | |||
| /// \brief Destructor. | |||
| ~CutMixBatch() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief CutOut TensorOp. | |||
| /// \note Randomly cut (mask) out a given number of square patches from the input image. | |||
| class CutOut final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] length Integer representing the side length of each square patch. | |||
| /// \param[in] num_patches Integer representing the number of patches to be cut out of an image. | |||
| explicit CutOut(int32_t length, int32_t num_patches = 1); | |||
| /// \brief Destructor. | |||
| ~CutOut() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Equalize TensorTransform. | |||
| /// \note Apply histogram equalization on input image. | |||
| class Equalize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| Equalize(); | |||
| /// \brief Destructor. | |||
| ~Equalize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief HwcToChw TensorTransform. | |||
| /// \note Transpose the input image; shape (H, W, C) to shape (C, H, W). | |||
| class HWC2CHW final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| HWC2CHW(); | |||
| /// \brief Destructor. | |||
| ~HWC2CHW() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief Invert TensorTransform. | |||
| /// \note Apply invert on input image in RGB mode. | |||
| class Invert final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| Invert(); | |||
| /// \brief Destructor. | |||
| ~Invert() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief MixUpBatch TensorTransform. | |||
| /// \note Apply MixUp transformation on an input batch of images and labels. The labels must be in | |||
| /// one-hot format and Batch must be called before calling this function. | |||
| class MixUpBatch final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] alpha hyperparameter of beta distribution (default = 1.0). | |||
| explicit MixUpBatch(float alpha = 1); | |||
| /// \brief Destructor. | |||
| ~MixUpBatch() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief NormalizePad TensorTransform. | |||
| /// \note Normalize the input image with respect to mean and standard deviation and pad an extra | |||
| /// channel with value zero. | |||
| class NormalizePad final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] mean A vector of mean values for each channel, w.r.t channel order. | |||
| /// The mean values must be in range [0.0, 255.0]. | |||
| /// \param[in] std A vector of standard deviations for each channel, w.r.t. channel order. | |||
| /// The standard deviation values must be in range (0.0, 255.0]. | |||
| /// \param[in] dtype The output datatype of Tensor. | |||
| /// The standard deviation values must be "float32" or "float16"(default = "float32"). | |||
| explicit NormalizePad(const std::vector<float> &mean, const std::vector<float> &std, | |||
| const std::string &dtype = "float32") | |||
| : NormalizePad(mean, std, StringToChar(dtype)) {} | |||
| explicit NormalizePad(const std::vector<float> &mean, const std::vector<float> &std, const std::vector<char> &dtype); | |||
| /// \brief Destructor. | |||
| ~NormalizePad() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Pad TensorOp. | |||
| /// \note Pads the image according to padding parameters. | |||
| class Pad final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] padding A vector representing the number of pixels to pad the image | |||
| /// If vector has one value, it pads all sides of the image with that value. | |||
| /// If vector has two values, it pads left and top with the first and | |||
| /// right and bottom with the second value. | |||
| /// If vector has four values, it pads left, top, right, and bottom with | |||
| /// those values respectively. | |||
| /// \param[in] fill_value A vector representing the pixel intensity of the borders if the padding_mode is | |||
| /// BorderType.kConstant. If 1 value is provided, it is used for all RGB channels. If 3 values are provided, | |||
| /// it is used to fill R, G, B channels respectively. | |||
| /// \param[in] padding_mode The method of padding (default=BorderType.kConstant). | |||
| /// Can be any of | |||
| /// [BorderType.kConstant, BorderType.kEdge, BorderType.kReflect, BorderType.kSymmetric] | |||
| /// - BorderType.kConstant, means it fills the border with constant values | |||
| /// - BorderType.kEdge, means it pads with the last value on the edge | |||
| /// - BorderType.kReflect, means it reflects the values on the edge omitting the last value of edge | |||
| /// - BorderType.kSymmetric, means it reflects the values on the edge repeating the last value of edge | |||
| explicit Pad(std::vector<int32_t> padding, std::vector<uint8_t> fill_value = {0}, | |||
| BorderType padding_mode = BorderType::kConstant); | |||
| /// \brief Destructor. | |||
| ~Pad() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Blends an image with its grayscale version with random weights | |||
| /// t and 1 - t generated from a given range. If the range is trivial | |||
| /// then the weights are determinate and t equals the bound of the interval. | |||
| class RandomColor final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] t_lb Lower bound on the range of random weights. | |||
| /// \param[in] t_lb Upper bound on the range of random weights. | |||
| explicit RandomColor(float t_lb, float t_ub); | |||
| /// \brief Destructor. | |||
| ~RandomColor() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomColorAdjust TensorTransform. | |||
| /// \brief Randomly adjust the brightness, contrast, saturation, and hue of the input image. | |||
| class RandomColorAdjust final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] brightness Brightness adjustment factor. Must be a vector of one or two values | |||
| /// if it's a vector of two values it needs to be in the form of [min, max] (Default={1, 1}). | |||
| /// \param[in] contrast Contrast adjustment factor. Must be a vector of one or two values | |||
| /// if it's a vector of two values it needs to be in the form of [min, max] (Default={1, 1}). | |||
| /// \param[in] saturation Saturation adjustment factor. Must be a vector of one or two values | |||
| /// if it's a vector of two values it needs to be in the form of [min, max] (Default={1, 1}). | |||
| /// \param[in] hue Brightness adjustment factor. Must be a vector of one or two values | |||
| /// if it's a vector of two values it must be in the form of [min, max] where -0.5 <= min <= max <= 0.5 | |||
| /// (Default={0, 0}). | |||
| explicit RandomColorAdjust(std::vector<float> brightness = {1.0, 1.0}, std::vector<float> contrast = {1.0, 1.0}, | |||
| std::vector<float> saturation = {1.0, 1.0}, std::vector<float> hue = {0.0, 0.0}); | |||
| /// \brief Destructor. | |||
| ~RandomColorAdjust() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomCrop TensorTransform. | |||
| /// \note Crop the input image at a random location. | |||
| class RandomCrop final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| /// \param[in] padding A vector representing the number of pixels to pad the image | |||
| /// If vector has one value, it pads all sides of the image with that value. | |||
| /// If vector has two values, it pads left and top with the first and | |||
| /// right and bottom with the second value. | |||
| /// If vector has four values, it pads left, top, right, and bottom with | |||
| /// those values respectively. | |||
| /// \param[in] pad_if_needed A boolean whether to pad the image if either side is smaller than | |||
| /// the given output size. | |||
| /// \param[in] fill_value A vector representing the pixel intensity of the borders if the padding_mode is | |||
| /// BorderType.kConstant. If 1 value is provided, it is used for all RGB channels. | |||
| /// If 3 values are provided, it is used to fill R, G, B channels respectively. | |||
| explicit RandomCrop(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||
| BorderType padding_mode = BorderType::kConstant); | |||
| /// \brief Destructor. | |||
| ~RandomCrop() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomCropDecodeResize TensorTransform. | |||
| /// \note Equivalent to RandomResizedCrop, but crops before decodes. | |||
| class RandomCropDecodeResize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| /// \param[in] scale Range [min, max) of respective size of the | |||
| /// original size to be cropped (default=(0.08, 1.0)). | |||
| /// \param[in] ratio Range [min, max) of aspect ratio to be | |||
| /// cropped (default=(3. / 4., 4. / 3.)). | |||
| /// \param[in] interpolation An enum for the mode of interpolation. | |||
| /// \param[in] The maximum number of attempts to propose a valid crop_area (default=10). | |||
| /// If exceeded, fall back to use center_crop instead. | |||
| explicit RandomCropDecodeResize(std::vector<int32_t> size, std::vector<float> scale = {0.08, 1.0}, | |||
| std::vector<float> ratio = {3. / 4, 4. / 3}, | |||
| InterpolationMode interpolation = InterpolationMode::kLinear, | |||
| int32_t max_attempts = 10); | |||
| /// \brief Destructor. | |||
| ~RandomCropDecodeResize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomCropWithBBox TensorTransform. | |||
| /// \note Crop the input image at a random location and adjust bounding boxes accordingly. | |||
| /// If cropped area is out of bbox, the return bbox will be empty. | |||
| class RandomCropWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| /// \param[in] padding A vector representing the number of pixels to pad the image | |||
| /// If vector has one value, it pads all sides of the image with that value. | |||
| /// If vector has two values, it pads left and top with the first and | |||
| /// right and bottom with the second value. | |||
| /// If vector has four values, it pads left, top, right, and bottom with | |||
| /// those values respectively. | |||
| /// \param[in] pad_if_needed A boolean whether to pad the image if either side is smaller than | |||
| /// the given output size. | |||
| /// \param[in] fill_value A vector representing the pixel intensity of the borders if the padding_mode is | |||
| /// BorderType.kConstant. If 1 value is provided, it is used for all RGB channels. | |||
| /// If 3 values are provided, it is used to fill R, G, B channels respectively. | |||
| /// \param[in] padding_mode The method of padding (default=BorderType::kConstant).It can be any of | |||
| /// [BorderType::kConstant, BorderType::kEdge, BorderType::kReflect, BorderType::kSymmetric]. | |||
| explicit RandomCropWithBBox(std::vector<int32_t> size, std::vector<int32_t> padding = {0, 0, 0, 0}, | |||
| bool pad_if_needed = false, std::vector<uint8_t> fill_value = {0, 0, 0}, | |||
| BorderType padding_mode = BorderType::kConstant); | |||
| /// \brief Destructor. | |||
| ~RandomCropWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomHorizontalFlip TensorTransform. | |||
| /// \note Tensor operation to perform random horizontal flip. | |||
| class RandomHorizontalFlip final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] prob A float representing the probability of flip. | |||
| explicit RandomHorizontalFlip(float prob = 0.5); | |||
| /// \brief Destructor. | |||
| ~RandomHorizontalFlip() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomHorizontalFlipWithBBox TensorTransform. | |||
| /// \note Flip the input image horizontally, randomly with a given probability and adjust bounding boxes accordingly. | |||
| class RandomHorizontalFlipWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] prob A float representing the probability of flip. | |||
| explicit RandomHorizontalFlipWithBBox(float prob = 0.5); | |||
| /// \brief Destructor. | |||
| ~RandomHorizontalFlipWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomPosterize TensorTransform. | |||
| /// \note Tensor operation to perform random posterize. | |||
| class RandomPosterize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] bit_range - uint8_t vector representing the minimum and maximum bit in range (Default={4, 8}). | |||
| explicit RandomPosterize(const std::vector<uint8_t> &bit_range = {4, 8}); | |||
| /// \brief Destructor. | |||
| ~RandomPosterize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomResize TensorTransform. | |||
| /// \note Resize the input image using a randomly selected interpolation mode. | |||
| // the same image aspect ratio. If size has 2 values, it should be (height, width). | |||
| class RandomResize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the resized image. | |||
| /// If size is a single value, the smaller edge of the image will be resized to this value with. | |||
| explicit RandomResize(std::vector<int32_t> size); | |||
| /// \brief Destructor. | |||
| ~RandomResize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomResizeWithBBox TensorTransform. | |||
| /// \note Resize the input image using a randomly selected interpolation mode and adjust | |||
| /// bounding boxes accordingly. | |||
| class RandomResizeWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the resized image. | |||
| /// If size is a single value, the smaller edge of the image will be resized to this value with | |||
| // the same image aspect ratio. If size has 2 values, it should be (height, width). | |||
| explicit RandomResizeWithBBox(std::vector<int32_t> size); | |||
| /// \brief Destructor. | |||
| ~RandomResizeWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomResizedCrop TensorTransform. | |||
| /// \note Crop the input image to a random size and aspect ratio. | |||
| class RandomResizedCrop final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| /// \param[in] scale Range [min, max) of respective size of the original | |||
| /// size to be cropped (default=(0.08, 1.0)). | |||
| /// \param[in] ratio Range [min, max) of aspect ratio to be cropped | |||
| /// (default=(3. / 4., 4. / 3.)). | |||
| /// \param[in] interpolation Image interpolation mode (default=InterpolationMode::kLinear). | |||
| /// \param[in] max_attempts The maximum number of attempts to propose a valid. | |||
| /// crop_area (default=10). If exceeded, fall back to use center_crop instead. | |||
| explicit RandomResizedCrop(std::vector<int32_t> size, std::vector<float> scale = {0.08, 1.0}, | |||
| std::vector<float> ratio = {3. / 4., 4. / 3.}, | |||
| InterpolationMode interpolation = InterpolationMode::kLinear, int32_t max_attempts = 10); | |||
| /// \brief Destructor. | |||
| ~RandomResizedCrop() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomResizedCropWithBBox TensorTransform. | |||
| /// \note Crop the input image to a random size and aspect ratio. | |||
| /// If cropped area is out of bbox, the return bbox will be empty. | |||
| class RandomResizedCropWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| /// \param[in] scale Range [min, max) of respective size of the original | |||
| /// size to be cropped (default=(0.08, 1.0)). | |||
| /// \param[in] ratio Range [min, max) of aspect ratio to be cropped | |||
| /// (default=(3. / 4., 4. / 3.)). | |||
| /// \param[in] interpolation Image interpolation mode (default=InterpolationMode::kLinear). | |||
| /// \param[in] max_attempts The maximum number of attempts to propose a valid | |||
| /// crop_area (default=10). If exceeded, fall back to use center_crop instead. | |||
| RandomResizedCropWithBBox(std::vector<int32_t> size, std::vector<float> scale = {0.08, 1.0}, | |||
| std::vector<float> ratio = {3. / 4., 4. / 3.}, | |||
| InterpolationMode interpolation = InterpolationMode::kLinear, int32_t max_attempts = 10); | |||
| /// \brief Destructor. | |||
| ~RandomResizedCropWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomRotation TensorOp. | |||
| /// \note Rotates the image according to parameters. | |||
| class RandomRotation final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] degrees A float vector of size, representing the starting and ending degree. | |||
| /// \param[in] resample An enum for the mode of interpolation. | |||
| /// \param[in] expand A boolean representing whether the image is expanded after rotation. | |||
| /// \param[in] center A float vector of size 2, representing the x and y center of rotation. | |||
| /// \param[in] fill_value A vector representing the value to fill the area outside the transform. | |||
| /// in the output image. If 1 value is provided, it is used for all RGB channels. | |||
| /// If 3 values are provided, it is used to fill R, G, B channels respectively. | |||
| RandomRotation(std::vector<float> degrees, InterpolationMode resample = InterpolationMode::kNearestNeighbour, | |||
| bool expand = false, std::vector<float> center = {-1, -1}, | |||
| std::vector<uint8_t> fill_value = {0, 0, 0}); | |||
| /// \brief Destructor. | |||
| ~RandomRotation() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomSelectSubpolicy TensorTransform. | |||
| /// \note Choose a random sub-policy from a list to be applied on the input image. A sub-policy is a list of tuples | |||
| /// (op, prob), where op is a TensorTransform operation and prob is the probability that this op will be applied. | |||
| /// Once a sub-policy is selected, each op within the sub-policy with be applied in sequence according to its | |||
| /// probability. | |||
| class RandomSelectSubpolicy final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] policy Vector of sub-policies to choose from, in which the TensorTransform objects are raw pointers. | |||
| explicit RandomSelectSubpolicy(const std::vector<std::vector<std::pair<TensorTransform *, double>>> &policy); | |||
| /// \brief Constructor. | |||
| /// \param[in] policy Vector of sub-policies to choose from, in which the TensorTransform objects are shared pointers. | |||
| explicit RandomSelectSubpolicy( | |||
| const std::vector<std::vector<std::pair<std::shared_ptr<TensorTransform>, double>>> &policy); | |||
| /// \brief Constructor. | |||
| /// \param[in] policy Vector of sub-policies to choose from, in which the TensorTransform objects are object pointers. | |||
| explicit RandomSelectSubpolicy( | |||
| const std::vector<std::vector<std::pair<std::reference_wrapper<TensorTransform>, double>>> &policy); | |||
| /// \brief Destructor. | |||
| ~RandomSelectSubpolicy() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomSharpness TensorTransform. | |||
| /// \note Tensor operation to perform random sharpness. | |||
| class RandomSharpness final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] degrees A float vector of size 2, representing the starting and ending degree to uniformly. | |||
| /// sample from, to select a degree to adjust sharpness. | |||
| explicit RandomSharpness(std::vector<float> degrees = {0.1, 1.9}); | |||
| /// \brief Destructor. | |||
| ~RandomSharpness() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomSolarize TensorTransform. | |||
| /// \note Invert pixels randomly within specified range. If min=max, it is a single fixed magnitude operation | |||
| /// to inverts all pixel above that threshold. | |||
| class RandomSolarize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] threshold A vector with two elements specifying the pixel range to invert. | |||
| explicit RandomSolarize(std::vector<uint8_t> threshold = {0, 255}); | |||
| /// \brief Destructor. | |||
| ~RandomSolarize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomVerticalFlip TensorTransform. | |||
| /// \note Tensor operation to perform random vertical flip. | |||
| class RandomVerticalFlip final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] prob A float representing the probability of flip. | |||
| explicit RandomVerticalFlip(float prob = 0.5); | |||
| /// \brief Destructor. | |||
| ~RandomVerticalFlip() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomVerticalFlipWithBBox TensorTransform. | |||
| /// \note Flip the input image vertically, randomly with a given probability and adjust bounding boxes accordingly. | |||
| class RandomVerticalFlipWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] prob A float representing the probability of flip. | |||
| explicit RandomVerticalFlipWithBBox(float prob = 0.5); | |||
| /// \brief Destructor. | |||
| ~RandomVerticalFlipWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RescaleOperation TensorTransform. | |||
| /// \note Tensor operation to rescale the input image. | |||
| class Rescale final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] rescale Rescale factor. | |||
| /// \param[in] shift Shift factor. | |||
| Rescale(float rescale, float shift); | |||
| /// \brief Destructor. | |||
| ~Rescale() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief ResizeWithBBox TensorTransform. | |||
| /// \note Resize the input image to the given size and adjust bounding boxes accordingly. | |||
| class ResizeWithBBox final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size The output size of the resized image. | |||
| /// If size is an integer, smaller edge of the image will be resized to this value with the same image aspect | |||
| /// ratio. If size is a sequence of length 2, it should be (height, width). | |||
| /// \param[in] interpolation An enum for the mode of interpolation (default=InterpolationMode::kLinear). | |||
| explicit ResizeWithBBox(std::vector<int32_t> size, InterpolationMode interpolation = InterpolationMode::kLinear); | |||
| /// \brief Destructor. | |||
| ~ResizeWithBBox() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RgbaToBgr TensorTransform. | |||
| /// \note Changes the input 4 channel RGBA tensor to 3 channel BGR. | |||
| class RGBA2BGR final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| RGBA2BGR(); | |||
| /// \brief Destructor. | |||
| ~RGBA2BGR() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief RgbaToRgb TensorTransform. | |||
| /// \note Changes the input 4 channel RGBA tensor to 3 channel RGB. | |||
| class RGBA2RGB final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| RGBA2RGB(); | |||
| /// \brief Destructor. | |||
| ~RGBA2RGB() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief SoftDvppDecodeRandomCropResizeJpeg TensorTransform. | |||
| /// \note Tensor operation to decode, random crop and resize JPEG image using the simulation algorithm of | |||
| /// Ascend series chip DVPP module. The usage scenario is consistent with SoftDvppDecodeResizeJpeg. | |||
| /// The input image size should be in range [32*32, 8192*8192]. | |||
| /// The zoom-out and zoom-in multiples of the image length and width should in the range [1/32, 16]. | |||
| /// Only images with an even resolution can be output. The output of odd resolution is not supported. | |||
| class SoftDvppDecodeRandomCropResizeJpeg final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the resized image. | |||
| /// If size is a single value, smaller edge of the image will be resized to this value with | |||
| /// the same image aspect ratio. If size has 2 values, it should be (height, width). | |||
| /// \param[in] scale Range [min, max) of respective size of the original | |||
| /// size to be cropped (default=(0.08, 1.0)). | |||
| /// \param[in] ratio Range [min, max) of aspect ratio to be cropped | |||
| /// (default=(3. / 4., 4. / 3.)). | |||
| /// \param[in] max_attempts The maximum number of attempts to propose a valid | |||
| /// crop_area (default=10). If exceeded, fall back to use center_crop instead. | |||
| SoftDvppDecodeRandomCropResizeJpeg(std::vector<int32_t> size, std::vector<float> scale = {0.08, 1.0}, | |||
| std::vector<float> ratio = {3. / 4., 4. / 3.}, int32_t max_attempts = 10); | |||
| /// \brief Destructor. | |||
| ~SoftDvppDecodeRandomCropResizeJpeg() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief SoftDvppDecodeResizeJpeg TensorTransform. | |||
| /// \note Tensor operation to decode and resize JPEG image using the simulation algorithm of Ascend series | |||
| /// chip DVPP module. It is recommended to use this algorithm in the following scenarios: | |||
| /// When training, the DVPP of the Ascend chip is not used, | |||
| /// and the DVPP of the Ascend chip is used during inference, | |||
| /// and the accuracy of inference is lower than the accuracy of training; | |||
| /// and the input image size should be in range [32*32, 8192*8192]. | |||
| /// The zoom-out and zoom-in multiples of the image length and width should in the range [1/32, 16]. | |||
| /// Only images with an even resolution can be output. The output of odd resolution is not supported. | |||
| class SoftDvppDecodeResizeJpeg final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the resized image. | |||
| /// If size is a single value, smaller edge of the image will be resized to this value with | |||
| /// the same image aspect ratio. If size has 2 values, it should be (height, width). | |||
| explicit SoftDvppDecodeResizeJpeg(std::vector<int32_t> size); | |||
| /// \brief Destructor. | |||
| ~SoftDvppDecodeResizeJpeg() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief SwapRedBlue TensorOp. | |||
| /// \note Swaps the red and blue channels in image. | |||
| class SwapRedBlue final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| SwapRedBlue(); | |||
| /// \brief Destructor. | |||
| ~SwapRedBlue() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief UniformAugment TensorTransform. | |||
| /// \note Tensor operation to perform randomly selected augmentation. | |||
| class UniformAugment final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms Raw pointer to vector of TensorTransform operations. | |||
| /// \param[in] num_ops An integer representing the number of OPs to be selected and applied. | |||
| explicit UniformAugment(const std::vector<TensorTransform *> &transforms, int32_t num_ops = 2); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms Smart pointer to vector of TensorTransform operations. | |||
| /// \param[in] num_ops An integer representing the number of OPs to be selected and applied. | |||
| explicit UniformAugment(const std::vector<std::shared_ptr<TensorTransform>> &transforms, int32_t num_ops = 2); | |||
| /// \brief Constructor. | |||
| /// \param[in] transforms Object pointer to vector of TensorTransform operations. | |||
| /// \param[in] num_ops An integer representing the number of OPs to be selected and applied. | |||
| explicit UniformAugment(const std::vector<std::reference_wrapper<TensorTransform>> &transforms, int32_t num_ops = 2); | |||
| /// \brief Destructor. | |||
| ~UniformAugment() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| } // namespace vision | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_H_ | |||
| @@ -0,0 +1,100 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_ASCEND_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_ASCEND_H_ | |||
| #include <map> | |||
| #include <memory> | |||
| #include <string> | |||
| #include <utility> | |||
| #include <vector> | |||
| #include "include/api/status.h" | |||
| #include "include/dataset/constants.h" | |||
| #include "include/dataset/transforms.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Transform operations for performing computer vision. | |||
| namespace vision { | |||
| /* ##################################### API class ###########################################*/ | |||
| class DvppDecodeResizeJpeg final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] resize A vector of int value for each dimension, w.r.t H,W order. | |||
| explicit DvppDecodeResizeJpeg(std::vector<uint32_t> resize); | |||
| /// \brief Destructor. | |||
| ~DvppDecodeResizeJpeg() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| class DvppDecodeResizeCropJpeg final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] crop A vector of int value for each dimension after final crop, w.r.t H,W order. | |||
| /// \param[in] resize A vector of int value for each dimension after resize, w.r.t H,W order. | |||
| explicit DvppDecodeResizeCropJpeg(std::vector<uint32_t> crop, std::vector<uint32_t> resize); | |||
| /// \brief Destructor. | |||
| ~DvppDecodeResizeCropJpeg() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| class DvppDecodePng final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| DvppDecodePng(); | |||
| /// \brief Destructor. | |||
| ~DvppDecodePng() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| }; | |||
| } // namespace vision | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_ASCEND_H_ | |||
| @@ -0,0 +1,292 @@ | |||
| /** | |||
| * Copyright 2020-2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_LITE_H_ | |||
| #define MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_LITE_H_ | |||
| #include <map> | |||
| #include <memory> | |||
| #include <string> | |||
| #include <utility> | |||
| #include <vector> | |||
| #include "include/api/status.h" | |||
| #include "include/dataset/constants.h" | |||
| #include "include/dataset/transforms.h" | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| // Transform operations for performing computer vision. | |||
| namespace vision { | |||
| // Forward Declarations | |||
| class RotateOperation; | |||
| /// \brief Affine TensorTransform. | |||
| /// \note Apply affine transform on input image. | |||
| class Affine final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] degrees The degrees to rotate the image by. | |||
| /// \param[in] translation The value representing vertical and horizontal translation (default = {0.0, 0.0}). | |||
| /// The first value represent the x axis translation while the second represents y axis translation. | |||
| /// \param[in] scale The scaling factor for the image (default = 0.0). | |||
| /// \param[in] shear A float vector of size 2, representing the shear degrees (default = {0.0, 0.0}). | |||
| /// \param[in] interpolation An enum for the mode of interpolation. | |||
| /// \param[in] fill_value A vector representing the value to fill the area outside the transform | |||
| /// in the output image. If 1 value is provided, it is used for all RGB channels. | |||
| /// If 3 values are provided, it is used to fill R, G, B channels respectively. | |||
| explicit Affine(float_t degrees, const std::vector<float> &translation = {0.0, 0.0}, float scale = 0.0, | |||
| const std::vector<float> &shear = {0.0, 0.0}, | |||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||
| /// \brief Destructor. | |||
| ~Affine() = default; | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief CenterCrop TensorTransform. | |||
| /// \note Crops the input image at the center to the given size. | |||
| class CenterCrop final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the cropped image. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| explicit CenterCrop(std::vector<int32_t> size); | |||
| /// \brief Destructor. | |||
| ~CenterCrop() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RGB2GRAY TensorTransform. | |||
| /// \note Convert RGB image or color image to grayscale image. | |||
| class RGB2GRAY final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| RGB2GRAY() = default; | |||
| /// \brief Destructor. | |||
| ~RGB2GRAY() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| }; | |||
| /// \brief Crop TensorTransform. | |||
| /// \note Crop an image based on location and crop size. | |||
| class Crop final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] coordinates Starting location of crop. Must be a vector of two values, in the form of {x_coor, y_coor}. | |||
| /// \param[in] size Size of the cropped area. | |||
| /// If size is a single value, a square crop of size (size, size) is returned. | |||
| /// If size has 2 values, it should be (height, width). | |||
| Crop(std::vector<int32_t> coordinates, std::vector<int32_t> size); | |||
| /// \brief Destructor. | |||
| ~Crop() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Decode TensorTransform. | |||
| /// \note Decode the input image in RGB mode. | |||
| class Decode final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] rgb A boolean of whether to decode in RGB mode or not. | |||
| explicit Decode(bool rgb = true); | |||
| /// \brief Destructor. | |||
| ~Decode() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Normalize TensorTransform. | |||
| /// \note Normalize the input image with respect to mean and standard deviation. | |||
| class Normalize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] mean A vector of mean values for each channel, w.r.t channel order. | |||
| /// The mean values must be in range [0.0, 255.0]. | |||
| /// \param[in] std A vector of standard deviations for each channel, w.r.t. channel order. | |||
| /// The standard deviation values must be in range (0.0, 255.0]. | |||
| Normalize(std::vector<float> mean, std::vector<float> std); | |||
| /// \brief Destructor. | |||
| ~Normalize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief RandomAffine TensorTransform. | |||
| /// \note Applies a Random Affine transformation on input image in RGB or Greyscale mode. | |||
| class RandomAffine final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] degrees A float vector of size 2, representing the starting and ending degree. | |||
| /// \param[in] translate_range A float vector of size 2 or 4, representing percentages of translation on x and y axes. | |||
| /// If size is 2, (min_dx, max_dx, 0, 0). | |||
| /// if size is 4, (min_dx, max_dx, min_dy, max_dy), | |||
| /// all values are in range [-1, 1]. | |||
| /// \param[in] scale_range A float vector of size 2, representing the starting and ending scales in the range. | |||
| /// \param[in] shear_ranges A float vector of size 2 or 4, representing the starting and ending shear degrees | |||
| /// vertically and horizontally. | |||
| /// If size is 2, (min_shear_x, max_shear_x, 0, 0), | |||
| /// if size is 4, (min_shear_x, max_shear_x, min_shear_y, max_shear_y). | |||
| /// \param[in] interpolation An enum for the mode of interpolation. | |||
| /// \param[in] fill_value A vector representing the value to fill the area outside the transform | |||
| /// in the output image. If 1 value is provided, it is used for all RGB channels. | |||
| /// If 3 values are provided, it is used to fill R, G, B channels respectively. | |||
| explicit RandomAffine(const std::vector<float_t> °rees, | |||
| const std::vector<float_t> &translate_range = {0.0, 0.0, 0.0, 0.0}, | |||
| const std::vector<float_t> &scale_range = {1.0, 1.0}, | |||
| const std::vector<float_t> &shear_ranges = {0.0, 0.0, 0.0, 0.0}, | |||
| InterpolationMode interpolation = InterpolationMode::kNearestNeighbour, | |||
| const std::vector<uint8_t> &fill_value = {0, 0, 0}); | |||
| /// \brief Destructor. | |||
| ~RandomAffine() = default; | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Resize TensorTransform. | |||
| /// \note Resize the input image to the given size. | |||
| class Resize final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] size A vector representing the output size of the resized image. | |||
| /// If size is a single value, the image will be resized to this value with | |||
| /// the same image aspect ratio. If size has 2 values, it should be (height, width). | |||
| /// \param[in] interpolation An enum for the mode of interpolation. | |||
| explicit Resize(std::vector<int32_t> size, InterpolationMode interpolation = InterpolationMode::kLinear); | |||
| /// \brief Destructor. | |||
| ~Resize() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| std::shared_ptr<TensorOperation> Parse(const MapTargetDevice &env) override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief ResizePreserveAR TensorTransform. | |||
| /// \note Keep the original picture ratio and fill the rest. | |||
| class ResizePreserveAR final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| /// \param[in] height The height of image output value after resizing. | |||
| /// \param[in] width The width of image output value after resizing. | |||
| /// \param[in] img_orientation Angle method of image rotation. | |||
| ResizePreserveAR(int32_t height, int32_t width, int32_t img_orientation = 0); | |||
| /// \brief Destructor. | |||
| ~ResizePreserveAR() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| struct Data; | |||
| std::shared_ptr<Data> data_; | |||
| }; | |||
| /// \brief Rotate TensorTransform. | |||
| /// \note Rotate the input image using a specified angle id. | |||
| class Rotate final : public TensorTransform { | |||
| public: | |||
| /// \brief Constructor. | |||
| Rotate(); | |||
| /// \brief Destructor. | |||
| ~Rotate() = default; | |||
| protected: | |||
| /// \brief Function to convert TensorTransform object into a TensorOperation object. | |||
| /// \return Shared pointer to TensorOperation object. | |||
| std::shared_ptr<TensorOperation> Parse() override; | |||
| private: | |||
| std::shared_ptr<RotateOperation> op_; | |||
| }; | |||
| } // namespace vision | |||
| } // namespace dataset | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_CCSRC_MINDDATA_DATASET_INCLUDE_DATASET_VISION_LITE_H_ | |||
| @@ -28,7 +28,7 @@ namespace mindspore { | |||
| namespace dataset { | |||
| class FillOp : public TensorOp { | |||
| public: | |||
| explicit FillOp(std::shared_ptr<Tensor> value) : fill_value_(value) {} | |||
| explicit FillOp(std::shared_ptr<Tensor> fill_value) : fill_value_(fill_value) {} | |||
| ~FillOp() override = default; | |||
| @@ -59,7 +59,7 @@ Status RandomApplyOp::Compute(const TensorRow &input, TensorRow *output) { | |||
| } | |||
| return Status::OK(); | |||
| } | |||
| RandomApplyOp::RandomApplyOp(double prob, const std::vector<std::shared_ptr<TensorOp>> &ops) | |||
| RandomApplyOp::RandomApplyOp(const std::vector<std::shared_ptr<TensorOp>> &ops, double prob) | |||
| : prob_(prob), gen_(GetSeed()), rand_double_(0, 1) { | |||
| compose_ = std::make_unique<ComposeOp>(ops); | |||
| is_deterministic_ = false; | |||
| @@ -33,9 +33,9 @@ namespace dataset { | |||
| class RandomApplyOp : public TensorOp { | |||
| public: | |||
| /// constructor | |||
| /// \param[in] prob probability whether the list of TensorOps will be applied | |||
| /// \param[in] ops the list of TensorOps to apply with prob likelihood | |||
| explicit RandomApplyOp(double prob, const std::vector<std::shared_ptr<TensorOp>> &ops); | |||
| /// \param[in] prob probability whether the list of TensorOps will be applied | |||
| explicit RandomApplyOp(const std::vector<std::shared_ptr<TensorOp>> &ops, double prob); | |||
| /// default destructor | |||
| ~RandomApplyOp() = default; | |||
| @@ -31,7 +31,7 @@ namespace dataset { | |||
| class SliceOp : public TensorOp { | |||
| public: | |||
| explicit SliceOp(std::vector<SliceOption> slice_options) : slice_options_(slice_options) {} | |||
| explicit SliceOp(std::vector<SliceOption> slice_input) : slice_options_(slice_input) {} | |||
| explicit SliceOp(SliceOption slice_option) { slice_options_.push_back(slice_option); } | |||
| // short hand notation for slicing along fist dimension | |||
| explicit SliceOp(Slice slice) { slice_options_.push_back(SliceOption(slice)); } | |||
| @@ -26,7 +26,7 @@ namespace mindspore { | |||
| namespace dataset { | |||
| const bool DecodeOp::kDefRgbFormat = true; | |||
| DecodeOp::DecodeOp(bool is_rgb_format) : is_rgb_format_(is_rgb_format) { | |||
| DecodeOp::DecodeOp(bool rgb) : is_rgb_format_(rgb) { | |||
| if (is_rgb_format_) { // RGB colour mode | |||
| MS_LOG(DEBUG) << "Decode colour mode is RGB."; | |||
| } else { | |||
| @@ -31,7 +31,7 @@ class DecodeOp : public TensorOp { | |||
| // Default values, also used by python_bindings.cc | |||
| static const bool kDefRgbFormat; | |||
| explicit DecodeOp(bool is_rgb_format = true); | |||
| explicit DecodeOp(bool rgb = true); | |||
| ~DecodeOp() = default; | |||
| @@ -26,13 +26,13 @@ const uint8_t PadOp::kDefFillR = 0; | |||
| const uint8_t PadOp::kDefFillG = 0; | |||
| const uint8_t PadOp::kDefFillB = 0; | |||
| PadOp::PadOp(int32_t pad_top, int32_t pad_bottom, int32_t pad_left, int32_t pad_right, BorderType border_types, | |||
| PadOp::PadOp(int32_t pad_top, int32_t pad_bottom, int32_t pad_left, int32_t pad_right, BorderType padding_mode, | |||
| uint8_t fill_r, uint8_t fill_g, uint8_t fill_b) | |||
| : pad_top_(pad_top), | |||
| pad_bottom_(pad_bottom), | |||
| pad_left_(pad_left), | |||
| pad_right_(pad_right), | |||
| boarder_type_(border_types), | |||
| boarder_type_(padding_mode), | |||
| fill_r_(fill_r), | |||
| fill_g_(fill_g), | |||
| fill_b_(fill_b) {} | |||
| @@ -40,11 +40,11 @@ class PadOp : public TensorOp { | |||
| // @param pad_bottom number of pixels to pad the bottom of the image with. | |||
| // @param pad_left number of pixels to pad the left of the image with. | |||
| // @param pad_right number of pixels to pad the right of the image with. | |||
| // @param border_types BorderType enum, the type of boarders that we are using. | |||
| // @param padding_mode BorderType enum, the type of boarders that we are using. | |||
| // @param fill_r R value for the color to pad with. | |||
| // @param fill_g G value for the color to pad with. | |||
| // @param fill_b B value for the color to pad with. | |||
| PadOp(int32_t pad_top, int32_t pad_bottom, int32_t pad_left, int32_t pad_right, BorderType border_types, | |||
| PadOp(int32_t pad_top, int32_t pad_bottom, int32_t pad_left, int32_t pad_right, BorderType padding_mode, | |||
| uint8_t fill_r = kDefFillR, uint8_t fill_g = kDefFillG, uint8_t fill_b = kDefFillB); | |||
| ~PadOp() override = default; | |||
| @@ -31,7 +31,7 @@ const int32_t RandomCropAndResizeOp::kDefMaxIter = 10; | |||
| RandomCropAndResizeOp::RandomCropAndResizeOp(int32_t target_height, int32_t target_width, float scale_lb, | |||
| float scale_ub, float aspect_lb, float aspect_ub, | |||
| InterpolationMode interpolation, int32_t max_iter) | |||
| InterpolationMode interpolation, int32_t max_attempts) | |||
| : target_height_(target_height), | |||
| target_width_(target_width), | |||
| rnd_scale_(scale_lb, scale_ub), | |||
| @@ -39,7 +39,7 @@ RandomCropAndResizeOp::RandomCropAndResizeOp(int32_t target_height, int32_t targ | |||
| interpolation_(interpolation), | |||
| aspect_lb_(aspect_lb), | |||
| aspect_ub_(aspect_ub), | |||
| max_iter_(max_iter) { | |||
| max_iter_(max_attempts) { | |||
| rnd_.seed(GetSeed()); | |||
| is_deterministic_ = false; | |||
| } | |||
| @@ -40,7 +40,7 @@ class RandomCropAndResizeOp : public TensorOp { | |||
| RandomCropAndResizeOp(int32_t target_height, int32_t target_width, float scale_lb = kDefScaleLb, | |||
| float scale_ub = kDefScaleUb, float aspect_lb = kDefAspectLb, float aspect_ub = kDefAspectUb, | |||
| InterpolationMode interpolation = kDefInterpolation, int32_t max_iter = kDefMaxIter); | |||
| InterpolationMode interpolation = kDefInterpolation, int32_t max_attempts = kDefMaxIter); | |||
| RandomCropAndResizeOp() = default; | |||
| @@ -28,9 +28,9 @@ class RandomCropAndResizeWithBBoxOp : public RandomCropAndResizeOp { | |||
| RandomCropAndResizeWithBBoxOp(int32_t target_height, int32_t target_width, float scale_lb = kDefScaleLb, | |||
| float scale_ub = kDefScaleUb, float aspect_lb = kDefAspectLb, | |||
| float aspect_ub = kDefAspectUb, InterpolationMode interpolation = kDefInterpolation, | |||
| int32_t max_iter = kDefMaxIter) | |||
| int32_t max_attempts = kDefMaxIter) | |||
| : RandomCropAndResizeOp(target_height, target_width, scale_lb, scale_ub, aspect_lb, aspect_ub, interpolation, | |||
| max_iter) {} | |||
| max_attempts) {} | |||
| ~RandomCropAndResizeWithBBoxOp() override = default; | |||
| @@ -23,9 +23,9 @@ namespace mindspore { | |||
| namespace dataset { | |||
| RandomCropDecodeResizeOp::RandomCropDecodeResizeOp(int32_t target_height, int32_t target_width, float scale_lb, | |||
| float scale_ub, float aspect_lb, float aspect_ub, | |||
| InterpolationMode interpolation, int32_t max_iter) | |||
| InterpolationMode interpolation, int32_t max_attempts) | |||
| : RandomCropAndResizeOp(target_height, target_width, scale_lb, scale_ub, aspect_lb, aspect_ub, interpolation, | |||
| max_iter) {} | |||
| max_attempts) {} | |||
| Status RandomCropDecodeResizeOp::Compute(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *output) { | |||
| if (input == nullptr) { | |||
| @@ -33,7 +33,7 @@ class RandomCropDecodeResizeOp : public RandomCropAndResizeOp { | |||
| public: | |||
| RandomCropDecodeResizeOp(int32_t target_height, int32_t target_width, float scale_lb = kDefScaleLb, | |||
| float scale_ub = kDefScaleUb, float aspect_lb = kDefAspectLb, float aspect_ub = kDefAspectUb, | |||
| InterpolationMode interpolation = kDefInterpolation, int32_t max_iter = kDefMaxIter); | |||
| InterpolationMode interpolation = kDefInterpolation, int32_t max_attempts = kDefMaxIter); | |||
| explicit RandomCropDecodeResizeOp(const RandomCropAndResizeOp &rhs) : RandomCropAndResizeOp(rhs) {} | |||
| @@ -33,7 +33,7 @@ const uint8_t RandomCropOp::kDefFillG = 0; | |||
| const uint8_t RandomCropOp::kDefFillB = 0; | |||
| RandomCropOp::RandomCropOp(int32_t crop_height, int32_t crop_width, int32_t pad_top, int32_t pad_bottom, | |||
| int32_t pad_left, int32_t pad_right, BorderType border_types, bool pad_if_needed, | |||
| int32_t pad_left, int32_t pad_right, bool pad_if_needed, BorderType padding_mode, | |||
| uint8_t fill_r, uint8_t fill_g, uint8_t fill_b) | |||
| : crop_height_(crop_height), | |||
| crop_width_(crop_width), | |||
| @@ -42,7 +42,7 @@ RandomCropOp::RandomCropOp(int32_t crop_height, int32_t crop_width, int32_t pad_ | |||
| pad_left_(pad_left), | |||
| pad_right_(pad_right), | |||
| pad_if_needed_(pad_if_needed), | |||
| border_type_(border_types), | |||
| border_type_(padding_mode), | |||
| fill_r_(fill_r), | |||
| fill_g_(fill_g), | |||
| fill_b_(fill_b) { | |||
| @@ -43,7 +43,7 @@ class RandomCropOp : public TensorOp { | |||
| RandomCropOp(int32_t crop_height, int32_t crop_width, int32_t pad_top = kDefPadTop, | |||
| int32_t pad_bottom = kDefPadBottom, int32_t pad_left = kDefPadLeft, int32_t pad_right = kDefPadRight, | |||
| BorderType border_types = kDefBorderType, bool pad_if_needed = kDefPadIfNeeded, | |||
| bool pad_if_needed = kDefPadIfNeeded, BorderType padding_mode = kDefBorderType, | |||
| uint8_t fill_r = kDefFillR, uint8_t fill_g = kDefFillG, uint8_t fill_b = kDefFillB); | |||
| RandomCropOp(const RandomCropOp &rhs) = default; | |||
| @@ -29,10 +29,10 @@ class RandomCropWithBBoxOp : public RandomCropOp { | |||
| // Constructor for RandomCropWithBBoxOp, with default value and passing to base class constructor | |||
| RandomCropWithBBoxOp(int32_t crop_height, int32_t crop_width, int32_t pad_top = kDefPadTop, | |||
| int32_t pad_bottom = kDefPadBottom, int32_t pad_left = kDefPadLeft, | |||
| int32_t pad_right = kDefPadRight, BorderType border_types = kDefBorderType, | |||
| bool pad_if_needed = kDefPadIfNeeded, uint8_t fill_r = kDefFillR, uint8_t fill_g = kDefFillG, | |||
| int32_t pad_right = kDefPadRight, bool pad_if_needed = kDefPadIfNeeded, | |||
| BorderType padding_mode = kDefBorderType, uint8_t fill_r = kDefFillR, uint8_t fill_g = kDefFillG, | |||
| uint8_t fill_b = kDefFillB) | |||
| : RandomCropOp(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, border_types, pad_if_needed, | |||
| : RandomCropOp(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, pad_if_needed, padding_mode, | |||
| fill_r, fill_g, fill_b) {} | |||
| ~RandomCropWithBBoxOp() override = default; | |||
| @@ -32,7 +32,7 @@ class RandomHorizontalFlipOp : public TensorOp { | |||
| // Default values, also used by python_bindings.cc | |||
| static const float kDefProbability; | |||
| explicit RandomHorizontalFlipOp(float probability = kDefProbability) : distribution_(probability) { | |||
| explicit RandomHorizontalFlipOp(float prob = kDefProbability) : distribution_(prob) { | |||
| is_deterministic_ = false; | |||
| rnd_.seed(GetSeed()); | |||
| } | |||
| @@ -33,14 +33,13 @@ const uint8_t RandomRotationOp::kDefFillG = 0; | |||
| const uint8_t RandomRotationOp::kDefFillB = 0; | |||
| // constructor | |||
| RandomRotationOp::RandomRotationOp(float start_degree, float end_degree, float center_x, float center_y, | |||
| InterpolationMode interpolation, bool expand, uint8_t fill_r, uint8_t fill_g, | |||
| uint8_t fill_b) | |||
| RandomRotationOp::RandomRotationOp(float start_degree, float end_degree, InterpolationMode resample, bool expand, | |||
| float center_x, float center_y, uint8_t fill_r, uint8_t fill_g, uint8_t fill_b) | |||
| : degree_start_(start_degree), | |||
| degree_end_(end_degree), | |||
| center_x_(center_x), | |||
| center_y_(center_y), | |||
| interpolation_(interpolation), | |||
| interpolation_(resample), | |||
| expand_(expand), | |||
| fill_r_(fill_r), | |||
| fill_g_(fill_g), | |||
| @@ -42,18 +42,18 @@ class RandomRotationOp : public TensorOp { | |||
| // Constructor for RandomRotationOp | |||
| // @param startDegree starting range for random degree | |||
| // @param endDegree ending range for random degree | |||
| // @param centerX x coordinate for center of image rotation | |||
| // @param centerY y coordinate for center of image rotation | |||
| // @param interpolation DE interpolation mode for rotation | |||
| // @param expand option for the output image shape to change | |||
| // @param center_x coordinate for center of image rotation | |||
| // @param center_y coordinate for center of image rotation | |||
| // @param fill_r R value for the color to pad with | |||
| // @param fill_g G value for the color to pad with | |||
| // @param fill_b B value for the color to pad with | |||
| // @details the randomly chosen degree is uniformly distributed | |||
| // @details the output shape, if changed, will contain the entire rotated image | |||
| // @note maybe using unsigned long int isn't the best here according to our coding rules | |||
| RandomRotationOp(float start_degree, float end_degree, float center_x = kDefCenterX, float center_y = kDefCenterY, | |||
| InterpolationMode interpolation = kDefInterpolation, bool expand = kDefExpand, | |||
| RandomRotationOp(float start_degree, float end_degree, InterpolationMode resample = kDefInterpolation, | |||
| bool expand = kDefExpand, float center_x = kDefCenterX, float center_y = kDefCenterY, | |||
| uint8_t fill_r = kDefFillR, uint8_t fill_g = kDefFillG, uint8_t fill_b = kDefFillB); | |||
| ~RandomRotationOp() override = default; | |||
| @@ -32,7 +32,7 @@ class RandomVerticalFlipOp : public TensorOp { | |||
| // Default values, also used by python_bindings.cc | |||
| static const float kDefProbability; | |||
| explicit RandomVerticalFlipOp(float probability = kDefProbability) : distribution_(probability) { | |||
| explicit RandomVerticalFlipOp(float prob = kDefProbability) : distribution_(prob) { | |||
| rnd_.seed(GetSeed()); | |||
| is_deterministic_ = false; | |||
| } | |||
| @@ -28,7 +28,7 @@ namespace mindspore { | |||
| namespace dataset { | |||
| class RescaleOp : public TensorOp { | |||
| public: | |||
| RescaleOp(float rescale_ratio, float shift_ratio) : rescale_(rescale_ratio), shift_(shift_ratio) {} | |||
| RescaleOp(float rescale, float shift) : rescale_(rescale), shift_(shift) {} | |||
| ~RescaleOp() override = default; | |||
| @@ -45,8 +45,8 @@ class ResizeOp : public TensorOp { | |||
| // @param size2: the second size of output. If this is also provided, the output size | |||
| // will be (size1, size2) | |||
| // @param InterpolationMode: the interpolation mode being used. | |||
| explicit ResizeOp(int32_t size1, int32_t size2 = kDefWidth, InterpolationMode mInterpolation = kDefInterpolation) | |||
| : size1_(size1), size2_(size2), interpolation_(mInterpolation) {} | |||
| explicit ResizeOp(int32_t size1, int32_t size2 = kDefWidth, InterpolationMode interpolation = kDefInterpolation) | |||
| : size1_(size1), size2_(size2), interpolation_(interpolation) {} | |||
| ResizeOp(const ResizeOp &rhs) = default; | |||
| @@ -27,9 +27,9 @@ namespace dataset { | |||
| SoftDvppDecodeRandomCropResizeJpegOp::SoftDvppDecodeRandomCropResizeJpegOp(int32_t target_height, int32_t target_width, | |||
| float scale_lb, float scale_ub, | |||
| float aspect_lb, float aspect_ub, | |||
| int32_t max_iter) | |||
| int32_t max_attempts) | |||
| : RandomCropAndResizeOp(target_height, target_width, scale_lb, scale_ub, aspect_lb, aspect_ub, | |||
| InterpolationMode::kLinear, max_iter) {} | |||
| InterpolationMode::kLinear, max_attempts) {} | |||
| Status SoftDvppDecodeRandomCropResizeJpegOp::GetCropInfo(const std::shared_ptr<Tensor> &input, | |||
| SoftDpCropInfo *crop_info) { | |||
| @@ -32,7 +32,7 @@ class SoftDvppDecodeRandomCropResizeJpegOp : public RandomCropAndResizeOp { | |||
| public: | |||
| SoftDvppDecodeRandomCropResizeJpegOp(int32_t target_height, int32_t target_width, float scale_lb = kDefScaleLb, | |||
| float scale_ub = kDefScaleUb, float aspect_lb = kDefAspectLb, | |||
| float aspect_ub = kDefAspectUb, int32_t max_iter = kDefMaxIter); | |||
| float aspect_ub = kDefAspectUb, int32_t max_attempts = kDefMaxIter); | |||
| /// \brief Destructor | |||
| ~SoftDvppDecodeRandomCropResizeJpegOp() = default; | |||
| @@ -131,9 +131,7 @@ Status FillOperation::ValidateParams() { | |||
| std::shared_ptr<TensorOp> FillOperation::Build() { return std::make_shared<FillOp>(fill_value_); } | |||
| Status FillOperation::to_json(nlohmann::json *out_json) { | |||
| nlohmann::json args; | |||
| args["fill_value"] = fill_value_->ToString(); | |||
| *out_json = args; | |||
| RETURN_IF_NOT_OK(fill_value_->to_json(out_json)); | |||
| return Status::OK(); | |||
| } | |||
| @@ -218,7 +216,7 @@ std::shared_ptr<TensorOp> RandomApplyOperation::Build() { | |||
| std::vector<std::shared_ptr<TensorOp>> tensor_ops; | |||
| (void)std::transform(transforms_.begin(), transforms_.end(), std::back_inserter(tensor_ops), | |||
| [](std::shared_ptr<TensorOperation> op) -> std::shared_ptr<TensorOp> { return op->Build(); }); | |||
| return std::make_shared<RandomApplyOp>(prob_, tensor_ops); | |||
| return std::make_shared<RandomApplyOp>(tensor_ops, prob_); | |||
| } | |||
| // RandomChoiceOperation | |||
| @@ -97,7 +97,7 @@ std::shared_ptr<TensorOp> RandomCropOperation::Build() { | |||
| } | |||
| auto tensor_op = std::make_shared<RandomCropOp>(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, | |||
| padding_mode_, pad_if_needed_, fill_r, fill_g, fill_b); | |||
| pad_if_needed_, padding_mode_, fill_r, fill_g, fill_b); | |||
| return tensor_op; | |||
| } | |||
| @@ -98,7 +98,7 @@ std::shared_ptr<TensorOp> RandomCropWithBBoxOperation::Build() { | |||
| auto tensor_op = | |||
| std::make_shared<RandomCropWithBBoxOp>(crop_height, crop_width, pad_top, pad_bottom, pad_left, pad_right, | |||
| padding_mode_, pad_if_needed_, fill_r, fill_g, fill_b); | |||
| pad_if_needed_, padding_mode_, fill_r, fill_g, fill_b); | |||
| return tensor_op; | |||
| } | |||
| @@ -31,8 +31,7 @@ namespace vision { | |||
| #ifndef ENABLE_ANDROID | |||
| // RandomHorizontalFlipOperation | |||
| RandomHorizontalFlipOperation::RandomHorizontalFlipOperation(float probability) | |||
| : TensorOperation(true), probability_(probability) {} | |||
| RandomHorizontalFlipOperation::RandomHorizontalFlipOperation(float prob) : TensorOperation(true), probability_(prob) {} | |||
| RandomHorizontalFlipOperation::~RandomHorizontalFlipOperation() = default; | |||
| @@ -37,7 +37,7 @@ constexpr char kRandomHorizontalFlipOperation[] = "RandomHorizontalFlip"; | |||
| class RandomHorizontalFlipOperation : public TensorOperation { | |||
| public: | |||
| explicit RandomHorizontalFlipOperation(float probability); | |||
| explicit RandomHorizontalFlipOperation(float prob); | |||
| ~RandomHorizontalFlipOperation(); | |||
| @@ -30,12 +30,11 @@ namespace vision { | |||
| #ifndef ENABLE_ANDROID | |||
| // Function to create RandomRotationOperation. | |||
| RandomRotationOperation::RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, | |||
| bool expand, std::vector<float> center, | |||
| std::vector<uint8_t> fill_value) | |||
| RandomRotationOperation::RandomRotationOperation(std::vector<float> degrees, InterpolationMode resample, bool expand, | |||
| std::vector<float> center, std::vector<uint8_t> fill_value) | |||
| : TensorOperation(true), | |||
| degrees_(degrees), | |||
| interpolation_mode_(interpolation_mode), | |||
| interpolation_mode_(resample), | |||
| expand_(expand), | |||
| center_(center), | |||
| fill_value_(fill_value) {} | |||
| @@ -98,7 +97,7 @@ std::shared_ptr<TensorOp> RandomRotationOperation::Build() { | |||
| } | |||
| std::shared_ptr<RandomRotationOp> tensor_op = std::make_shared<RandomRotationOp>( | |||
| start_degree, end_degree, center_[0], center_[1], interpolation_mode_, expand_, fill_r, fill_g, fill_b); | |||
| start_degree, end_degree, interpolation_mode_, expand_, center_[0], center_[1], fill_r, fill_g, fill_b); | |||
| return tensor_op; | |||
| } | |||
| @@ -37,7 +37,7 @@ constexpr char kRandomRotationOperation[] = "RandomRotation"; | |||
| class RandomRotationOperation : public TensorOperation { | |||
| public: | |||
| RandomRotationOperation(std::vector<float> degrees, InterpolationMode interpolation_mode, bool expand, | |||
| RandomRotationOperation(std::vector<float> degrees, InterpolationMode resample, bool expand, | |||
| std::vector<float> center, std::vector<uint8_t> fill_value); | |||
| ~RandomRotationOperation(); | |||
| @@ -31,8 +31,7 @@ namespace vision { | |||
| #ifndef ENABLE_ANDROID | |||
| // RandomVerticalFlipOperation | |||
| RandomVerticalFlipOperation::RandomVerticalFlipOperation(float probability) | |||
| : TensorOperation(true), probability_(probability) {} | |||
| RandomVerticalFlipOperation::RandomVerticalFlipOperation(float prob) : TensorOperation(true), probability_(prob) {} | |||
| RandomVerticalFlipOperation::~RandomVerticalFlipOperation() = default; | |||
| @@ -37,7 +37,7 @@ constexpr char kRandomVerticalFlipOperation[] = "RandomVerticalFlip"; | |||
| class RandomVerticalFlipOperation : public TensorOperation { | |||
| public: | |||
| explicit RandomVerticalFlipOperation(float probability); | |||
| explicit RandomVerticalFlipOperation(float prob); | |||
| ~RandomVerticalFlipOperation(); | |||
| @@ -31,8 +31,8 @@ namespace vision { | |||
| #ifndef ENABLE_ANDROID | |||
| // RandomVerticalFlipWithBBoxOperation | |||
| RandomVerticalFlipWithBBoxOperation::RandomVerticalFlipWithBBoxOperation(float probability) | |||
| : TensorOperation(true), probability_(probability) {} | |||
| RandomVerticalFlipWithBBoxOperation::RandomVerticalFlipWithBBoxOperation(float prob) | |||
| : TensorOperation(true), probability_(prob) {} | |||
| RandomVerticalFlipWithBBoxOperation::~RandomVerticalFlipWithBBoxOperation() = default; | |||
| @@ -37,7 +37,7 @@ constexpr char kRandomVerticalFlipWithBBoxOperation[] = "RandomVerticalFlipWithB | |||
| class RandomVerticalFlipWithBBoxOperation : public TensorOperation { | |||
| public: | |||
| explicit RandomVerticalFlipWithBBoxOperation(float probability); | |||
| explicit RandomVerticalFlipWithBBoxOperation(float prob); | |||
| ~RandomVerticalFlipWithBBoxOperation(); | |||
| @@ -37,7 +37,7 @@ constexpr char kResizeOperation[] = "Resize"; | |||
| class ResizeOperation : public TensorOperation { | |||
| public: | |||
| explicit ResizeOperation(std::vector<int32_t> size, InterpolationMode interpolation_mode); | |||
| explicit ResizeOperation(std::vector<int32_t> size, InterpolationMode interpolation); | |||
| ~ResizeOperation(); | |||
| @@ -257,7 +257,7 @@ std::shared_ptr<TensorOp> NgramOperation::Build() { | |||
| int32_t r_len = right_pad_.second; | |||
| std::string l_pad = left_pad_.first; | |||
| std::string r_pad = right_pad_.first; | |||
| std::shared_ptr<NgramOp> tensor_op = std::make_shared<NgramOp>(ngrams_, l_len, r_len, l_pad, r_pad, separator_); | |||
| std::shared_ptr<NgramOp> tensor_op = std::make_shared<NgramOp>(ngrams_, l_len, l_pad, r_len, r_pad, separator_); | |||
| return tensor_op; | |||
| } | |||
| @@ -24,7 +24,7 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| NgramOp::NgramOp(const std::vector<int32_t> &ngrams, int32_t l_len, int32_t r_len, const std::string &l_pad, | |||
| NgramOp::NgramOp(const std::vector<int32_t> &ngrams, int32_t l_len, const std::string &l_pad, int32_t r_len, | |||
| const std::string &r_pad, const std::string &separator) | |||
| : ngrams_(ngrams), | |||
| l_len_(l_len), | |||
| @@ -32,12 +32,12 @@ class NgramOp : public TensorOp { | |||
| public: | |||
| // Constructor of Ngram model | |||
| // @param const std::vector<int32_t> &ngrams | |||
| // @param int32_tl_len - padding length on the left | |||
| // @param int32_t r_len - padding length on the right | |||
| // @param int32_t l_len - padding length on the left | |||
| // @param const std::string &l_pad - padding token on the left | |||
| // @param int32_t r_len - padding length on the right | |||
| // @param const std::string &r_pad - padding token on the right | |||
| // @param const std::string &separator - use to join strings | |||
| NgramOp(const std::vector<int32_t> &ngrams, int32_t l_len, int32_t r_len, const std::string &l_pad, | |||
| NgramOp(const std::vector<int32_t> &ngrams, int32_t l_len, const std::string &l_pad, int32_t r_len, | |||
| const std::string &r_pad, const std::string &separator); | |||
| // perform ngram model on each tensor | |||
| @@ -32,9 +32,9 @@ | |||
| namespace mindspore { | |||
| namespace dataset { | |||
| ToNumberOp::ToNumberOp(const DataType &cast_to_type) : cast_to_type_(cast_to_type) {} | |||
| ToNumberOp::ToNumberOp(const DataType &data_type) : cast_to_type_(data_type) {} | |||
| ToNumberOp::ToNumberOp(const std::string &cast_to_type) : cast_to_type_(DataType(cast_to_type)) {} | |||
| ToNumberOp::ToNumberOp(const std::string &data_type) : cast_to_type_(DataType(data_type)) {} | |||
| Status ToNumberOp::Compute(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *output) { | |||
| CHECK_FAIL_RETURN_UNEXPECTED(input->type() == DataType::DE_STRING, "ToNumber: input should be string datatype."); | |||
| @@ -32,12 +32,12 @@ namespace dataset { | |||
| class ToNumberOp : public TensorOp { | |||
| public: | |||
| // Constructor of ToNumberOp | |||
| // @param const DataType &cast_to_type - the type to convert string inputs to. | |||
| explicit ToNumberOp(const DataType &cast_to_type); | |||
| // @param const DataType &data_type - the type to convert string inputs to. | |||
| explicit ToNumberOp(const DataType &data_type); | |||
| // Constructor of ToNumberOp | |||
| // @param const std::string &cast_to_type - the type in string form to convert string inputs to. | |||
| explicit ToNumberOp(const std::string &cast_to_type); | |||
| // @param const std::string &data_type - the type in string form to convert string inputs to. | |||
| explicit ToNumberOp(const std::string &data_type); | |||
| ~ToNumberOp() override = default; | |||
| @@ -32,7 +32,7 @@ namespace dataset { | |||
| class TruncateSequencePairOp : public TensorOp { | |||
| public: | |||
| explicit TruncateSequencePairOp(dsize_t length) : max_length_(length) {} | |||
| explicit TruncateSequencePairOp(dsize_t max_length) : max_length_(max_length) {} | |||
| ~TruncateSequencePairOp() override = default; | |||
| @@ -273,7 +273,7 @@ TEST_F(MindDataTestCacheOp, DISABLED_TestRandomDataCache1) { | |||
| int64_t num_samples = 0; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| rc = CacheOp::Builder() | |||
| .SetNumWorkers(5) | |||
| .SetClient(myClient) | |||
| @@ -391,18 +391,14 @@ TEST_F(MindDataTestCacheOp, DISABLED_TestRandomDataCacheSpill) { | |||
| // CacheOp | |||
| int64_t num_samples = 0; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| CacheClient::Builder builder; | |||
| builder.SetSessionId(env_session).SetCacheMemSz(4).SetSpill(true); | |||
| std::shared_ptr<CacheClient> myClient; | |||
| rc = builder.Build(&myClient); | |||
| ASSERT_TRUE(rc.IsOk()); | |||
| std::shared_ptr<CacheOp> myCacheOp; | |||
| rc = CacheOp::Builder() | |||
| .SetNumWorkers(4) | |||
| .SetClient(myClient) | |||
| .SetSampler(std::move(seq_sampler)) | |||
| .Build(&myCacheOp); | |||
| rc = CacheOp::Builder().SetNumWorkers(4).SetClient(myClient).SetSampler(std::move(seq_sampler)).Build(&myCacheOp); | |||
| ASSERT_TRUE(rc.IsOk()); | |||
| rc = myTree->AssociateNode(myCacheOp); | |||
| ASSERT_TRUE(rc.IsOk()); | |||
| @@ -466,7 +462,7 @@ TEST_F(MindDataTestCacheOp, DISABLED_TestImageFolderCacheMerge) { | |||
| rc = GetSessionFromEnv(&env_session); | |||
| ASSERT_TRUE(rc.IsOk()); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| CacheClient::Builder ccbuilder; | |||
| ccbuilder.SetSessionId(env_session).SetCacheMemSz(0).SetSpill(true); | |||
| @@ -138,7 +138,7 @@ TEST_F(MindDataTestCelebaDataset, TestCelebaRepeat) { | |||
| TEST_F(MindDataTestCelebaDataset, TestSubsetRandomSamplerCeleba) { | |||
| std::vector<int64_t> indices({1}); | |||
| int64_t num_samples = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(num_samples, indices); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(indices, num_samples); | |||
| uint32_t expect_labels[1][40] = {{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, | |||
| 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}}; | |||
| std::string dir = datasets_root_path_ + "/testCelebAData/"; | |||
| @@ -35,9 +35,9 @@ | |||
| namespace common = mindspore::common; | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| std::shared_ptr<ExecutionTree> Build(std::vector<std::shared_ptr<DatasetOp>> ops); | |||
| @@ -60,11 +60,11 @@ class MindDataTestCifarOp : public UT::DatasetOpTesting { | |||
| }; | |||
| TEST_F(MindDataTestCifarOp, TestSequentialSamplerCifar10) { | |||
| //Note: CIFAR and Mnist datasets are not included | |||
| //as part of the build tree. | |||
| //Download datasets and rebuild if data doesn't | |||
| //appear in this dataset | |||
| //Example: python tests/dataset/data/prep_data.py | |||
| // Note: CIFAR and Mnist datasets are not included | |||
| // as part of the build tree. | |||
| // Download datasets and rebuild if data doesn't | |||
| // appear in this dataset | |||
| // Example: python tests/dataset/data/prep_data.py | |||
| std::string folder_path = datasets_root_path_ + "/testCifar10Data/"; | |||
| auto tree = Build({Cifarop(16, 2, 32, folder_path, nullptr)}); | |||
| tree->Prepare(); | |||
| @@ -93,7 +93,7 @@ TEST_F(MindDataTestCifarOp, TestSequentialSamplerCifar10) { | |||
| TEST_F(MindDataTestCifarOp, TestRandomSamplerCifar10) { | |||
| uint32_t original_seed = GlobalContext::config_manager()->seed(); | |||
| GlobalContext::config_manager()->set_seed(0); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_unique<RandomSamplerRT>(12, true, true); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_unique<RandomSamplerRT>(true, 12, true); | |||
| std::string folder_path = datasets_root_path_ + "/testCifar10Data/"; | |||
| auto tree = Build({Cifarop(16, 2, 32, folder_path, std::move(sampler))}); | |||
| tree->Prepare(); | |||
| @@ -139,8 +139,8 @@ TEST_F(MindDataTestCifarOp, TestSequentialSamplerCifar100) { | |||
| while (tensor_map.size() != 0 && i < 100) { | |||
| tensor_map["coarse_label"]->GetItemAt<uint32_t>(&coarse, {}); | |||
| tensor_map["fine_label"]->GetItemAt<uint32_t>(&fine, {}); | |||
| MS_LOG(DEBUG) << "row: " << i << "\t" << tensor_map["image"]->shape() << " coarse:" | |||
| << coarse << " fine:" << fine << "\n"; | |||
| MS_LOG(DEBUG) << "row: " << i << "\t" << tensor_map["image"]->shape() << " coarse:" << coarse << " fine:" << fine | |||
| << "\n"; | |||
| i++; | |||
| ASSERT_OK(di.GetNextAsMap(&tensor_map)); | |||
| } | |||
| @@ -27,9 +27,9 @@ | |||
| #include <unordered_set> | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::INFO; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::INFO; | |||
| class MindDataTestDistributedSampler : public UT::Common { | |||
| public: | |||
| @@ -48,7 +48,7 @@ TEST_F(MindDataTestDistributedSampler, TestTwoShardsOne) { | |||
| uint64_t num_samples = 7; | |||
| // create sampler with replacement = true | |||
| DistributedSamplerRT m_sampler(num_samples, 2, 0, false, 0, -1, false); | |||
| DistributedSamplerRT m_sampler(2, 0, false, num_samples, 0, -1, false); | |||
| DummyRandomAccessOp dummyRandomAccessOp(num_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -72,7 +72,7 @@ TEST_F(MindDataTestDistributedSampler, TestTwoShardsTwo) { | |||
| uint64_t num_samples = 7; | |||
| // create sampler with replacement = true | |||
| DistributedSamplerRT m_sampler(num_samples, 2, 1, false, 0, -1, false); | |||
| DistributedSamplerRT m_sampler(2, 1, false, num_samples, 0, -1, false); | |||
| DummyRandomAccessOp dummyRandomAccessOp(num_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -97,7 +97,7 @@ TEST_F(MindDataTestDistributedSampler, TestThreeShards) { | |||
| uint64_t num_samples = 2; | |||
| // create sampler with replacement = true | |||
| DistributedSamplerRT m_sampler(num_samples, 3, 2, false, 0, -1, false); | |||
| DistributedSamplerRT m_sampler(3, 2, false, num_samples, 0, -1, false); | |||
| DummyRandomAccessOp dummyRandomAccessOp(num_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -138,7 +138,7 @@ TEST_F(MindDataTestImageFolderSampler, TestRandomSamplerImageFolder) { | |||
| int32_t original_seed = GlobalContext::config_manager()->seed(); | |||
| GlobalContext::config_manager()->set_seed(0); | |||
| int64_t num_samples = 12; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_unique<RandomSamplerRT>(num_samples, true, true); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_unique<RandomSamplerRT>(true, num_samples, true); | |||
| int32_t res[] = {2, 2, 2, 3, 2, 3, 2, 3, 1, 2, 2, 1}; // ground truth label | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| auto tree = Build({ImageFolder(16, 2, 32, folder_path, false, std::move(sampler))}); | |||
| @@ -206,7 +206,7 @@ TEST_F(MindDataTestImageFolderSampler, TestSubsetRandomSamplerImageFolder) { | |||
| // id range 0 - 10 is label 0, and id range 11 - 21 is label 1 | |||
| std::vector<int64_t> indices({0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 11}); | |||
| int64_t num_samples = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(num_samples, indices); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(indices, num_samples); | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| // Expect 6 samples for label 0 and 1 | |||
| int res[2] = {6, 6}; | |||
| @@ -244,7 +244,7 @@ TEST_F(MindDataTestImageFolderSampler, TestWeightedRandomSamplerImageFolder) { | |||
| // create sampler with replacement = replacement | |||
| std::shared_ptr<SamplerRT> sampler = | |||
| std::make_shared<WeightedRandomSamplerRT>(num_samples, weights, true, samples_per_tensor); | |||
| std::make_shared<WeightedRandomSamplerRT>(weights, num_samples, true, samples_per_tensor); | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| auto tree = Build({ImageFolder(16, 2, 32, folder_path, false, std::move(sampler))}); | |||
| @@ -302,7 +302,7 @@ TEST_F(MindDataTestImageFolderSampler, TestImageFolderClassIndex) { | |||
| TEST_F(MindDataTestImageFolderSampler, TestDistributedSampler) { | |||
| int64_t num_samples = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(num_samples, 11, 10, false); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(11, 10, false, num_samples); | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| auto op1 = ImageFolder(16, 2, 32, folder_path, false, std::move(sampler)); | |||
| auto op2 = Repeat(4); | |||
| @@ -334,7 +334,7 @@ TEST_F(MindDataTestImageFolderSampler, TestDistributedSampler) { | |||
| TEST_F(MindDataTestImageFolderSampler, TestPKSamplerImageFolder) { | |||
| int64_t num_samples = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<PKSamplerRT>(num_samples, 3, false, 4); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<PKSamplerRT>(3, false, num_samples, 4); | |||
| int32_t res[] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3}; // ground truth label | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| auto tree = Build({ImageFolder(16, 2, 32, folder_path, false, std::move(sampler))}); | |||
| @@ -369,7 +369,7 @@ TEST_F(MindDataTestImageFolderSampler, TestImageFolderDecode) { | |||
| map["wrong folder name"] = 1234; // this is skipped | |||
| int64_t num_samples = 20; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| auto tree = Build({ImageFolder(16, 2, 32, folder_path, false, std::move(seq_sampler), map, true)}); | |||
| int64_t res[2] = {111, 333}; | |||
| tree->Prepare(); | |||
| @@ -399,7 +399,7 @@ TEST_F(MindDataTestImageFolderSampler, TestImageFolderDecode) { | |||
| TEST_F(MindDataTestImageFolderSampler, TestImageFolderSharding1) { | |||
| int64_t num_samples = 5; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(num_samples, 4, 0, false); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(4, 0, false, num_samples); | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| // numWrks, rows, conns, path, shuffle, sampler, map, numSamples, decode | |||
| auto tree = Build({ImageFolder(16, 2, 32, folder_path, false, std::move(sampler), {})}); | |||
| @@ -429,7 +429,7 @@ TEST_F(MindDataTestImageFolderSampler, TestImageFolderSharding1) { | |||
| TEST_F(MindDataTestImageFolderSampler, TestImageFolderSharding2) { | |||
| int64_t num_samples = 12; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(num_samples, 4, 3, false); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<DistributedSamplerRT>(4, 3, false, num_samples); | |||
| std::string folder_path = datasets_root_path_ + "/testPK/data"; | |||
| // numWrks, rows, conns, path, shuffle, sampler, map, numSamples, decode | |||
| auto tree = Build({ImageFolder(16, 16, 32, folder_path, false, std::move(sampler), {})}); | |||
| @@ -33,9 +33,9 @@ | |||
| namespace common = mindspore::common; | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| std::shared_ptr<RepeatOp> Repeat(int repeatCnt); | |||
| @@ -95,7 +95,7 @@ TEST_F(MindDataTestManifest, TestSequentialManifestWithRepeat) { | |||
| TEST_F(MindDataTestManifest, TestSubsetRandomSamplerManifest) { | |||
| std::vector<int64_t> indices({1}); | |||
| int64_t num_samples = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(num_samples, indices); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SubsetRandomSamplerRT>(indices, num_samples); | |||
| std::string file = datasets_root_path_ + "/testManifestData/cpp.json"; | |||
| // Expect 6 samples for label 0 and 1 | |||
| auto tree = Build({Manifest(16, 2, 32, file, "train", std::move(sampler))}); | |||
| @@ -156,7 +156,7 @@ TEST_F(MindDataTestManifest, MindDataTestManifestNumSamples) { | |||
| std::string file = datasets_root_path_ + "/testManifestData/cpp.json"; | |||
| int64_t num_samples = 1; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| auto op1 = Manifest(16, 2, 32, file, "train", std::move(seq_sampler), {}); | |||
| auto op2 = Repeat(4); | |||
| op1->set_total_repeats(4); | |||
| @@ -189,7 +189,7 @@ TEST_F(MindDataTestManifest, MindDataTestManifestEval) { | |||
| std::string file = datasets_root_path_ + "/testManifestData/cpp.json"; | |||
| int64_t num_samples = 1; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| auto tree = Build({Manifest(16, 2, 32, file, "eval", std::move(seq_sampler), {})}); | |||
| tree->Prepare(); | |||
| Status rc = tree->Launch(); | |||
| @@ -38,9 +38,9 @@ | |||
| namespace common = mindspore::common; | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::ERROR; | |||
| std::shared_ptr<BatchOp> Batch(int batch_size = 1, bool drop = false); | |||
| @@ -77,7 +77,7 @@ TEST_F(MindDataTestMnistSampler, TestSequentialMnistWithRepeat) { | |||
| std::string folder_path = datasets_root_path_ + "/testMnistData/"; | |||
| int64_t num_samples = 10; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| auto op1 = CreateMnist(16, 2, 32, folder_path, false, std::move(seq_sampler)); | |||
| auto op2 = Repeat(2); | |||
| op1->set_total_repeats(2); | |||
| @@ -111,7 +111,7 @@ TEST_F(MindDataTestMnistSampler, TestSequentialImageFolderWithRepeatBatch) { | |||
| std::string folder_path = datasets_root_path_ + "/testMnistData/"; | |||
| int64_t num_samples = 10; | |||
| int64_t start_index = 0; | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index); | |||
| auto seq_sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples); | |||
| auto op1 = CreateMnist(16, 2, 32, folder_path, false, std::move(seq_sampler)); | |||
| auto op2 = Repeat(2); | |||
| auto op3 = Batch(5); | |||
| @@ -119,10 +119,7 @@ TEST_F(MindDataTestMnistSampler, TestSequentialImageFolderWithRepeatBatch) { | |||
| op1->set_num_repeats_per_epoch(2); | |||
| auto tree = Build({op1, op2, op3}); | |||
| tree->Prepare(); | |||
| uint32_t res[4][5] = { {0, 0, 0, 0, 0 }, | |||
| {0, 0, 0, 0, 0 }, | |||
| {0, 0, 0, 0, 0 }, | |||
| {0, 0, 0, 0, 0 } }; | |||
| uint32_t res[4][5] = {{0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}; | |||
| Status rc = tree->Launch(); | |||
| if (rc.IsError()) { | |||
| MS_LOG(ERROR) << "Return code error detected during tree launch: " << rc.ToString() << "."; | |||
| @@ -19,9 +19,9 @@ | |||
| #include "utils/log_adapter.h" | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::INFO; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::INFO; | |||
| class MindDataTestRandomCropOp : public UT::CVOP::CVOpCommon { | |||
| protected: | |||
| @@ -35,7 +35,7 @@ TEST_F(MindDataTestRandomCropOp, TestOp1) { | |||
| // Crop params | |||
| unsigned int crop_height = 128; | |||
| unsigned int crop_width = 128; | |||
| std::unique_ptr<RandomCropOp> op(new RandomCropOp(crop_height, crop_width, 0, 0, 0, 0, BorderType::kConstant, false)); | |||
| std::unique_ptr<RandomCropOp> op(new RandomCropOp(crop_height, crop_width, 0, 0, 0, 0, false, BorderType::kConstant)); | |||
| EXPECT_TRUE(op->OneToOne()); | |||
| Status s = op->Compute(input_tensor_, &output_tensor_); | |||
| size_t actual = 0; | |||
| @@ -52,7 +52,7 @@ TEST_F(MindDataTestRandomCropOp, TestOp2) { | |||
| unsigned int crop_height = 1280; | |||
| unsigned int crop_width = 1280; | |||
| std::unique_ptr<RandomCropOp> op( | |||
| new RandomCropOp(crop_height, crop_width, 513, 513, 513, 513, BorderType::kConstant, false)); | |||
| new RandomCropOp(crop_height, crop_width, 513, 513, 513, 513, false, BorderType::kConstant)); | |||
| EXPECT_TRUE(op->OneToOne()); | |||
| Status s = op->Compute(input_tensor_, &output_tensor_); | |||
| EXPECT_EQ(true, s.IsOk()); | |||
| @@ -44,7 +44,7 @@ TEST_F(MindDataTestRandomCropWithBBoxOp, TestOp1) { | |||
| uint32_t current_seed = GlobalContext::config_manager()->seed(); | |||
| GlobalContext::config_manager()->set_seed(327362); | |||
| std::unique_ptr<RandomCropWithBBoxOp> op( | |||
| new RandomCropWithBBoxOp(crop_height, crop_width, 0, 0, 0, 0, BorderType::kConstant, false)); | |||
| new RandomCropWithBBoxOp(crop_height, crop_width, 0, 0, 0, 0, false, BorderType::kConstant)); | |||
| for (auto tensor_row_ : images_and_annotations_) { | |||
| Status s = op->Compute(tensor_row_, &output_tensor_row_); | |||
| size_t actual = 0; | |||
| @@ -79,7 +79,7 @@ TEST_F(MindDataTestRandomCropWithBBoxOp, TestOp2) { | |||
| GlobalContext::config_manager()->set_seed(327362); | |||
| std::unique_ptr<RandomCropWithBBoxOp> op( | |||
| new RandomCropWithBBoxOp(crop_height, crop_width, 513, 513, 513, 513, BorderType::kConstant, false)); | |||
| new RandomCropWithBBoxOp(crop_height, crop_width, 513, 513, 513, 513, false, BorderType::kConstant)); | |||
| for (auto tensor_row_ : images_and_annotations_) { | |||
| Status s = op->Compute(tensor_row_, &output_tensor_row_); | |||
| @@ -107,7 +107,7 @@ TEST_F(MindDataTestRandomCropWithBBoxOp, TestOp3) { | |||
| std::unique_ptr<RandomCropWithBBoxOp> op(new RandomCropWithBBoxOp(crop_height, crop_width, crop_height * 3 + 1, | |||
| crop_height * 3 + 1, crop_width * 3 + 1, | |||
| crop_width * 3 + 1, BorderType::kConstant, false)); | |||
| crop_width * 3 + 1, false, BorderType::kConstant)); | |||
| for (auto tensor_row_ : images_and_annotations_) { | |||
| Status s = op->Compute(tensor_row_, &output_tensor_row_); | |||
| @@ -20,9 +20,9 @@ | |||
| #include "utils/log_adapter.h" | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::INFO; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::INFO; | |||
| class MindDataTestRandomRotationOp : public UT::CVOP::CVOpCommon { | |||
| public: | |||
| @@ -38,8 +38,8 @@ TEST_F(MindDataTestRandomRotationOp, TestOp) { | |||
| float xCenter = -1; | |||
| float yCenter = -1; | |||
| bool expand = false; | |||
| std::unique_ptr<RandomRotationOp> op(new RandomRotationOp( | |||
| sDegree, eDegree, xCenter, yCenter, InterpolationMode::kLinear, expand)); | |||
| std::unique_ptr<RandomRotationOp> op( | |||
| new RandomRotationOp(sDegree, eDegree, InterpolationMode::kLinear, expand, xCenter, yCenter)); | |||
| EXPECT_TRUE(op->OneToOne()); | |||
| Status s = op->Compute(input_tensor_, &output_tensor); | |||
| EXPECT_TRUE(s.IsOk()); | |||
| @@ -62,7 +62,7 @@ TEST_F(MindDataTestStandAloneSampler, TestDistributedSampler) { | |||
| TensorRow sample_row; | |||
| for (int i = 0; i < 6; i++) { | |||
| std::shared_ptr<SamplerRT> sampler = | |||
| std::make_shared<DistributedSamplerRT>(num_samples, 3, i % 3, (i < 3 ? false : true)); | |||
| std::make_shared<DistributedSamplerRT>(3, i % 3, (i < 3 ? false : true), num_samples); | |||
| sampler->HandshakeRandomAccessOp(&mock); | |||
| sampler->GetNextSample(&sample_row); | |||
| tensor = sample_row[0]; | |||
| @@ -82,7 +82,7 @@ TEST_F(MindDataTestStandAloneSampler, TestStandAoneSequentialSampler) { | |||
| CreateINT64Tensor(&label2, 2, reinterpret_cast<unsigned char *>(res + 3)); | |||
| int64_t num_samples = 0; | |||
| int64_t start_index = 0; | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SequentialSamplerRT>(num_samples, start_index, 3); | |||
| std::shared_ptr<SamplerRT> sampler = std::make_shared<SequentialSamplerRT>(start_index, num_samples, 3); | |||
| std::shared_ptr<Tensor> tensor; | |||
| TensorRow sample_row; | |||
| @@ -41,7 +41,7 @@ TEST_F(MindDataTestSubsetRandomSampler, TestAllAtOnce) { | |||
| std::vector<int64_t> in({0, 1, 2, 3, 4}); | |||
| std::unordered_set<int64_t> in_set(in.begin(), in.end()); | |||
| int64_t num_samples = 0; | |||
| SubsetRandomSamplerRT sampler(num_samples, in); | |||
| SubsetRandomSamplerRT sampler(in, num_samples); | |||
| DummyRandomAccessOp dummyRandomAccessOp(5); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -69,7 +69,7 @@ TEST_F(MindDataTestSubsetRandomSampler, TestGetNextSample) { | |||
| int64_t samples_per_tensor = 10; | |||
| int64_t num_samples = 0; | |||
| std::vector<int64_t> input(total_samples, 1); | |||
| SubsetRandomSamplerRT sampler(num_samples, input, samples_per_tensor); | |||
| SubsetRandomSamplerRT sampler(input, num_samples, samples_per_tensor); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -98,7 +98,7 @@ TEST_F(MindDataTestSubsetRandomSampler, TestReset) { | |||
| std::vector<int64_t> in({0, 1, 2, 3, 4}); | |||
| std::unordered_set<int64_t> in_set(in.begin(), in.end()); | |||
| int64_t num_samples = 0; | |||
| SubsetRandomSamplerRT sampler(num_samples, in); | |||
| SubsetRandomSamplerRT sampler(in, num_samples); | |||
| DummyRandomAccessOp dummyRandomAccessOp(5); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -41,7 +41,7 @@ TEST_F(MindDataTestSubsetSampler, TestAllAtOnce) { | |||
| std::vector<int64_t> in({3, 1, 4, 0, 1}); | |||
| std::unordered_set<int64_t> in_set(in.begin(), in.end()); | |||
| int64_t num_samples = 0; | |||
| SubsetSamplerRT sampler(num_samples, in); | |||
| SubsetSamplerRT sampler(in, num_samples); | |||
| DummyRandomAccessOp dummyRandomAccessOp(5); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -69,7 +69,7 @@ TEST_F(MindDataTestSubsetSampler, TestGetNextSample) { | |||
| int64_t samples_per_tensor = 10; | |||
| int64_t num_samples = 0; | |||
| std::vector<int64_t> input(total_samples, 1); | |||
| SubsetSamplerRT sampler(num_samples, input, samples_per_tensor); | |||
| SubsetSamplerRT sampler(input, num_samples, samples_per_tensor); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -99,7 +99,7 @@ TEST_F(MindDataTestSubsetSampler, TestReset) { | |||
| std::vector<int64_t> in({0, 1, 2, 3, 4}); | |||
| std::unordered_set<int64_t> in_set(in.begin(), in.end()); | |||
| int64_t num_samples = 0; | |||
| SubsetSamplerRT sampler(num_samples, in); | |||
| SubsetSamplerRT sampler(in, num_samples); | |||
| DummyRandomAccessOp dummyRandomAccessOp(5); | |||
| sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -536,3 +536,44 @@ TEST_F(MindDataTestTensorDE, TensorEmpty) { | |||
| t2->Invalidate(); | |||
| ASSERT_TRUE(!t2->HasData()); | |||
| } | |||
| TEST_F(MindDataTestTensorDE, TestTensor_json) { | |||
| MS_LOG(INFO) << "Doing TestTensor."; | |||
| std::vector<uint64_t> labels = {1, 1, 2}; | |||
| std::shared_ptr<Tensor> input; | |||
| Tensor::CreateFromVector(labels, &input); | |||
| nlohmann::json out_json; | |||
| input->to_json(&out_json); | |||
| std::shared_ptr<Tensor> check; | |||
| std::stringstream ss; | |||
| ss << out_json["shape"]; | |||
| std::string shape = ss.str(); | |||
| ss.str(""); | |||
| ss << out_json["type"]; | |||
| std::string type = ss.str(); | |||
| ss.str(""); | |||
| ss << out_json["data"]; | |||
| std::string data = ss.str(); | |||
| ss.str(""); | |||
| ASSERT_TRUE('"' + input->shape().ToString() + '"' == shape); | |||
| ASSERT_TRUE('"' + input->type().ToString() + '"' == type); | |||
| std::string input_data; | |||
| input_data.push_back('"'); | |||
| input_data.push_back('['); | |||
| for (int i = 0; i < labels.size(); i++) { | |||
| input_data += std::to_string(labels[i]); | |||
| if (i < labels.size() - 1) { | |||
| input_data.push_back(','); | |||
| } | |||
| } | |||
| input_data.push_back(']'); | |||
| input_data.push_back('"'); | |||
| std::cout << input_data << std::endl; | |||
| std::cout << data << std::endl; | |||
| ASSERT_TRUE(input_data == data); | |||
| } | |||
| @@ -21,9 +21,9 @@ | |||
| #include "utils/log_adapter.h" | |||
| using namespace mindspore::dataset; | |||
| using mindspore::MsLogLevel::INFO; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::LogStream; | |||
| using mindspore::ExceptionType::NoExceptionType; | |||
| using mindspore::MsLogLevel::INFO; | |||
| class MindDataTestToFloat16Op : public UT::CVOP::CVOpCommon { | |||
| public: | |||
| @@ -39,8 +39,8 @@ TEST_F(MindDataTestToFloat16Op, TestOp) { | |||
| float x_center = -1; | |||
| float y_center = -1; | |||
| bool expand = false; | |||
| std::unique_ptr<RandomRotationOp> op(new RandomRotationOp( | |||
| s_degree, e_degree, x_center, y_center, InterpolationMode::kLinear, expand)); | |||
| std::unique_ptr<RandomRotationOp> op( | |||
| new RandomRotationOp(s_degree, e_degree, InterpolationMode::kLinear, expand, x_center, y_center)); | |||
| EXPECT_TRUE(op->OneToOne()); | |||
| Status s = op->Compute(input_tensor_, &output_tensor); | |||
| EXPECT_TRUE(s.IsOk()); | |||
| @@ -51,7 +51,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestOneshotReplacement) { | |||
| std::vector<uint64_t> freq(total_samples, 0); | |||
| // create sampler with replacement = true | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, true); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, true); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -80,7 +80,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestOneshotNoReplacement) { | |||
| std::vector<uint64_t> freq(total_samples, 0); | |||
| // create sampler with replacement = replacement | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, false); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, false); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -115,7 +115,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestGetNextSampleReplacement) { | |||
| std::vector<double> weights(total_samples, std::rand() % 100); | |||
| // create sampler with replacement = replacement | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, true, samples_per_tensor); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, true, samples_per_tensor); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -150,7 +150,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestGetNextSampleNoReplacement) { | |||
| std::vector<uint64_t> freq(total_samples, 0); | |||
| // create sampler with replacement = replacement | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, false, samples_per_tensor); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, false, samples_per_tensor); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -190,7 +190,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestResetReplacement) { | |||
| std::vector<uint64_t> freq(total_samples, 0); | |||
| // create sampler with replacement = true | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, true); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, true); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||
| @@ -234,7 +234,7 @@ TEST_F(MindDataTestWeightedRandomSampler, TestResetNoReplacement) { | |||
| std::vector<uint64_t> freq(total_samples, 0); | |||
| // create sampler with replacement = true | |||
| WeightedRandomSamplerRT m_sampler(num_samples, weights, false); | |||
| WeightedRandomSamplerRT m_sampler(weights, num_samples, false); | |||
| DummyRandomAccessOp dummyRandomAccessOp(total_samples); | |||
| m_sampler.HandshakeRandomAccessOp(&dummyRandomAccessOp); | |||