// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. // // Copyright (C) 2018-2019, Intel Corporation, all rights reserved. // Third party copyrights are property of their respective owners. #ifndef __OPENCV_DNN_IE_NGRAPH_HPP__ #define __OPENCV_DNN_IE_NGRAPH_HPP__ #include "op_inf_engine.hpp" #ifdef HAVE_DNN_NGRAPH #include #endif // HAVE_DNN_NGRAPH namespace cv { namespace dnn { #ifdef HAVE_DNN_NGRAPH class InfEngineNgraphNode; class InfEngineNgraphNet { public: InfEngineNgraphNet(); InfEngineNgraphNet(InferenceEngine::CNNNetwork& net); void addOutput(const std::string& name); bool isInitialized(); void init(Target targetId); void forward(const std::vector >& outBlobsWrappers, bool isAsync); void initPlugin(InferenceEngine::CNNNetwork& net); ngraph::ParameterVector setInputs(const std::vector& inputs, const std::vector& names); void setUnconnectedNodes(Ptr& node); void addBlobs(const std::vector >& ptrs); void createNet(Target targetId); void setNodePtr(std::shared_ptr* ptr); private: void release(); int getNumComponents(); void dfs(std::shared_ptr& node, std::vector>& comp, std::unordered_map& used); ngraph::ParameterVector inputs_vec; std::shared_ptr ngraph_function; std::vector>> components; std::unordered_map* > all_nodes; InferenceEngine::ExecutableNetwork netExec; InferenceEngine::BlobMap allBlobs; std::string device_name; bool isInit = false; struct NgraphReqWrapper { NgraphReqWrapper() : isReady(true) {} void makePromises(const std::vector >& outs); InferenceEngine::InferRequest req; std::vector outProms; std::vector outsNames; bool isReady; }; std::vector > infRequests; InferenceEngine::CNNNetwork cnn; bool hasNetOwner; std::vector requestedOutputs; std::unordered_set> unconnectedNodes; }; class InfEngineNgraphNode : public BackendNode { public: InfEngineNgraphNode(std::shared_ptr&& _node); InfEngineNgraphNode(std::shared_ptr& _node); void setName(const std::string& name); // Inference Engine network object that allows to obtain the outputs of this layer. std::shared_ptr node; Ptr net; }; class NgraphBackendWrapper : public BackendWrapper { public: NgraphBackendWrapper(int targetId, const Mat& m); NgraphBackendWrapper(Ptr wrapper); ~NgraphBackendWrapper(); static Ptr create(Ptr wrapper); virtual void copyToHost() CV_OVERRIDE; virtual void setHostDirty() CV_OVERRIDE; InferenceEngine::DataPtr dataPtr; InferenceEngine::Blob::Ptr blob; AsyncArray futureMat; }; InferenceEngine::DataPtr ngraphDataNode(const Ptr& ptr); // This is a fake class to run networks from Model Optimizer. Objects of that // class simulate responses of layers are imported by OpenCV and supported by // Inference Engine. The main difference is that they do not perform forward pass. class NgraphBackendLayer : public Layer { public: NgraphBackendLayer(const InferenceEngine::CNNNetwork &t_net_) : t_net(t_net_) {}; virtual bool getMemoryShapes(const std::vector &inputs, const int requiredOutputs, std::vector &outputs, std::vector &internals) const CV_OVERRIDE; virtual void forward(InputArrayOfArrays inputs, OutputArrayOfArrays outputs, OutputArrayOfArrays internals) CV_OVERRIDE; virtual bool supportBackend(int backendId) CV_OVERRIDE; private: InferenceEngine::CNNNetwork t_net; }; #endif // HAVE_DNN_NGRAPH void forwardNgraph(const std::vector >& outBlobsWrappers, Ptr& node, bool isAsync); }} // namespace cv::dnn #endif // __OPENCV_DNN_IE_NGRAPH_HPP__