diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp index 01268d7842..680e7d54d1 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -944,6 +944,13 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN CV_OUT std::vector& indices, const float eta = 1.f, const int top_k = 0); + /** @brief Release a Myriad device is binded by OpenCV. + * + * Single Myriad device cannot be shared across multiple processes which uses + * Inference Engine's Myriad plugin. + */ + CV_EXPORTS_W void resetMyriadDevice(); + //! @} CV__DNN_EXPERIMENTAL_NS_END } diff --git a/modules/dnn/src/op_inf_engine.cpp b/modules/dnn/src/op_inf_engine.cpp index 85f6690790..23794a187d 100644 --- a/modules/dnn/src/op_inf_engine.cpp +++ b/modules/dnn/src/op_inf_engine.cpp @@ -443,13 +443,14 @@ void InfEngineBackendNet::init(int targetId) initPlugin(*this); } +static std::map sharedPlugins; + void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net) { CV_Assert(!isInitialized()); try { - static std::map sharedPlugins; auto pluginIt = sharedPlugins.find(targetDevice); if (pluginIt != sharedPlugins.end()) { @@ -589,4 +590,14 @@ void forwardInfEngine(Ptr& node) #endif // HAVE_INF_ENGINE } +CV__DNN_EXPERIMENTAL_NS_BEGIN + +void resetMyriadDevice() +{ +#ifdef HAVE_INF_ENGINE + sharedPlugins.erase(InferenceEngine::TargetDevice::eMYRIAD); +#endif // HAVE_INF_ENGINE +} + +CV__DNN_EXPERIMENTAL_NS_END }} // namespace dnn, namespace cv diff --git a/modules/dnn/test/test_ie_models.cpp b/modules/dnn/test/test_ie_models.cpp index 7507ea74b6..01ecb72986 100644 --- a/modules/dnn/test/test_ie_models.cpp +++ b/modules/dnn/test/test_ie_models.cpp @@ -177,6 +177,11 @@ TEST_P(DNNTestOpenVINO, models) Target target = (dnn::Target)(int)get<0>(GetParam()); std::string modelName = get<1>(GetParam()); + if (target == DNN_TARGET_MYRIAD && (modelName == "landmarks-regression-retail-0001" || + modelName == "semantic-segmentation-adas-0001" || + modelName == "face-reidentification-retail-0001")) + throw SkipTestException(""); + std::string precision = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? "FP16" : "FP32"; std::string prefix = utils::fs::join("intel_models", utils::fs::join(modelName, @@ -186,6 +191,8 @@ TEST_P(DNNTestOpenVINO, models) std::map inputsMap; std::map ieOutputsMap, cvOutputsMap; + // Single Myriad device cannot be shared across multiple processes. + resetMyriadDevice(); runIE(target, xmlPath, binPath, inputsMap, ieOutputsMap); runCV(target, xmlPath, binPath, inputsMap, cvOutputsMap); @@ -238,8 +245,8 @@ static testing::internal::ParamGenerator dnnDLIETargets() targets.push_back(DNN_TARGET_OPENCL_FP16); } #endif - //if (checkMyriadTarget()) - // targets.push_back(DNN_TARGET_MYRIAD); + if (checkMyriadTarget()) + targets.push_back(DNN_TARGET_MYRIAD); return testing::ValuesIn(targets); }