// 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) 2019 Intel Corporation #ifndef OPENCV_GAPI_INFER_IE_HPP #define OPENCV_GAPI_INFER_IE_HPP #include #include #include #include // tuple, tuple_size #include #include #include // GAPI_EXPORTS #include // GKernelPackage namespace cv { namespace gapi { // FIXME: introduce a new sub-namespace for NN? namespace ie { GAPI_EXPORTS cv::gapi::GBackend backend(); /** * Specify how G-API and IE should trait input data * * In OpenCV, the same cv::Mat is used to represent both * image and tensor data. Sometimes those are hardly distinguishable, * so this extra parameter is used to give G-API a hint. * * This hint controls how G-API reinterprets the data when converting * it to IE Blob format (and which layout/etc is assigned to this data). */ enum class TraitAs: int { TENSOR, //!< G-API traits an associated cv::Mat as a raw tensor and passes dimensions as-is IMAGE //!< G-API traits an associated cv::Mat as an image so creates an "image" blob (NCHW/NHWC, etc) }; namespace detail { struct ParamDesc { std::string model_path; std::string weights_path; std::string device_id; // NB: Here order follows the `Net` API std::vector input_names; std::vector output_names; using ConstInput = std::pair; std::unordered_map const_inputs; // NB: nun_* may differ from topology's real input/output port numbers // (e.g. topology's partial execution) std::size_t num_in; // How many inputs are defined in the operation std::size_t num_out; // How many outputs are defined in the operation }; } // namespace detail // FIXME: this is probably a shared (reusable) thing template struct PortCfg { using In = std::array < std::string , std::tuple_size::value >; using Out = std::array < std::string , std::tuple_size::value >; }; template class Params { public: Params(const std::string &model, const std::string &weights, const std::string &device) : desc{ model, weights, device, {}, {}, {} , std::tuple_size::value , std::tuple_size::value } { }; Params& cfgInputLayers(const typename PortCfg::In &ll) { desc.input_names.clear(); desc.input_names.reserve(ll.size()); std::copy(ll.begin(), ll.end(), std::back_inserter(desc.input_names)); return *this; } Params& cfgOutputLayers(const typename PortCfg::Out &ll) { desc.output_names.clear(); desc.output_names.reserve(ll.size()); std::copy(ll.begin(), ll.end(), std::back_inserter(desc.output_names)); return *this; } Params& constInput(const std::string &layer_name, const cv::Mat &data, TraitAs hint = TraitAs::TENSOR) { desc.const_inputs[layer_name] = {data, hint}; return *this; } // BEGIN(G-API's network parametrization API) GBackend backend() const { return cv::gapi::ie::backend(); } std::string tag() const { return Net::tag(); } cv::util::any params() const { return { desc }; } // END(G-API's network parametrization API) protected: detail::ParamDesc desc; }; } // namespace ie } // namespace gapi } // namespace cv #endif // OPENCV_GAPI_INFER_HPP