openvino_engine.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "model_deploy/engine/include/openvino_engine.h"
  15. namespace PaddleDeploy {
  16. bool Model::OpenVinoEngineInit(const OpenVinoEngineConfig& engine_config) {
  17. infer_engine_ = std::make_shared<OpenVinoEngine>();
  18. InferenceConfig config("openvino");
  19. *(config.openvino_config) = engine_config;
  20. return infer_engine_->Init(config);
  21. }
  22. bool OpenVinoEngine::Init(const InferenceConfig& infer_config) {
  23. const OpenVinoEngineConfig& engine_config = *(infer_config.openvino_config);
  24. InferenceEngine::Core ie;
  25. InferenceEngine::CNNNetwork network = ie.ReadNetwork(
  26. engine_config.xml_file_,
  27. engine_config.bin_file_);
  28. inputInfo_ = network.getInputsInfo();
  29. out_maps_ = network.getOutputsInfo();
  30. network.setBatchSize(engine_config.batch_size_);
  31. if (engine_config.device_ == "MYRIAD") {
  32. std::map<std::string, std::string> networkConfig;
  33. networkConfig["VPU_HW_STAGES_OPTIMIZATION"] = "NO";
  34. executable_network_ = ie.LoadNetwork(
  35. network, engine_config.device_, networkConfig);
  36. } else {
  37. executable_network_ = ie.LoadNetwork(network, engine_config.device_);
  38. }
  39. return true;
  40. }
  41. bool OpenVinoEngine::Infer(const std::vector<DataBlob> &inputs,
  42. std::vector<DataBlob> *outputs) {
  43. InferenceEngine::InferRequest infer_request =
  44. executable_network_.CreateInferRequest();
  45. int i = 0;
  46. for (const auto & item : inputInfo_) {
  47. InferenceEngine::TensorDesc input_tensor;
  48. InferenceEngine::Blob::Ptr input_blob =
  49. infer_request.GetBlob(item.first);
  50. InferenceEngine::MemoryBlob::Ptr input_mem_blob =
  51. InferenceEngine::as<InferenceEngine::MemoryBlob>(input_blob);
  52. auto mem_blob_holder = input_mem_blob->wmap();
  53. int size = std::accumulate(inputs[i].shape.begin(),
  54. inputs[i].shape.end(), 1, std::multiplies<int>());
  55. if (inputs[i].dtype == 0) {
  56. input_tensor.setPrecision(InferenceEngine::Precision::FP32);
  57. float *blob_data = mem_blob_holder.as<float *>();
  58. memcpy(blob_data, inputs[i].data.data(), size * sizeof(float));
  59. } else if (inputs[i].dtype == 1) {
  60. input_tensor.setPrecision(InferenceEngine::Precision::U64);
  61. int64_t *blob_data = mem_blob_holder.as<int64_t *>();
  62. memcpy(blob_data, inputs[i].data.data(), size * sizeof(int64_t));
  63. } else if (inputs[i].dtype == 2) {
  64. input_tensor.setPrecision(InferenceEngine::Precision::I32);
  65. int *blob_data = mem_blob_holder.as<int *>();
  66. memcpy(blob_data, inputs[i].data.data(), size * sizeof(int));
  67. } else if (inputs[i].dtype == 3) {
  68. input_tensor.setPrecision(InferenceEngine::Precision::U8);
  69. uint8_t *blob_data = mem_blob_holder.as<uint8_t *>();
  70. memcpy(blob_data, inputs[i].data.data(), size * sizeof(uint8_t));
  71. infer_request.SetBlob(inputs[i].name, input_blob);
  72. }
  73. i += 1;
  74. }
  75. // do inference
  76. infer_request.Infer();
  77. for (const auto & output_map : out_maps_) {
  78. DataBlob output;
  79. std::string name = output_map.first;
  80. output.name = name;
  81. InferenceEngine::Blob::Ptr output_ptr = infer_request.GetBlob(name);
  82. InferenceEngine::MemoryBlob::CPtr moutput =
  83. InferenceEngine::as<InferenceEngine::MemoryBlob>(output_ptr);
  84. InferenceEngine::TensorDesc blob_output = moutput->getTensorDesc();
  85. InferenceEngine::SizeVector output_shape = blob_output.getDims();
  86. int size = 1;
  87. output.shape.clear();
  88. for (auto& i : output_shape) {
  89. size *= i;
  90. output.shape.push_back(static_cast<int>(i));
  91. }
  92. GetDtype(blob_output, &output);
  93. auto moutputHolder = moutput->rmap();
  94. if (output.dtype == 0) {
  95. output.data.resize(size * sizeof(float));
  96. float* data = moutputHolder.as<float *>();
  97. memcpy(output.data.data(), data, size * sizeof(float));
  98. } else if (output.dtype == 1) {
  99. output.data.resize(size * sizeof(int64_t));
  100. int64_t* data = moutputHolder.as<int64_t *>();
  101. memcpy(output.data.data(), data, size * sizeof(int64_t));
  102. } else if (output.dtype == 2) {
  103. output.data.resize(size * sizeof(int));
  104. int* data = moutputHolder.as<int *>();
  105. memcpy(output.data.data(), data, size * sizeof(int));
  106. } else if (output.dtype == 3) {
  107. output.data.resize(size * sizeof(uint8_t));
  108. uint8_t* data = moutputHolder.as<uint8_t *>();
  109. memcpy(output.data.data(), data, size * sizeof(uint8_t));
  110. }
  111. outputs->push_back(std::move(output));
  112. }
  113. return true;
  114. }
  115. bool OpenVinoEngine::GetDtype(const InferenceEngine::TensorDesc &output_blob,
  116. DataBlob *output) {
  117. InferenceEngine::Precision output_precision = output_blob.getPrecision();
  118. if (output_precision == 10) {
  119. output->dtype = FLOAT32;
  120. } else if (output_precision == 72) {
  121. output->dtype = INT64;
  122. } else if (output_precision == 70) {
  123. output->dtype = INT32;
  124. } else if (output_precision == 40) {
  125. output->dtype = INT8;
  126. } else {
  127. std::cout << "can't paser the precision type" << std::endl;
  128. return false;
  129. }
  130. return true;
  131. }
  132. } // namespace PaddleDeploy