From 0a178a687a747fa9ad89fed3a66a368d53327028 Mon Sep 17 00:00:00 2001 From: rogday Date: Mon, 20 Dec 2021 19:53:37 +0300 Subject: [PATCH] fix const/x in Div --- modules/dnn/src/onnx/onnx_importer.cpp | 11 ++++++++++- modules/dnn/test/test_onnx_importer.cpp | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 5d88844e61..7bedf9543f 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -1472,7 +1472,16 @@ void ONNXImporter::parseMul(LayerParams& layerParams, const opencv_onnx::NodePro blob = blob.reshape(1, 1); if (blob.total() == 1) { float blob_value = blob.ptr()[0]; - float coeff = isDiv ? 1.0 / blob_value : blob_value; + float coeff = blob_value; + if (isDiv) + { + coeff = 1.f / blob_value; + if (constId == 0) + { + // Power layer calculates (x*scale + shift)^power, so const/x -> (x * (1/const) + 0)^(-1) + layerParams.set("power", -1.f); + } + } layerParams.set("scale", coeff); layerParams.type = "Power"; } diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index a432f2251e..d5a5a86091 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -1056,6 +1056,11 @@ TEST_P(Test_ONNX_layers, SubFromConst) testONNXModels("sub_from_const_broadcast"); } +TEST_P(Test_ONNX_layers, DivConst) +{ + testONNXModels("div_const"); +} + INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_ONNX_layers, dnnBackendsAndTargets()); class Test_ONNX_nets : public Test_ONNX_layers