void InfEngineBackendNet::init() { if (inputs.empty()) { // Collect all external input blobs. inputs.clear(); std::map<std::string, InferenceEngine::DataPtr> internalOutputs; for (const auto& l : layers) { for (const InferenceEngine::DataWeakPtr& ptr : l->insData) { InferenceEngine::DataPtr inp(ptr); if (internalOutputs.find(inp->name) == internalOutputs.end()) { InferenceEngine::InputInfo::Ptr inpInfo(new InferenceEngine::InputInfo()); inpInfo->setInputData(inp); if (inputs.find(inp->name) == inputs.end()) inputs[inp->name] = inpInfo; } } for (const InferenceEngine::DataPtr& out : l->outData) { // TODO: Replace to uniquness assertion. if (internalOutputs.find(out->name) == internalOutputs.end()) internalOutputs[out->name] = out; } } CV_Assert(!inputs.empty()); } if (outputs.empty()) { // Add all unconnected blobs to output blobs. InferenceEngine::OutputsDataMap unconnectedOuts; for (const auto& l : layers) { // Add all outputs. for (const InferenceEngine::DataPtr& out : l->outData) { // TODO: Replace to uniquness assertion. if (unconnectedOuts.find(out->name) == unconnectedOuts.end()) unconnectedOuts[out->name] = out; } // Remove internally connected outputs. for (const InferenceEngine::DataWeakPtr& inp : l->insData) { unconnectedOuts.erase(InferenceEngine::DataPtr(inp)->name); } } CV_Assert(!unconnectedOuts.empty()); for (auto it = unconnectedOuts.begin(); it != unconnectedOuts.end(); ++it) { outputs[it->first] = it->second; } } // Set up input blobs. inpBlobs.clear(); for (const auto& it : inputs) { CV_Assert(allBlobs.find(it.first) != allBlobs.end()); inpBlobs[it.first] = allBlobs[it.first]; } // Set up output blobs. outBlobs.clear(); for (const auto& it : outputs) { CV_Assert(allBlobs.find(it.first) != allBlobs.end()); outBlobs[it.first] = allBlobs[it.first]; } if (!isInitialized()) initPlugin(*this); }
void InfEngineBackendNet::init(int targetId) { if (inputs.empty()) { // Collect all external input blobs. inputs.clear(); std::map<std::string, InferenceEngine::DataPtr> internalOutputs; for (const auto& l : layers) { for (const InferenceEngine::DataWeakPtr& ptr : l->insData) { InferenceEngine::DataPtr inp(ptr); if (internalOutputs.find(inp->name) == internalOutputs.end()) { InferenceEngine::InputInfo::Ptr inpInfo(new InferenceEngine::InputInfo()); inpInfo->setInputData(inp); if (inputs.find(inp->name) == inputs.end()) inputs[inp->name] = inpInfo; } } for (const InferenceEngine::DataPtr& out : l->outData) { // TODO: Replace to uniqueness assertion. if (internalOutputs.find(out->name) == internalOutputs.end()) internalOutputs[out->name] = out; } } CV_Assert(!inputs.empty()); } if (outputs.empty()) { // Add all unconnected blobs to output blobs. InferenceEngine::OutputsDataMap unconnectedOuts; for (const auto& l : layers) { // Add all outputs. for (const InferenceEngine::DataPtr& out : l->outData) { // TODO: Replace to uniqueness assertion. if (unconnectedOuts.find(out->name) == unconnectedOuts.end()) unconnectedOuts[out->name] = out; } // Remove internally connected outputs. for (const InferenceEngine::DataWeakPtr& inp : l->insData) { unconnectedOuts.erase(InferenceEngine::DataPtr(inp)->name); } } CV_Assert(!unconnectedOuts.empty()); for (auto it = unconnectedOuts.begin(); it != unconnectedOuts.end(); ++it) { outputs[it->first] = it->second; } } // Set up input blobs. inpBlobs.clear(); for (const auto& it : inputs) { CV_Assert(allBlobs.find(it.first) != allBlobs.end()); inpBlobs[it.first] = allBlobs[it.first]; it.second->setPrecision(inpBlobs[it.first]->precision()); } // Set up output blobs. outBlobs.clear(); for (const auto& it : outputs) { CV_Assert(allBlobs.find(it.first) != allBlobs.end()); outBlobs[it.first] = allBlobs[it.first]; } switch (targetId) { case DNN_TARGET_CPU: setTargetDevice(InferenceEngine::TargetDevice::eCPU); break; case DNN_TARGET_OPENCL_FP16: setPrecision(InferenceEngine::Precision::FP16); /* Falls through. */ case DNN_TARGET_OPENCL: setTargetDevice(InferenceEngine::TargetDevice::eGPU); break; case DNN_TARGET_MYRIAD: { setPrecision(InferenceEngine::Precision::FP16); setTargetDevice(InferenceEngine::TargetDevice::eMYRIAD); break; } default: CV_Error(Error::StsError, format("Unknown target identifier: %d", targetId)); } if (!isInitialized()) initPlugin(*this); }