diff --git a/modules/dnn/perf/perf_net.cpp b/modules/dnn/perf/perf_net.cpp index ce870df049..df92ed7b76 100644 --- a/modules/dnn/perf/perf_net.cpp +++ b/modules/dnn/perf/perf_net.cpp @@ -214,8 +214,7 @@ PERF_TEST_P_(DNNTestNetwork, EAST_text_detection) PERF_TEST_P_(DNNTestNetwork, FastNeuralStyle_eccv16) { if (backend == DNN_BACKEND_HALIDE || - (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) || - (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD)) + (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16)) throw SkipTestException(""); processNet("dnn/fast_neural_style_eccv16_starry_night.t7", "", "", Mat(cv::Size(320, 240), CV_32FC3)); } diff --git a/modules/dnn/src/layers/slice_layer.cpp b/modules/dnn/src/layers/slice_layer.cpp index 0821979376..11dd4ea9e2 100644 --- a/modules/dnn/src/layers/slice_layer.cpp +++ b/modules/dnn/src/layers/slice_layer.cpp @@ -110,15 +110,9 @@ public: virtual bool supportBackend(int backendId) CV_OVERRIDE { -#ifdef HAVE_INF_ENGINE - if (backendId == DNN_BACKEND_INFERENCE_ENGINE) - { - return INF_ENGINE_VER_MAJOR_LT(INF_ENGINE_RELEASE_2018R5) && - sliceRanges.size() == 1 && sliceRanges[0].size() == 4; - } - else -#endif - return backendId == DNN_BACKEND_OPENCV; + return backendId == DNN_BACKEND_OPENCV || + (backendId == DNN_BACKEND_INFERENCE_ENGINE && + sliceRanges.size() == 1 && sliceRanges[0].size() == 4); } bool getMemoryShapes(const std::vector &inputs, @@ -264,39 +258,65 @@ public: #ifdef HAVE_INF_ENGINE virtual Ptr initInfEngine(const std::vector >& inputs) CV_OVERRIDE { -#if INF_ENGINE_VER_MAJOR_LT(INF_ENGINE_RELEASE_2018R5) - InferenceEngine::DataPtr input = infEngineDataNode(inputs[0]); - InferenceEngine::LayerParams lp; - lp.name = name; - lp.type = "Crop"; - lp.precision = InferenceEngine::Precision::FP32; - std::shared_ptr ieLayer(new InferenceEngine::CropLayer(lp)); - CV_Assert(sliceRanges.size() == 1); + std::vector axes, offsets, dims; int from, to, step; + int numDims = sliceRanges[0].size(); if (preferableTarget == DNN_TARGET_MYRIAD) { from = 1; - to = sliceRanges[0].size() + 1; + to = numDims; step = 1; } else { - from = sliceRanges[0].size() - 1; + from = numDims - 1; to = -1; step = -1; } for (int i = from; i != to; i += step) { - ieLayer->axis.push_back(i); - ieLayer->offset.push_back(sliceRanges[0][i].start); - ieLayer->dim.push_back(sliceRanges[0][i].end - sliceRanges[0][i].start); + axes.push_back(i); + offsets.push_back(sliceRanges[0][i].start); + dims.push_back(sliceRanges[0][i].size()); } + +#if INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R5) + std::vector outShape(numDims); + for (int i = 0; i < numDims; ++i) + outShape[numDims - 1 - i] = sliceRanges[0][i].size(); + + InferenceEngine::Builder::Layer ieLayer(name); + ieLayer.setName(name); + ieLayer.setType("Crop"); + ieLayer.getParameters()["axis"] = axes; + ieLayer.getParameters()["dim"] = dims; + ieLayer.getParameters()["offset"] = offsets; + ieLayer.setInputPorts(std::vector(2)); + ieLayer.setOutputPorts(std::vector(1)); + ieLayer.getInputPorts()[1].setParameter("type", "weights"); + + // Fake blob which will be moved to inputs (as weights). + auto shapeSource = InferenceEngine::make_shared_blob( + InferenceEngine::Precision::FP32, + InferenceEngine::Layout::ANY, outShape); + shapeSource->allocate(); + addConstantData("weights", shapeSource, ieLayer); + return Ptr(new InfEngineBackendNode(ieLayer)); #else - return Ptr(); + InferenceEngine::LayerParams lp; + lp.name = name; + lp.type = "Crop"; + lp.precision = InferenceEngine::Precision::FP32; + std::shared_ptr ieLayer(new InferenceEngine::CropLayer(lp)); + ieLayer->axis = axes; + ieLayer->offset = offsets; + ieLayer->dim = dims; + return Ptr(new InfEngineBackendNode(ieLayer)); #endif // IE < R5 + return Ptr(); } #endif }; diff --git a/modules/dnn/test/test_backends.cpp b/modules/dnn/test/test_backends.cpp index 564c4986a5..6de0657a1a 100644 --- a/modules/dnn/test/test_backends.cpp +++ b/modules/dnn/test/test_backends.cpp @@ -396,7 +396,7 @@ TEST_P(DNNTestNetwork, FastNeuralStyle_eccv16) Mat img = imread(findDataFile("dnn/googlenet_1.png", false)); Mat inp = blobFromImage(img, 1.0, Size(320, 240), Scalar(103.939, 116.779, 123.68), false, false); // Output image has values in range [-143.526, 148.539]. - float l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.3 : 4e-5; + float l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.4 : 4e-5; float lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 7.28 : 2e-3; processNet("dnn/fast_neural_style_eccv16_starry_night.t7", "", inp, "", "", l1, lInf); }