提交 0711dab0 编写于 作者: D Dmitry Kurtaev

Fix Intel's Inference Engine backend from future. Second try.

上级 5f578425
...@@ -1637,6 +1637,27 @@ struct Net::Impl ...@@ -1637,6 +1637,27 @@ struct Net::Impl
preferableTarget == DNN_TARGET_MYRIAD || preferableTarget == DNN_TARGET_MYRIAD ||
preferableTarget == DNN_TARGET_FPGA) && !fused) preferableTarget == DNN_TARGET_FPGA) && !fused)
{ {
#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R5)
bool hasWeights = false;
for (const std::string& name : {"weights", "biases"})
{
auto it = ieNode->layer.getParameters().find(name);
if (it != ieNode->layer.getParameters().end())
{
InferenceEngine::Blob::CPtr bp = it->second.as<InferenceEngine::Blob::CPtr>();
it->second = (InferenceEngine::Blob::CPtr)convertFp16(std::const_pointer_cast<InferenceEngine::Blob>(bp));
hasWeights = true;
}
}
if (!hasWeights)
{
InferenceEngine::Blob::Ptr blob = InferenceEngine::make_shared_blob<int16_t>(
InferenceEngine::Precision::FP16,
InferenceEngine::Layout::C, {1});
blob->allocate();
ieNode->layer.getParameters()["weights"] = (InferenceEngine::Blob::CPtr)blob;
}
#else
auto& blobs = ieNode->layer.getConstantData(); auto& blobs = ieNode->layer.getConstantData();
if (blobs.empty()) if (blobs.empty())
{ {
...@@ -1653,6 +1674,7 @@ struct Net::Impl ...@@ -1653,6 +1674,7 @@ struct Net::Impl
for (auto& it : blobs) for (auto& it : blobs)
it.second = convertFp16(std::const_pointer_cast<InferenceEngine::Blob>(it.second)); it.second = convertFp16(std::const_pointer_cast<InferenceEngine::Blob>(it.second));
} }
#endif
} }
if (!fused) if (!fused)
...@@ -1724,7 +1746,7 @@ struct Net::Impl ...@@ -1724,7 +1746,7 @@ struct Net::Impl
if (!ieNode->net->isInitialized()) if (!ieNode->net->isInitialized())
{ {
#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) #if INF_ENGINE_VER_MAJOR_EQ(INF_ENGINE_RELEASE_2018R4)
// For networks which is built in runtime we need to specify a // For networks which is built in runtime we need to specify a
// version of it's hyperparameters. // version of it's hyperparameters.
std::string versionTrigger = "<net name=\"TestInput\" version=\"3\" batch=\"1\">" std::string versionTrigger = "<net name=\"TestInput\" version=\"3\" batch=\"1\">"
......
...@@ -276,23 +276,29 @@ public: ...@@ -276,23 +276,29 @@ public:
InferenceEngine::Builder::Layer l = ieLayer; InferenceEngine::Builder::Layer l = ieLayer;
const int numChannels = input->dims[2]; // NOTE: input->dims are reversed (whcn) const int numChannels = input->dims[2]; // NOTE: input->dims are reversed (whcn)
InferenceEngine::Blob::Ptr weights;
if (blobs.empty()) if (blobs.empty())
{ {
auto weights = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32, auto onesBlob = InferenceEngine::make_shared_blob<float>(InferenceEngine::Precision::FP32,
InferenceEngine::Layout::C, InferenceEngine::Layout::C,
{(size_t)numChannels}); {(size_t)numChannels});
weights->allocate(); onesBlob->allocate();
std::vector<float> ones(numChannels, 1); std::vector<float> ones(numChannels, 1);
weights->set(ones); onesBlob->set(ones);
l.addConstantData("weights", weights); weights = onesBlob;
l.getParameters()["channel_shared"] = false; l.getParameters()["channel_shared"] = false;
} }
else else
{ {
CV_Assert(numChannels == blobs[0].total()); CV_Assert(numChannels == blobs[0].total());
l.addConstantData("weights", wrapToInfEngineBlob(blobs[0], {(size_t)numChannels}, InferenceEngine::Layout::C)); weights = wrapToInfEngineBlob(blobs[0], {(size_t)numChannels}, InferenceEngine::Layout::C);
l.getParameters()["channel_shared"] = blobs[0].total() == 1; l.getParameters()["channel_shared"] = blobs[0].total() == 1;
} }
#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R5)
l.getParameters()["weights"] = (InferenceEngine::Blob::CPtr)weights;
#else
l.addConstantData("weights", weights);
#endif
l.getParameters()["across_spatial"] = acrossSpatial; l.getParameters()["across_spatial"] = acrossSpatial;
return Ptr<BackendNode>(new InfEngineBackendNode(l)); return Ptr<BackendNode>(new InfEngineBackendNode(l));
} }
......
...@@ -173,7 +173,7 @@ public: ...@@ -173,7 +173,7 @@ public:
ieLayer.getParameters()["antialias"] = false; ieLayer.getParameters()["antialias"] = false;
if (scaleWidth != scaleHeight) if (scaleWidth != scaleHeight)
CV_Error(Error::StsNotImplemented, "resample with sw != sh"); CV_Error(Error::StsNotImplemented, "resample with sw != sh");
ieLayer.getParameters()["factor"] = 1.0 / scaleWidth; ieLayer.getParameters()["factor"] = 1.0f / scaleWidth;
} }
else if (interpolation == "bilinear") else if (interpolation == "bilinear")
{ {
......
...@@ -766,7 +766,7 @@ void InfEngineBackendLayer::forward(InputArrayOfArrays inputs, OutputArrayOfArra ...@@ -766,7 +766,7 @@ void InfEngineBackendLayer::forward(InputArrayOfArrays inputs, OutputArrayOfArra
CV_Error(Error::StsInternal, "Choose Inference Engine as a preferable backend."); CV_Error(Error::StsInternal, "Choose Inference Engine as a preferable backend.");
} }
InferenceEngine::TBlob<int16_t>::Ptr convertFp16(const InferenceEngine::Blob::Ptr& blob) InferenceEngine::Blob::Ptr convertFp16(const InferenceEngine::Blob::Ptr& blob)
{ {
auto halfs = InferenceEngine::make_shared_blob<int16_t>(InferenceEngine::Precision::FP16, blob->layout(), blob->dims()); auto halfs = InferenceEngine::make_shared_blob<int16_t>(InferenceEngine::Precision::FP16, blob->layout(), blob->dims());
halfs->allocate(); halfs->allocate();
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#define INF_ENGINE_VER_MAJOR_GT(ver) (((INF_ENGINE_RELEASE) / 10000) > ((ver) / 10000)) #define INF_ENGINE_VER_MAJOR_GT(ver) (((INF_ENGINE_RELEASE) / 10000) > ((ver) / 10000))
#define INF_ENGINE_VER_MAJOR_GE(ver) (((INF_ENGINE_RELEASE) / 10000) >= ((ver) / 10000)) #define INF_ENGINE_VER_MAJOR_GE(ver) (((INF_ENGINE_RELEASE) / 10000) >= ((ver) / 10000))
#define INF_ENGINE_VER_MAJOR_LT(ver) (((INF_ENGINE_RELEASE) / 10000) < ((ver) / 10000)) #define INF_ENGINE_VER_MAJOR_LT(ver) (((INF_ENGINE_RELEASE) / 10000) < ((ver) / 10000))
#define INF_ENGINE_VER_MAJOR_EQ(ver) (((INF_ENGINE_RELEASE) / 10000) == ((ver) / 10000))
#if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R5) #if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R5)
#include <ie_builders.hpp> #include <ie_builders.hpp>
...@@ -252,7 +253,7 @@ Mat infEngineBlobToMat(const InferenceEngine::Blob::Ptr& blob); ...@@ -252,7 +253,7 @@ Mat infEngineBlobToMat(const InferenceEngine::Blob::Ptr& blob);
// Convert Inference Engine blob with FP32 precision to FP16 precision. // Convert Inference Engine blob with FP32 precision to FP16 precision.
// Allocates memory for a new blob. // Allocates memory for a new blob.
InferenceEngine::TBlob<int16_t>::Ptr convertFp16(const InferenceEngine::Blob::Ptr& blob); InferenceEngine::Blob::Ptr convertFp16(const InferenceEngine::Blob::Ptr& blob);
// This is a fake class to run networks from Model Optimizer. Objects of that // This is a fake class to run networks from Model Optimizer. Objects of that
// class simulate responses of layers are imported by OpenCV and supported by // class simulate responses of layers are imported by OpenCV and supported by
......
...@@ -694,6 +694,11 @@ TEST_P(Eltwise, Accuracy) ...@@ -694,6 +694,11 @@ TEST_P(Eltwise, Accuracy)
Backend backendId = get<0>(get<4>(GetParam())); Backend backendId = get<0>(get<4>(GetParam()));
Target targetId = get<1>(get<4>(GetParam())); Target targetId = get<1>(get<4>(GetParam()));
#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE > 2018050000
if (backendId == DNN_BACKEND_INFERENCE_ENGINE && targetId == DNN_TARGET_OPENCL)
throw SkipTestException("");
#endif
Net net; Net net;
std::vector<int> convLayerIds(numConv); std::vector<int> convLayerIds(numConv);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册