From 3d60a9b96c09d03199b2ee4e0a67a2a67c8d616d Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Fri, 13 Dec 2019 23:29:39 +0800 Subject: [PATCH] Merge pull request #16156 from TH3CHARLie:3.4 * Eltwise::DIV support in Halide backend * fix typo * remove div from generated test suite to pass CI, switching to manual test... * ensure divisor not near to zero * use randu * dnn(test): update test data for Eltwise.Accuracy/DIV layer test --- modules/dnn/src/layers/eltwise_layer.cpp | 6 +++++ modules/dnn/test/test_halide_layers.cpp | 30 +++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/modules/dnn/src/layers/eltwise_layer.cpp b/modules/dnn/src/layers/eltwise_layer.cpp index c7c28e8fb8..7851596d86 100644 --- a/modules/dnn/src/layers/eltwise_layer.cpp +++ b/modules/dnn/src/layers/eltwise_layer.cpp @@ -638,6 +638,12 @@ public: for (int i = 2; i < inputBuffers.size(); ++i) topExpr *= inputBuffers[i](x, y, c, n); break; + case DIV: + topExpr = inputBuffers[0](x, y, c, n) / + inputBuffers[1](x, y, c, n); + for (int i = 2; i < inputBuffers.size(); ++i) + topExpr /= inputBuffers[i](x, y, c, n); + break; case MAX: topExpr = max(inputBuffers[0](x, y, c, n), inputBuffers[1](x, y, c, n)); diff --git a/modules/dnn/test/test_halide_layers.cpp b/modules/dnn/test/test_halide_layers.cpp index 757a98c612..11668b4b79 100644 --- a/modules/dnn/test/test_halide_layers.cpp +++ b/modules/dnn/test/test_halide_layers.cpp @@ -16,10 +16,11 @@ using namespace cv; using namespace cv::dnn; using namespace testing; -static void test(Mat& input, Net& net, Backend backendId, Target targetId, bool skipCheck = false) +static void test(Mat& input, Net& net, Backend backendId, Target targetId, bool skipCheck = false, bool randInput = true) { DNNTestLayer::checkBackend(backendId, targetId); - randu(input, -1.0f, 1.0f); + if (randInput) + randu(input, -1.0f, 1.0f); net.setInput(input); net.setPreferableBackend(DNN_BACKEND_OPENCV); @@ -776,6 +777,14 @@ TEST_P(Eltwise, Accuracy) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NGRAPH, CV_TEST_TAG_DNN_SKIP_IE_VERSION); #endif + bool convInputShift = 1; + int numEltwiseInputs = numConv; + if (op == "div") + { + numConv = 1; + convInputShift = 0; // first input is convolution + } + Net net; std::vector convLayerIds(numConv); @@ -815,20 +824,29 @@ TEST_P(Eltwise, Accuracy) eltwiseParam.type = "Eltwise"; eltwiseParam.name = "testLayer"; int eltwiseId = net.addLayer(eltwiseParam.name, eltwiseParam.type, eltwiseParam); - net.connect(0, 0, eltwiseId, 0); + if (convInputShift == 1) + net.connect(0, 0, eltwiseId, 0); for (int i = 0; i < numConv; ++i) { - net.connect(convLayerIds[i], 0, eltwiseId, i + 1); + net.connect(convLayerIds[i], 0, eltwiseId, i + convInputShift); + } + if (convInputShift == 0) + net.connect(0, 0, eltwiseId, numConv); + for (int i = numConv; i < numEltwiseInputs; ++i) + { + net.connect(0, 0, eltwiseId, i + 1); } int sz[] = {1, inSize[0], inSize[1], inSize[2]}; Mat input(4, &sz[0], CV_32F); - test(input, net, backendId, targetId); + if (op == "div") + randu(input, 1.0f, 1.0f); // ensure no divisor value has absouluate value of less than 0.5 + test(input, net, backendId, targetId, /*skipCheck*/false, (op == "div") ? false : true); } INSTANTIATE_TEST_CASE_P(Layer_Test_Halide, Eltwise, Combine( /*input size*/ Values(Vec3i(1, 4, 5), Vec3i(2, 8, 6)), -/*operation*/ Values("prod", "sum", "max"), +/*operation*/ Values("prod", "sum", "div", "max"), /*num convs*/ Values(1, 2, 3), /*weighted(for sum only)*/ Bool(), dnnBackendsAndTargetsWithHalide()