diff --git a/modules/gapi/include/opencv2/gapi/infer/ie.hpp b/modules/gapi/include/opencv2/gapi/infer/ie.hpp index 1e8fbc576c..d74cf77acd 100644 --- a/modules/gapi/include/opencv2/gapi/infer/ie.hpp +++ b/modules/gapi/include/opencv2/gapi/infer/ie.hpp @@ -89,13 +89,17 @@ struct ParamDesc { cv::optional vpl_preproc_device; cv::optional vpl_preproc_ctx; - using precision_t = int; - using precision_map_t = std::unordered_map; - // NB: cv::util::monostate is default value that means precision wasn't specified. - using precision_variant_t = cv::util::variant; - precision_variant_t output_precision; + using PrecisionT = int; + using PrecisionMapT = std::unordered_map; + // NB: This parameter can contain: + // 1. cv::util::monostate - Don't specify precision, but use default from IR/Blob. + // 2. PrecisionT (CV_8U, CV_32F, ...) - Specifies precision for all output layers. + // 3. PrecisionMapT ({{"layer0", CV_32F}, {"layer1", CV_16F}} - Specifies precision for certain output layer. + // cv::util::monostate is default value that means precision wasn't specified. + using PrecisionVariantT = cv::util::variant; + PrecisionVariantT output_precision; }; } // namespace detail @@ -366,21 +370,23 @@ public: The function is used to set an output precision for model. - @param precision Precision in OpenCV format. + @param precision Precision in OpenCV format (CV_8U, CV_32F, ...) + will be applied to all output layers. @return reference to this parameter structure. */ - Params& cfgOutputPrecision(detail::ParamDesc::precision_t precision) { + Params& cfgOutputPrecision(detail::ParamDesc::PrecisionT precision) { desc.output_precision = precision; return *this; } /** @overload - @param precision_map Map of pairs: name of corresponding output layer and its precision + @param precision_map Map of pairs: name of corresponding output layer + and its precision in OpenCV format (CV_8U, CV_32F, ...) @return reference to this parameter structure. */ Params& - cfgOutputPrecision(detail::ParamDesc::precision_map_t precision_map) { + cfgOutputPrecision(detail::ParamDesc::PrecisionMapT precision_map) { desc.output_precision = precision_map; return *this; } @@ -511,14 +517,14 @@ public: } /** @see ie::Params::cfgOutputPrecision */ - Params& cfgOutputPrecision(detail::ParamDesc::precision_t precision) { + Params& cfgOutputPrecision(detail::ParamDesc::PrecisionT precision) { desc.output_precision = precision; return *this; } /** @overload */ Params& - cfgOutputPrecision(detail::ParamDesc::precision_map_t precision_map) { + cfgOutputPrecision(detail::ParamDesc::PrecisionMapT precision_map) { desc.output_precision = precision_map; return *this; } diff --git a/modules/gapi/src/backends/ie/giebackend.cpp b/modules/gapi/src/backends/ie/giebackend.cpp index b76a468496..6c95b860a9 100644 --- a/modules/gapi/src/backends/ie/giebackend.cpp +++ b/modules/gapi/src/backends/ie/giebackend.cpp @@ -201,10 +201,10 @@ inline void copyFromIE(const IE::Blob::Ptr &blob, MatType &mat) { const auto ie_type = toCV(desc.getPrecision()); if (ie_type != mat.type()) { std::stringstream ss; - ss << "Failed while copying blob from IE to OCV: " - << "Blobs have different data types.\n" - << "IE type: " << ie_type << "\n" - << "OCV type: " << mat.type() << std::endl; + ss << "Failed to copy blob from IE to OCV: " + << "Blobs have different data types " + << "(IE type: " << ie_type + << " vs OCV type: " << mat.type() << ")." << std::endl; throw std::logic_error(ss.str()); } switch (blob->getTensorDesc().getPrecision()) { @@ -1140,29 +1140,25 @@ static IE::PreProcessInfo configurePreProcInfo(const IE::InputInfo::CPtr& ii, } using namespace cv::gapi::ie::detail; -static void configureOutputPrecision(const IE::OutputsDataMap &outputs_info, - const ParamDesc::precision_variant_t &output_precision) { - switch (output_precision.index()) { - case ParamDesc::precision_variant_t::index_of(): { - auto precision = toIE(cv::util::get(output_precision)); - for (auto it : outputs_info) { - it.second->setPrecision(precision); +static void configureOutputPrecision(const IE::OutputsDataMap &outputs_info, + const ParamDesc::PrecisionVariantT &output_precision) { + cv::util::visit(cv::util::overload_lambdas( + [&outputs_info](ParamDesc::PrecisionT cvdepth) { + auto precision = toIE(cvdepth); + for (auto it : outputs_info) { + it.second->setPrecision(precision); + } + }, + [&outputs_info](const ParamDesc::PrecisionMapT& precision_map) { + for (auto it : precision_map) { + outputs_info.at(it.first)->setPrecision(toIE(it.second)); + } + }, + [&outputs_info](cv::util::monostate) { + // Do nothing. } - break; - } - case ParamDesc::precision_variant_t::index_of(): { - const auto& precision_map = - cv::util::get(output_precision); - for (auto it : precision_map) { - outputs_info.at(it.first)->setPrecision(toIE(it.second)); - } - break; - } - case ParamDesc::precision_variant_t::index_of(): { - // Do nothing; - break; - } - } + ), output_precision + ); } // NB: This is a callback used by async infer