From aafb7567c14f4acfa21a166207ed4a18efb0432e Mon Sep 17 00:00:00 2001 From: TolyaTalamanov Date: Mon, 3 Oct 2022 10:58:21 +0000 Subject: [PATCH] Add tests --- .../gapi/include/opencv2/gapi/infer/ie.hpp | 15 ++-- modules/gapi/src/backends/ie/giebackend.cpp | 14 ++-- .../gapi/test/infer/gapi_infer_ie_test.cpp | 71 +++++++++++++++++++ 3 files changed, 86 insertions(+), 14 deletions(-) diff --git a/modules/gapi/include/opencv2/gapi/infer/ie.hpp b/modules/gapi/include/opencv2/gapi/infer/ie.hpp index 27c479624a..4495ac811f 100644 --- a/modules/gapi/include/opencv2/gapi/infer/ie.hpp +++ b/modules/gapi/include/opencv2/gapi/infer/ie.hpp @@ -52,6 +52,8 @@ enum class TraitAs: int using IEConfig = std::map; +enum InferMode {Sync, Async}; + namespace detail { struct ParamDesc { std::string model_path; @@ -89,7 +91,6 @@ struct ParamDesc { cv::optional vpl_preproc_device; cv::optional vpl_preproc_ctx; - enum InferMode {Sync, Async}; InferMode mode; }; } // namespace detail @@ -136,7 +137,7 @@ public: , {} , {} , {} - , detail::ParamDesc::InferMode::Async} { + , InferMode::Async} { }; /** @overload @@ -161,7 +162,7 @@ public: , {} , {} , {} - , detail::ParamDesc::InferMode::Async} { + , InferMode::Async} { }; /** @brief Specifies sequence of network input layers names for inference. @@ -367,7 +368,7 @@ public: @param mode Inference mode which will be used. @return reference to this parameter structure. */ - Params& cfgInferMode(detail::ParamDesc::InferMode mode) { + Params& cfgInferMode(InferMode mode) { desc.mode = mode; return *this; } @@ -407,7 +408,7 @@ public: : desc{ model, weights, device, {}, {}, {}, 0u, 0u, detail::ParamDesc::Kind::Load, true, {}, {}, {}, 1u, {}, {}, {}, {}, - detail::ParamDesc::InferMode::Async }, + InferMode::Async }, m_tag(tag) { }; @@ -426,7 +427,7 @@ public: : desc{ model, {}, device, {}, {}, {}, 0u, 0u, detail::ParamDesc::Kind::Import, true, {}, {}, {}, 1u, {}, {}, {}, {}, - detail::ParamDesc::InferMode::Async }, + InferMode::Async }, m_tag(tag) { }; @@ -500,7 +501,7 @@ public: } /** @see ie::Params::cfgInferAPI */ - Params& cfgInferMode(detail::ParamDesc::InferMode mode) { + Params& cfgInferMode(InferMode mode) { desc.mode = mode; return *this; } diff --git a/modules/gapi/src/backends/ie/giebackend.cpp b/modules/gapi/src/backends/ie/giebackend.cpp index af0c97108f..27860c8fec 100644 --- a/modules/gapi/src/backends/ie/giebackend.cpp +++ b/modules/gapi/src/backends/ie/giebackend.cpp @@ -376,10 +376,10 @@ struct IEUnit { GAPI_LOG_INFO(nullptr, "VPP preproc created successfuly"); } - if (params.mode == cv::gapi::ie::detail::ParamDesc::InferMode::Sync && + if (params.mode == cv::gapi::ie::InferMode::Sync && params.nireq != 1u) { throw std::logic_error( - "Failed: ParamDesc::InferMode::Sync works only with nireq equal to 1."); + "Failed: cv::gapi::ie::InferMode::Sync works only with nireq equal to 1."); } } @@ -917,7 +917,7 @@ void AsyncInferExecutor::callback(IInferExecutor::Task task, class cv::gimpl::ie::RequestPool { public: - explicit RequestPool(cv::gapi::ie::detail::ParamDesc::InferMode mode, + explicit RequestPool(cv::gapi::ie::InferMode mode, std::vector&& requests); IInferExecutor::Ptr getIdleRequest(); @@ -936,21 +936,21 @@ void cv::gimpl::ie::RequestPool::release(const size_t id) { } // RequestPool implementation ////////////////////////////////////////////// -cv::gimpl::ie::RequestPool::RequestPool(cv::gapi::ie::detail::ParamDesc::InferMode mode, +cv::gimpl::ie::RequestPool::RequestPool(cv::gapi::ie::InferMode mode, std::vector&& requests) { for (size_t i = 0; i < requests.size(); ++i) { IInferExecutor::Ptr iexec = nullptr; switch (mode) { - case cv::gapi::ie::detail::ParamDesc::InferMode::Async: + case cv::gapi::ie::InferMode::Async: iexec = std::make_shared(std::move(requests[i]), std::bind(&RequestPool::release, this, i)); break; - case cv::gapi::ie::detail::ParamDesc::InferMode::Sync: + case cv::gapi::ie::InferMode::Sync: iexec = std::make_shared(std::move(requests[i]), std::bind(&RequestPool::release, this, i)); break; default: - GAPI_Assert(false && "Unsupported ParamDesc::InferMode"); + GAPI_Assert(false && "Unsupported cv::gapi::ie::InferMode"); } m_requests.emplace_back(std::move(iexec)); } diff --git a/modules/gapi/test/infer/gapi_infer_ie_test.cpp b/modules/gapi/test/infer/gapi_infer_ie_test.cpp index 3741438373..fff24e4062 100644 --- a/modules/gapi/test/infer/gapi_infer_ie_test.cpp +++ b/modules/gapi/test/infer/gapi_infer_ie_test.cpp @@ -2956,6 +2956,77 @@ TEST(TestAgeGender, ThrowBlobAndInputPrecisionMismatchStreaming) } } +struct AgeGenderInferTest: public ::testing::Test { + cv::Mat m_in_mat; + cv::Mat m_gapi_age; + cv::Mat m_gapi_gender; + + cv::gimpl::ie::wrap::Plugin m_plugin; + IE::CNNNetwork m_net; + cv::gapi::ie::detail::ParamDesc m_params; + + using AGInfo = std::tuple; + G_API_NET(AgeGender, , "test-age-gender"); + + void SetUp() { + initDLDTDataPath(); + m_params.model_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.xml"); + m_params.weights_path = findDataFile(SUBDIR + "age-gender-recognition-retail-0013.bin"); + m_params.device_id = "CPU"; + + m_plugin = cv::gimpl::ie::wrap::getPlugin(m_params); + m_net = cv::gimpl::ie::wrap::readNetwork(m_params); + setNetParameters(m_net); + + m_in_mat = cv::Mat(cv::Size(320, 240), CV_8UC3); + cv::randu(m_in_mat, 0, 255); + } + + cv::GComputation buildGraph() { + cv::GMat in, age, gender; + std::tie(age, gender) = cv::gapi::infer(in); + return cv::GComputation(cv::GIn(in), cv::GOut(age, gender)); + } + + void validate() { + IE::Blob::Ptr ie_age, ie_gender; + { + auto this_network = cv::gimpl::ie::wrap::loadNetwork(m_plugin, m_net, m_params); + auto infer_request = this_network.CreateInferRequest(); + infer_request.SetBlob("data", cv::gapi::ie::util::to_ie(m_in_mat)); + infer_request.Infer(); + ie_age = infer_request.GetBlob("age_conv3"); + ie_gender = infer_request.GetBlob("prob"); + } + // Validate with IE itself (avoid DNN module dependency here) + normAssert(cv::gapi::ie::util::to_ocv(ie_age), m_gapi_age, "Test age output" ); + normAssert(cv::gapi::ie::util::to_ocv(ie_gender), m_gapi_gender, "Test gender output"); + } +}; + +TEST_F(AgeGenderInferTest, SyncExecution) { + auto pp = cv::gapi::ie::Params { + m_params.model_path, m_params.weights_path, m_params.device_id + }.cfgOutputLayers({ "age_conv3", "prob" }) + .cfgInferMode(cv::gapi::ie::InferMode::Sync); + + buildGraph().apply(cv::gin(m_in_mat), cv::gout(m_gapi_age, m_gapi_gender), + cv::compile_args(cv::gapi::networks(pp))); + + validate(); +} + +TEST_F(AgeGenderInferTest, ThrowSyncWithNireqNotEqualToOne) { + auto pp = cv::gapi::ie::Params { + m_params.model_path, m_params.weights_path, m_params.device_id + }.cfgOutputLayers({ "age_conv3", "prob" }) + .cfgInferMode(cv::gapi::ie::InferMode::Sync) + .cfgNumRequests(4u); + + EXPECT_ANY_THROW(buildGraph().apply(cv::gin(m_in_mat), cv::gout(m_gapi_age, m_gapi_gender), + cv::compile_args(cv::gapi::networks(pp)))); +} + } // namespace opencv_test #endif // HAVE_INF_ENGINE