Commit 055f33ec authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

Merge pull request #11657 from dkurt:dnn_ie_multiple_networks

parents c7183775 ab389142
...@@ -361,10 +361,20 @@ void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net) ...@@ -361,10 +361,20 @@ void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net)
{ {
CV_Assert(!isInitialized()); CV_Assert(!isInitialized());
InferenceEngine::StatusCode status; static std::map<std::string, InferenceEngine::InferenceEnginePluginPtr> sharedPlugins;
InferenceEngine::ResponseDesc resp; std::string deviceName = InferenceEngine::getDeviceName(targetDevice);
auto pluginIt = sharedPlugins.find(deviceName);
if (pluginIt != sharedPlugins.end())
{
enginePtr = pluginIt->second;
}
else
{
enginePtr = InferenceEngine::PluginDispatcher({""}).getSuitablePlugin(targetDevice);
sharedPlugins[deviceName] = enginePtr;
}
plugin = InferenceEngine::InferencePlugin(enginePtr);
plugin = InferenceEngine::PluginDispatcher({""}).getSuitablePlugin(targetDevice);
if (targetDevice == InferenceEngine::TargetDevice::eCPU) if (targetDevice == InferenceEngine::TargetDevice::eCPU)
{ {
#ifdef _WIN32 #ifdef _WIN32
...@@ -374,18 +384,17 @@ void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net) ...@@ -374,18 +384,17 @@ void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net)
InferenceEngine::IExtensionPtr extension = InferenceEngine::IExtensionPtr extension =
InferenceEngine::make_so_pointer<InferenceEngine::IExtension>("libcpu_extension.so"); InferenceEngine::make_so_pointer<InferenceEngine::IExtension>("libcpu_extension.so");
#endif // _WIN32 #endif // _WIN32
status = plugin->AddExtension(extension, &resp); plugin.AddExtension(extension);
if (status != InferenceEngine::StatusCode::OK)
CV_Error(Error::StsAssert, resp.msg);
} }
status = plugin->LoadNetwork(net, &resp); netExec = plugin.LoadNetwork(net, {});
if (status != InferenceEngine::StatusCode::OK) infRequest = netExec.CreateInferRequest();
CV_Error(Error::StsAssert, resp.msg); infRequest.SetInput(inpBlobs);
infRequest.SetOutput(outBlobs);
} }
bool InfEngineBackendNet::isInitialized() bool InfEngineBackendNet::isInitialized()
{ {
return (bool)plugin; return (bool)enginePtr;
} }
void InfEngineBackendNet::addBlobs(const std::vector<Ptr<BackendWrapper> >& ptrs) void InfEngineBackendNet::addBlobs(const std::vector<Ptr<BackendWrapper> >& ptrs)
...@@ -399,10 +408,7 @@ void InfEngineBackendNet::addBlobs(const std::vector<Ptr<BackendWrapper> >& ptrs ...@@ -399,10 +408,7 @@ void InfEngineBackendNet::addBlobs(const std::vector<Ptr<BackendWrapper> >& ptrs
void InfEngineBackendNet::forward() void InfEngineBackendNet::forward()
{ {
InferenceEngine::ResponseDesc resp; infRequest.Infer();
InferenceEngine::StatusCode status = plugin->Infer(inpBlobs, outBlobs, &resp);
if (status != InferenceEngine::StatusCode::OK)
CV_Error(Error::StsAssert, resp.msg);
} }
Mat infEngineBlobToMat(const InferenceEngine::Blob::Ptr& blob) Mat infEngineBlobToMat(const InferenceEngine::Blob::Ptr& blob)
......
...@@ -89,7 +89,10 @@ private: ...@@ -89,7 +89,10 @@ private:
InferenceEngine::BlobMap allBlobs; InferenceEngine::BlobMap allBlobs;
InferenceEngine::TargetDevice targetDevice; InferenceEngine::TargetDevice targetDevice;
InferenceEngine::Precision precision; InferenceEngine::Precision precision;
InferenceEngine::InferenceEnginePluginPtr plugin; InferenceEngine::InferenceEnginePluginPtr enginePtr;
InferenceEngine::InferencePlugin plugin;
InferenceEngine::ExecutableNetwork netExec;
InferenceEngine::InferRequest infRequest;
void initPlugin(InferenceEngine::ICNNNetwork& net); void initPlugin(InferenceEngine::ICNNNetwork& net);
}; };
......
...@@ -887,6 +887,31 @@ TEST(Test_DLDT, fused_output) ...@@ -887,6 +887,31 @@ TEST(Test_DLDT, fused_output)
ASSERT_NO_THROW(net.forward()); ASSERT_NO_THROW(net.forward());
LayerFactory::unregisterLayer("Unsupported"); LayerFactory::unregisterLayer("Unsupported");
} }
TEST(Test_DLDT, multiple_networks)
{
Net nets[2];
for (int i = 0; i < 2; ++i)
{
nets[i].setInputsNames(std::vector<String>(1, format("input_%d", i)));
LayerParams lp;
lp.set("kernel_size", 1);
lp.set("num_output", 1);
lp.set("bias_term", false);
lp.type = "Convolution";
lp.name = format("testConv_%d", i);
lp.blobs.push_back(Mat({1, 1, 1, 1}, CV_32F, Scalar(1 + i)));
nets[i].addLayerToPrev(lp.name, lp.type, lp);
nets[i].setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
nets[i].setInput(Mat({1, 1, 1, 1}, CV_32FC1, Scalar(1)));
}
Mat out_1 = nets[0].forward();
Mat out_2 = nets[1].forward();
// After the second model is initialized we try to receive an output from the first network again.
out_1 = nets[0].forward();
normAssert(2 * out_1, out_2);
}
#endif // HAVE_INF_ENGINE #endif // HAVE_INF_ENGINE
// Test a custom layer. // Test a custom layer.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment