|
|
|
@ -654,7 +654,11 @@ void InfEngineNgraphNet::initPlugin(InferenceEngine::CNNNetwork& net) |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
InferenceEngine::IExtensionPtr extension = |
|
|
|
|
#if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2021_4) |
|
|
|
|
std::make_shared<InferenceEngine::Extension>(libName); |
|
|
|
|
#else |
|
|
|
|
InferenceEngine::make_so_pointer<InferenceEngine::IExtension>(libName); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
ie.AddExtension(extension, "CPU"); |
|
|
|
|
CV_LOG_INFO(NULL, "DNN-IE: Loaded extension plugin: " << libName); |
|
|
|
@ -1002,35 +1006,54 @@ void InfEngineNgraphNet::forward(const std::vector<Ptr<BackendWrapper> >& outBlo |
|
|
|
|
reqWrapper->req.SetInput(inpBlobs); |
|
|
|
|
reqWrapper->req.SetOutput(outBlobs); |
|
|
|
|
|
|
|
|
|
#if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2021_4) |
|
|
|
|
InferenceEngine::InferRequest infRequest = reqWrapper->req; |
|
|
|
|
NgraphReqWrapper* wrapperPtr = reqWrapper.get(); |
|
|
|
|
CV_Assert(wrapperPtr && "Internal error"); |
|
|
|
|
#else |
|
|
|
|
InferenceEngine::IInferRequest::Ptr infRequestPtr = reqWrapper->req; |
|
|
|
|
infRequestPtr->SetUserData(reqWrapper.get(), 0); |
|
|
|
|
CV_Assert(infRequestPtr); |
|
|
|
|
InferenceEngine::IInferRequest& infRequest = *infRequestPtr.get(); |
|
|
|
|
infRequest.SetUserData(reqWrapper.get(), 0); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
infRequestPtr->SetCompletionCallback( |
|
|
|
|
[](InferenceEngine::IInferRequest::Ptr request, InferenceEngine::StatusCode status) |
|
|
|
|
#if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2021_4) |
|
|
|
|
// do NOT capture 'reqWrapper' (smart ptr) in the lambda callback
|
|
|
|
|
infRequest.SetCompletionCallback<std::function<void(InferenceEngine::InferRequest, InferenceEngine::StatusCode)>>( |
|
|
|
|
[wrapperPtr](InferenceEngine::InferRequest /*request*/, InferenceEngine::StatusCode status) |
|
|
|
|
#else |
|
|
|
|
infRequest.SetCompletionCallback( |
|
|
|
|
[](InferenceEngine::IInferRequest::Ptr requestPtr, InferenceEngine::StatusCode status) |
|
|
|
|
#endif |
|
|
|
|
{ |
|
|
|
|
CV_LOG_DEBUG(NULL, "DNN(nGraph): completionCallback(" << (int)status << ")"); |
|
|
|
|
#if !INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2021_4) |
|
|
|
|
CV_Assert(requestPtr); |
|
|
|
|
InferenceEngine::IInferRequest& request = *requestPtr.get(); |
|
|
|
|
|
|
|
|
|
NgraphReqWrapper* wrapper; |
|
|
|
|
request->GetUserData((void**)&wrapper, 0); |
|
|
|
|
CV_Assert(wrapper && "Internal error"); |
|
|
|
|
NgraphReqWrapper* wrapperPtr; |
|
|
|
|
request.GetUserData((void**)&wrapperPtr, 0); |
|
|
|
|
CV_Assert(wrapperPtr && "Internal error"); |
|
|
|
|
#endif |
|
|
|
|
NgraphReqWrapper& wrapper = *wrapperPtr; |
|
|
|
|
|
|
|
|
|
size_t processedOutputs = 0; |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
for (; processedOutputs < wrapper->outProms.size(); ++processedOutputs) |
|
|
|
|
for (; processedOutputs < wrapper.outProms.size(); ++processedOutputs) |
|
|
|
|
{ |
|
|
|
|
const std::string& name = wrapper->outsNames[processedOutputs]; |
|
|
|
|
Mat m = ngraphBlobToMat(wrapper->req.GetBlob(name)); |
|
|
|
|
const std::string& name = wrapper.outsNames[processedOutputs]; |
|
|
|
|
Mat m = ngraphBlobToMat(wrapper.req.GetBlob(name)); |
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
CV_Assert(status == InferenceEngine::StatusCode::OK); |
|
|
|
|
wrapper->outProms[processedOutputs].setValue(m.clone()); |
|
|
|
|
wrapper.outProms[processedOutputs].setValue(m.clone()); |
|
|
|
|
} |
|
|
|
|
catch (...) |
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
wrapper->outProms[processedOutputs].setException(std::current_exception()); |
|
|
|
|
wrapper.outProms[processedOutputs].setException(std::current_exception()); |
|
|
|
|
} catch(...) { |
|
|
|
|
CV_LOG_ERROR(NULL, "DNN: Exception occurred during async inference exception propagation"); |
|
|
|
|
} |
|
|
|
@ -1040,16 +1063,16 @@ void InfEngineNgraphNet::forward(const std::vector<Ptr<BackendWrapper> >& outBlo |
|
|
|
|
catch (...) |
|
|
|
|
{ |
|
|
|
|
std::exception_ptr e = std::current_exception(); |
|
|
|
|
for (; processedOutputs < wrapper->outProms.size(); ++processedOutputs) |
|
|
|
|
for (; processedOutputs < wrapper.outProms.size(); ++processedOutputs) |
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
wrapper->outProms[processedOutputs].setException(e); |
|
|
|
|
wrapper.outProms[processedOutputs].setException(e); |
|
|
|
|
} catch(...) { |
|
|
|
|
CV_LOG_ERROR(NULL, "DNN: Exception occurred during async inference exception propagation"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
wrapper->isReady = true; |
|
|
|
|
wrapper.isReady = true; |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|