diff --git a/csrc/fastdeploy/backends/openvino/ov_backend.cc b/csrc/fastdeploy/backends/openvino/ov_backend.cc index 1e59d4850..6f8f302bb 100644 --- a/csrc/fastdeploy/backends/openvino/ov_backend.cc +++ b/csrc/fastdeploy/backends/openvino/ov_backend.cc @@ -13,6 +13,9 @@ // limitations under the License. #include "fastdeploy/backends/openvino/ov_backend.h" +#ifdef ENABLE_PADDLE_FRONTEND +#include "paddle2onnx/converter.h" +#endif namespace fastdeploy { @@ -64,14 +67,14 @@ ov::element::Type FDDataTypeToOV(const FDDataType& type) { void OpenVINOBackend::InitTensorInfo( const std::vector>& ov_outputs, - std::vector* tensor_infos) { + std::map* tensor_infos) { for (size_t i = 0; i < ov_outputs.size(); ++i) { TensorInfo info; auto partial_shape = PartialShapeToVec(ov_outputs[i].get_partial_shape()); info.shape.assign(partial_shape.begin(), partial_shape.end()); info.name = ov_outputs[i].get_any_name(); info.dtype = OpenVINODataTypeToFD(ov_outputs[i].get_element_type()); - tensor_infos->emplace_back(info); + tensor_infos->insert(std::make_pair(info.name, info)); } } @@ -93,10 +96,42 @@ bool OpenVINOBackend::InitFromPaddle(const std::string& model_file, // Get inputs/outputs information from loaded model const std::vector> inputs = model->inputs(); - InitTensorInfo(inputs, &input_infos_); + std::map input_infos; + InitTensorInfo(inputs, &input_infos); const std::vector> outputs = model->outputs(); - InitTensorInfo(outputs, &output_infos_); + std::map output_infos; + InitTensorInfo(outputs, &output_infos); + + // OpenVINO model may not keep the same order with original model + // So here will reorder it's inputs and outputs + std::string model_content; + ReadBinaryFromFile(model_file, &model_content); + auto reader = paddle2onnx::PaddleReader(model_content.c_str(), model_content.size()); + if (reader.num_inputs != input_infos.size()) { + FDERROR << "The number of inputs from PaddleReader:" << reader.num_inputs << " not equal to the number of inputs from OpenVINO:" << input_infos.size() << "." << std::endl; + return false; + } + if (reader.num_outputs != output_infos.size()) { + FDERROR << "The number of outputs from PaddleReader:" << reader.num_outputs << " not equal to the number of outputs from OpenVINO:" << output_infos.size() << "." << std::endl; + return false; + } + for (int i = 0; i < reader.num_inputs; ++i) { + auto iter = input_infos.find(std::string(reader.inputs[i].name)); + if (iter == input_infos.end()) { + FDERROR << "Cannot find input name:" << reader.inputs[i].name << " from OpenVINO model." << std::endl; + return false; + } + input_infos_.push_back(iter->second); + } + for (int i = 0; i < reader.num_outputs; ++i) { + auto iter = output_infos.find(std::string(reader.outputs[i].name)); + if (iter == output_infos.end()) { + FDERROR << "Cannot find output name:" << reader.outputs[i].name << " from OpenVINO model." << std::endl; + return false; + } + output_infos_.push_back(iter->second); + } compiled_model_ = core_.compile_model(model, "CPU", properties); request_ = compiled_model_.create_infer_request(); @@ -135,10 +170,42 @@ bool OpenVINOBackend::InitFromOnnx(const std::string& model_file, // Get inputs/outputs information from loaded model const std::vector> inputs = model->inputs(); - InitTensorInfo(inputs, &input_infos_); + std::map input_infos; + InitTensorInfo(inputs, &input_infos); const std::vector> outputs = model->outputs(); - InitTensorInfo(outputs, &output_infos_); + std::map output_infos; + InitTensorInfo(outputs, &output_infos); + + // OpenVINO model may not keep the same order with original model + // So here will reorder it's inputs and outputs + std::string model_content; + ReadBinaryFromFile(model_file, &model_content); + auto reader = paddle2onnx::OnnxReader(model_content.c_str(), model_content.size()); + if (reader.num_inputs != input_infos.size()) { + FDERROR << "The number of inputs from OnnxReader:" << reader.num_inputs << " not equal to the number of inputs from OpenVINO:" << input_infos.size() << "." << std::endl; + return false; + } + if (reader.num_outputs != output_infos.size()) { + FDERROR << "The number of outputs from OnnxReader:" << reader.num_outputs << " not equal to the number of outputs from OpenVINO:" << output_infos.size() << "." << std::endl; + return false; + } + for (int i = 0; i < reader.num_inputs; ++i) { + auto iter = input_infos.find(std::string(reader.inputs[i].name)); + if (iter == input_infos.end()) { + FDERROR << "Cannot find input name:" << reader.inputs[i].name << " from OpenVINO model." << std::endl; + return false; + } + input_infos_.push_back(iter->second); + } + for (int i = 0; i < reader.num_outputs; ++i) { + auto iter = output_infos.find(std::string(reader.outputs[i].name)); + if (iter == output_infos.end()) { + FDERROR << "Cannot find output name:" << reader.outputs[i].name << " from OpenVINO model." << std::endl; + return false; + } + output_infos_.push_back(iter->second); + } compiled_model_ = core_.compile_model(model, "CPU", properties); request_ = compiled_model_.create_infer_request(); diff --git a/csrc/fastdeploy/backends/openvino/ov_backend.h b/csrc/fastdeploy/backends/openvino/ov_backend.h index d522dfb3d..fc25472f1 100644 --- a/csrc/fastdeploy/backends/openvino/ov_backend.h +++ b/csrc/fastdeploy/backends/openvino/ov_backend.h @@ -54,7 +54,7 @@ class OpenVINOBackend : public BaseBackend { private: void InitTensorInfo(const std::vector>& ov_outputs, - std::vector* tensor_infos); + std::map* tensor_infos); ov::Core core_; ov::CompiledModel compiled_model_; ov::InferRequest request_; diff --git a/external/paddle2onnx.cmake b/external/paddle2onnx.cmake index de52b6abc..3fc84c77f 100644 --- a/external/paddle2onnx.cmake +++ b/external/paddle2onnx.cmake @@ -43,7 +43,7 @@ else() endif(WIN32) set(PADDLE2ONNX_URL_BASE "https://bj.bcebos.com/fastdeploy/third_libs/") -set(PADDLE2ONNX_VERSION "1.0.1") +set(PADDLE2ONNX_VERSION "1.0.1rc") if(WIN32) set(PADDLE2ONNX_FILE "paddle2onnx-win-x64-${PADDLE2ONNX_VERSION}.zip") if(NOT CMAKE_CL_64)