diff --git a/cmake/OpenCVDetectInferenceEngine.cmake b/cmake/OpenCVDetectInferenceEngine.cmake index e36eb0852b..d41f9243b4 100644 --- a/cmake/OpenCVDetectInferenceEngine.cmake +++ b/cmake/OpenCVDetectInferenceEngine.cmake @@ -78,9 +78,9 @@ endif() if(INF_ENGINE_TARGET) if(NOT INF_ENGINE_RELEASE) - message(WARNING "InferenceEngine version have not been set, 2018R3 will be used by default. Set INF_ENGINE_RELEASE variable if you experience build errors.") + message(WARNING "InferenceEngine version have not been set, 2018R4 will be used by default. Set INF_ENGINE_RELEASE variable if you experience build errors.") endif() - set(INF_ENGINE_RELEASE "2018030000" CACHE STRING "Force IE version, should be in form YYYYAABBCC (e.g. 2018R2.0.2 -> 2018020002)") + set(INF_ENGINE_RELEASE "2018040000" CACHE STRING "Force IE version, should be in form YYYYAABBCC (e.g. 2018R2.0.2 -> 2018020002)") set_target_properties(${INF_ENGINE_TARGET} PROPERTIES INTERFACE_COMPILE_DEFINITIONS "HAVE_INF_ENGINE=1;INF_ENGINE_RELEASE=${INF_ENGINE_RELEASE}" ) diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 4820c90e6b..087769ac3f 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -1568,6 +1568,23 @@ struct Net::Impl if (!ieNode->net->isInitialized()) { +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) + // For networks which is built in runtime we need to specify a + // version of it's hyperparameters. + std::string versionTrigger = "" + "" + "" + "" + "" + "1" + "" + "" + "" + "" + ""; + InferenceEngine::CNNNetReader reader; + reader.ReadNetwork(versionTrigger.data(), versionTrigger.size()); +#endif ieNode->net->init(preferableTarget); ld.skip = false; } diff --git a/modules/dnn/src/layers/blank_layer.cpp b/modules/dnn/src/layers/blank_layer.cpp index c09cb9b6db..178a2a4f2d 100644 --- a/modules/dnn/src/layers/blank_layer.cpp +++ b/modules/dnn/src/layers/blank_layer.cpp @@ -107,14 +107,21 @@ public: inputs[i].copyTo(outputs[i]); } - virtual Ptr initInfEngine(const std::vector >&) CV_OVERRIDE + virtual Ptr initInfEngine(const std::vector >& inputs) CV_OVERRIDE { #ifdef HAVE_INF_ENGINE + InferenceEngine::DataPtr input = infEngineDataNode(inputs[0]); + CV_Assert(!input->dims.empty()); + InferenceEngine::LayerParams lp; lp.name = name; lp.type = "Split"; lp.precision = InferenceEngine::Precision::FP32; std::shared_ptr ieLayer(new InferenceEngine::SplitLayer(lp)); +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) + ieLayer->params["axis"] = format("%d", input->dims.size() - 1); + ieLayer->params["out_sizes"] = format("%d", input->dims[0]); +#endif return Ptr(new InfEngineBackendNode(ieLayer)); #endif // HAVE_INF_ENGINE return Ptr(); diff --git a/modules/dnn/src/layers/convolution_layer.cpp b/modules/dnn/src/layers/convolution_layer.cpp index cfd0ee00c4..bc61e39517 100644 --- a/modules/dnn/src/layers/convolution_layer.cpp +++ b/modules/dnn/src/layers/convolution_layer.cpp @@ -460,6 +460,12 @@ public: ieLayer->_pads_end.insert(InferenceEngine::Y_AXIS, pad.height); ieLayer->_dilation.insert(InferenceEngine::X_AXIS, dilation.width); ieLayer->_dilation.insert(InferenceEngine::Y_AXIS, dilation.height); + ieLayer->params["output"] = format("%d", outCn); + ieLayer->params["kernel"] = format("%d,%d,%d,%d", outCn, inpGroupCn, kernel.height, kernel.width); + ieLayer->params["pads_begin"] = format("%d,%d", pad.height, pad.width); + ieLayer->params["pads_end"] = format("%d,%d", pad.height, pad.width); + ieLayer->params["strides"] = format("%d,%d", stride.height, stride.width); + ieLayer->params["dilations"] = format("%d,%d", dilation.height, dilation.width); #else ieLayer->_kernel_x = kernel.width; ieLayer->_kernel_y = kernel.height; diff --git a/modules/dnn/src/layers/crop_layer.cpp b/modules/dnn/src/layers/crop_layer.cpp index 5d3597b6d4..32cdbbaa00 100644 --- a/modules/dnn/src/layers/crop_layer.cpp +++ b/modules/dnn/src/layers/crop_layer.cpp @@ -156,6 +156,14 @@ public: CV_Assert(crop_ranges.size() == 4); +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) + for (int i = 0; i < 4; ++i) + { + ieLayer->axis.push_back(i); + ieLayer->offset.push_back(crop_ranges[i].start); + ieLayer->dim.push_back(crop_ranges[i].end - crop_ranges[i].start); + } +#else ieLayer->axis.push_back(0); // batch ieLayer->offset.push_back(crop_ranges[0].start); ieLayer->dim.push_back(crop_ranges[0].end - crop_ranges[0].start); @@ -171,7 +179,7 @@ public: ieLayer->axis.push_back(2); // width ieLayer->offset.push_back(crop_ranges[3].start); ieLayer->dim.push_back(crop_ranges[3].end - crop_ranges[3].start); - +#endif return Ptr(new InfEngineBackendNode(ieLayer)); #endif // HAVE_INF_ENGINE return Ptr(); diff --git a/modules/dnn/src/layers/fully_connected_layer.cpp b/modules/dnn/src/layers/fully_connected_layer.cpp index f0ce2318dc..78d3e809b5 100644 --- a/modules/dnn/src/layers/fully_connected_layer.cpp +++ b/modules/dnn/src/layers/fully_connected_layer.cpp @@ -449,6 +449,9 @@ public: std::shared_ptr ieLayer(new InferenceEngine::FullyConnectedLayer(lp)); ieLayer->_out_num = blobs[0].size[0]; +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) + ieLayer->params["out-size"] = format("%d", blobs[0].size[0]); +#endif ieLayer->_weights = wrapToInfEngineBlob(blobs[0], {(size_t)blobs[0].size[0], (size_t)blobs[0].size[1], 1, 1}, InferenceEngine::Layout::OIHW); if (blobs.size() > 1) ieLayer->_biases = wrapToInfEngineBlob(blobs[1], {(size_t)ieLayer->_out_num}, InferenceEngine::Layout::C); diff --git a/modules/dnn/src/layers/pooling_layer.cpp b/modules/dnn/src/layers/pooling_layer.cpp index 16d2d4824b..bf17415561 100644 --- a/modules/dnn/src/layers/pooling_layer.cpp +++ b/modules/dnn/src/layers/pooling_layer.cpp @@ -275,6 +275,10 @@ public: poolLayer->_padding.insert(InferenceEngine::Y_AXIS, pad_t); poolLayer->_pads_end.insert(InferenceEngine::X_AXIS, pad_r); poolLayer->_pads_end.insert(InferenceEngine::Y_AXIS, pad_b); + poolLayer->params["kernel"] = format("%d,%d", kernel.height, kernel.width); + poolLayer->params["pads_begin"] = format("%d,%d", pad_t, pad_l); + poolLayer->params["pads_end"] = format("%d,%d", pad_b, pad_r); + poolLayer->params["strides"] = format("%d,%d", stride.height, stride.width); #else poolLayer->_kernel_x = kernel.width; poolLayer->_kernel_y = kernel.height; diff --git a/modules/dnn/src/layers/resize_layer.cpp b/modules/dnn/src/layers/resize_layer.cpp index c090ad82ff..6aa32150b6 100644 --- a/modules/dnn/src/layers/resize_layer.cpp +++ b/modules/dnn/src/layers/resize_layer.cpp @@ -51,9 +51,14 @@ public: virtual bool supportBackend(int backendId) CV_OVERRIDE { +#ifdef HAVE_INF_ENGINE if (backendId == DNN_BACKEND_INFERENCE_ENGINE) - return interpolation == "nearest" && preferableTarget != DNN_TARGET_MYRIAD; + { + return (interpolation == "nearest" && preferableTarget != DNN_TARGET_MYRIAD) || + (interpolation == "bilinear" && INF_ENGINE_VER_MAJOR_GE(INF_ENGINE_RELEASE_2018R4)); + } else +#endif return backendId == DNN_BACKEND_OPENCV; } @@ -160,15 +165,27 @@ public: #ifdef HAVE_INF_ENGINE InferenceEngine::LayerParams lp; lp.name = name; - lp.type = "Resample"; lp.precision = InferenceEngine::Precision::FP32; - - std::shared_ptr ieLayer(new InferenceEngine::CNNLayer(lp)); - ieLayer->params["type"] = "caffe.ResampleParameter.NEAREST"; - ieLayer->params["antialias"] = "0"; + std::shared_ptr ieLayer; + if (interpolation == "nearest") + { + lp.type = "Resample"; + ieLayer = std::shared_ptr(new InferenceEngine::CNNLayer(lp)); + ieLayer->params["type"] = "caffe.ResampleParameter.NEAREST"; + ieLayer->params["antialias"] = "0"; + } + else if (interpolation == "bilinear") + { + lp.type = "Interp"; + ieLayer = std::shared_ptr(new InferenceEngine::CNNLayer(lp)); + ieLayer->params["pad_beg"] = "0"; + ieLayer->params["pad_end"] = "0"; + ieLayer->params["align_corners"] = "0"; + } + else + CV_Error(Error::StsNotImplemented, "Unsupported interpolation: " + interpolation); ieLayer->params["width"] = cv::format("%d", outWidth); ieLayer->params["height"] = cv::format("%d", outHeight); - return Ptr(new InfEngineBackendNode(ieLayer)); #endif // HAVE_INF_ENGINE return Ptr(); diff --git a/modules/dnn/src/op_inf_engine.cpp b/modules/dnn/src/op_inf_engine.cpp index 4a72ba19b4..4d75f8f2e9 100644 --- a/modules/dnn/src/op_inf_engine.cpp +++ b/modules/dnn/src/op_inf_engine.cpp @@ -309,7 +309,7 @@ void InfEngineBackendNet::setTargetDevice(InferenceEngine::TargetDevice device) InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() noexcept { - return targetDevice; + return const_cast(this)->getTargetDevice(); } InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() const noexcept @@ -387,6 +387,27 @@ void InfEngineBackendNet::init(int targetId) } } CV_Assert(!inputs.empty()); + +#if INF_ENGINE_VER_MAJOR_GT(INF_ENGINE_RELEASE_2018R3) + for (const auto& inp : inputs) + { + InferenceEngine::LayerParams lp; + lp.name = inp.first; + lp.type = "Input"; + lp.precision = InferenceEngine::Precision::FP32; + std::shared_ptr inpLayer(new InferenceEngine::CNNLayer(lp)); + + layers.push_back(inpLayer); + + InferenceEngine::DataPtr dataPtr = inp.second->getInputData(); + // TODO: remove precision dependency (see setInput.normalization tests) + if (dataPtr->precision == InferenceEngine::Precision::FP32) + { + inpLayer->outData.assign(1, dataPtr); + dataPtr->creatorLayer = InferenceEngine::CNNLayerWeakPtr(inpLayer); + } + } +#endif } if (outputs.empty()) diff --git a/modules/dnn/src/op_inf_engine.hpp b/modules/dnn/src/op_inf_engine.hpp index f04a5c636c..ffaeb288b2 100644 --- a/modules/dnn/src/op_inf_engine.hpp +++ b/modules/dnn/src/op_inf_engine.hpp @@ -25,10 +25,11 @@ #define INF_ENGINE_RELEASE_2018R1 2018010000 #define INF_ENGINE_RELEASE_2018R2 2018020000 #define INF_ENGINE_RELEASE_2018R3 2018030000 +#define INF_ENGINE_RELEASE_2018R4 2018040000 #ifndef INF_ENGINE_RELEASE -#warning("IE version have not been provided via command-line. Using 2018R2 by default") -#define INF_ENGINE_RELEASE INF_ENGINE_RELEASE_2018R2 +#warning("IE version have not been provided via command-line. Using 2018R4 by default") +#define INF_ENGINE_RELEASE INF_ENGINE_RELEASE_2018R4 #endif #define INF_ENGINE_VER_MAJOR_GT(ver) (((INF_ENGINE_RELEASE) / 10000) > ((ver) / 10000)) diff --git a/modules/dnn/test/test_backends.cpp b/modules/dnn/test/test_backends.cpp index 2b148611ca..020703cbd0 100644 --- a/modules/dnn/test/test_backends.cpp +++ b/modules/dnn/test/test_backends.cpp @@ -174,7 +174,7 @@ TEST_P(DNNTestNetwork, MobileNet_SSD_v2_TensorFlow) throw SkipTestException(""); Mat sample = imread(findDataFile("dnn/street.png", false)); Mat inp = blobFromImage(sample, 1.0f, Size(300, 300), Scalar(), false); - float l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.011 : 0.0; + float l1 = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.013 : 0.0; float lInf = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.062 : 0.0; processNet("dnn/ssd_mobilenet_v2_coco_2018_03_29.pb", "dnn/ssd_mobilenet_v2_coco_2018_03_29.pbtxt", inp, "detection_out", "", l1, lInf, 0.25); @@ -184,7 +184,7 @@ TEST_P(DNNTestNetwork, SSD_VGG16) { if (backend == DNN_BACKEND_HALIDE && target == DNN_TARGET_CPU) throw SkipTestException(""); - double scoreThreshold = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.0252 : 0.0; + double scoreThreshold = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? 0.0325 : 0.0; Mat sample = imread(findDataFile("dnn/street.png", false)); Mat inp = blobFromImage(sample, 1.0f, Size(300, 300), Scalar(), false); processNet("dnn/VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel", diff --git a/modules/dnn/test/test_caffe_importer.cpp b/modules/dnn/test/test_caffe_importer.cpp index 6563ac0663..4ad3d54067 100644 --- a/modules/dnn/test/test_caffe_importer.cpp +++ b/modules/dnn/test/test_caffe_importer.cpp @@ -512,7 +512,11 @@ INSTANTIATE_TEST_CASE_P(Test_Caffe, opencv_face_detector, TEST_P(Test_Caffe_nets, FasterRCNN_vgg16) { - if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD) + if ((backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD) +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE > 2018030000 + || (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_OPENCL_FP16) +#endif + ) throw SkipTestException(""); static Mat ref = (Mat_(3, 7) << 0, 2, 0.949398, 99.2454, 210.141, 601.205, 462.849, 0, 7, 0.997022, 481.841, 92.3218, 722.685, 175.953, diff --git a/modules/dnn/test/test_darknet_importer.cpp b/modules/dnn/test/test_darknet_importer.cpp index ab4a0e708c..415e7780fc 100644 --- a/modules/dnn/test/test_darknet_importer.cpp +++ b/modules/dnn/test/test_darknet_importer.cpp @@ -306,6 +306,9 @@ TEST_P(Test_Darknet_nets, TinyYoloVoc) // batch size 1 testDarknetModel(config_file, weights_file, ref.rowRange(0, 2), scoreDiff, iouDiff); +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE == 2018040000 + if (backend == DNN_BACKEND_INFERENCE_ENGINE && target != DNN_TARGET_MYRIAD) +#endif // batch size 2 testDarknetModel(config_file, weights_file, ref, scoreDiff, iouDiff); } diff --git a/modules/dnn/test/test_halide_layers.cpp b/modules/dnn/test/test_halide_layers.cpp index 1be30cda64..082cf62314 100644 --- a/modules/dnn/test/test_halide_layers.cpp +++ b/modules/dnn/test/test_halide_layers.cpp @@ -166,6 +166,11 @@ TEST_P(Deconvolution, Accuracy) if (backendId == DNN_BACKEND_INFERENCE_ENGINE && targetId == DNN_TARGET_CPU && dilation.width == 2 && dilation.height == 2) throw SkipTestException(""); +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE == 2018040000 + if (backendId == DNN_BACKEND_INFERENCE_ENGINE && targetId == DNN_TARGET_CPU && + hasBias && group != 1) + throw SkipTestException("Test is disabled for OpenVINO 2018R4"); +#endif int sz[] = {inChannels, outChannels / group, kernel.height, kernel.width}; Mat weights(4, &sz[0], CV_32F); diff --git a/modules/dnn/test/test_ie_models.cpp b/modules/dnn/test/test_ie_models.cpp index 01ecb72986..a50fed8d58 100644 --- a/modules/dnn/test/test_ie_models.cpp +++ b/modules/dnn/test/test_ie_models.cpp @@ -177,10 +177,20 @@ TEST_P(DNNTestOpenVINO, models) Target target = (dnn::Target)(int)get<0>(GetParam()); std::string modelName = get<1>(GetParam()); +#ifdef INF_ENGINE_RELEASE +#if INF_ENGINE_RELEASE <= 2018030000 if (target == DNN_TARGET_MYRIAD && (modelName == "landmarks-regression-retail-0001" || modelName == "semantic-segmentation-adas-0001" || modelName == "face-reidentification-retail-0001")) throw SkipTestException(""); +#elif INF_ENGINE_RELEASE == 2018040000 + if (modelName == "single-image-super-resolution-0034" || + (target == DNN_TARGET_MYRIAD && (modelName == "license-plate-recognition-barrier-0001" || + modelName == "landmarks-regression-retail-0009" || + modelName == "semantic-segmentation-adas-0001"))) + throw SkipTestException(""); +#endif +#endif std::string precision = (target == DNN_TARGET_OPENCL_FP16 || target == DNN_TARGET_MYRIAD) ? "FP16" : "FP32"; std::string prefix = utils::fs::join("intel_models", diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp index b46e9ebf05..cf94fad701 100644 --- a/modules/dnn/test/test_layers.cpp +++ b/modules/dnn/test/test_layers.cpp @@ -137,6 +137,10 @@ TEST_P(Test_Caffe_layers, Convolution) TEST_P(Test_Caffe_layers, DeConvolution) { +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE == 2018040000 + if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_CPU) + throw SkipTestException("Test is disabled for OpenVINO 2018R4"); +#endif testLayerUsingCaffeModels("layer_deconvolution", true, false); } diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index 0a3804c7f2..adb45b86f0 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -475,7 +475,7 @@ TEST_P(Test_TensorFlow_nets, EAST_text_detection) double l1_geometry = default_l1, lInf_geometry = default_lInf; if (target == DNN_TARGET_OPENCL_FP16) { - lInf_scores = 0.11; + lInf_scores = backend == DNN_BACKEND_INFERENCE_ENGINE ? 0.16 : 0.11; l1_geometry = 0.28; lInf_geometry = 5.94; } else if (target == DNN_TARGET_MYRIAD) diff --git a/modules/dnn/test/test_torch_importer.cpp b/modules/dnn/test/test_torch_importer.cpp index 0b844452e2..c640c90ed3 100644 --- a/modules/dnn/test/test_torch_importer.cpp +++ b/modules/dnn/test/test_torch_importer.cpp @@ -136,6 +136,10 @@ TEST_P(Test_Torch_layers, run_reshape_change_batch_size) TEST_P(Test_Torch_layers, run_reshape) { +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE == 2018040000 + if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD) + throw SkipTestException("Test is disabled for OpenVINO 2018R4"); +#endif runTorchNet("net_reshape_batch"); runTorchNet("net_reshape_channels", "", false, true); } @@ -168,6 +172,10 @@ TEST_P(Test_Torch_layers, run_depth_concat) TEST_P(Test_Torch_layers, run_deconv) { +#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_RELEASE == 2018040000 + if (backend == DNN_BACKEND_INFERENCE_ENGINE && target == DNN_TARGET_MYRIAD) + throw SkipTestException("Test is disabled for OpenVINO 2018R4"); +#endif runTorchNet("net_deconv"); }