From 9e3ba487fa380f5d8732389df0934f0f368d4659 Mon Sep 17 00:00:00 2001 From: Zihao Mu Date: Fri, 28 Jan 2022 22:55:01 +0800 Subject: [PATCH] Merge pull request #21518 from zihaomu:resize_onnx_opset13 Add resize layer compatible with ONNX opset13 version --- modules/dnn/src/graph_simplifier.cpp | 2 +- modules/dnn/src/onnx/onnx_importer.cpp | 8 ++++++-- modules/dnn/test/test_onnx_importer.cpp | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/dnn/src/graph_simplifier.cpp b/modules/dnn/src/graph_simplifier.cpp index a23fce3..e58e0e3 100644 --- a/modules/dnn/src/graph_simplifier.cpp +++ b/modules/dnn/src/graph_simplifier.cpp @@ -108,7 +108,7 @@ bool Subgraph::match(const Ptr& net, int nodeId, for (int j = 0; j < inputNodes.size(); ++j) { - if (nodes[inputNodes[j]].empty()) // Unknown input node type. + if (nodes[inputNodes[j]].empty() || node->getInputName(j).empty()) // Unknown input node type. continue; nodeId = getInputNodeId(net, node, j); const Ptr inpNode = net->getNode(nodeId); diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index c1ed6e9..73f394a 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -2781,16 +2781,20 @@ void ONNXImporter::parseResize(LayerParams& layerParams, const opencv_onnx::Node // opset-10: input = [X, scales] // opset-11: input = [X, roi, scales] or [x, roi, scales, sizes] + // opset-13: may have empty input, [X, "", "", sizes] or [x, "", scales] int scalesInputId = node_proto.input_size() == 2 ? 1 : 2; + const std::string& scale_name = node_proto.input(scalesInputId); + Mat scales; + if(!scale_name.empty()) + scales = getBlob(node_proto, scalesInputId); - Mat scales = getBlob(node_proto, scalesInputId); if (!scales.empty()) { CV_CheckEQ(scales.total(), (size_t)4, "HCHW layout is expected"); layerParams.set("zoom_factor_y", scales.at(2)); layerParams.set("zoom_factor_x", scales.at(3)); } - else if (node_proto.input_size() >= 4) // opset-11 + else if (node_proto.input_size() >= 4) // opset-11 [x, roi, scales, sizes] or opset-13: input = [X, "", "", sizes] { const std::string& inputSizes = node_proto.input(3); if (constBlobs.find(inputSizes) != constBlobs.end()) diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 9f13727..4918c72 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -885,9 +885,14 @@ TEST_P(Test_ONNX_layers, DynamicResize) testONNXModels("dynamic_resize_9", npy, 0, 0, false, true, 2); testONNXModels("dynamic_resize_10", npy, 0, 0, false, true, 2); testONNXModels("dynamic_resize_11", npy, 0, 0, false, true, 2); + testONNXModels("dynamic_resize_13", npy, 0, 0, false, true, 2); testONNXModels("dynamic_resize_scale_9", npy, 0, 0, false, true, 2); testONNXModels("dynamic_resize_scale_10", npy, 0, 0, false, true, 2); testONNXModels("dynamic_resize_scale_11", npy, 0, 0, false, true, 2); + testONNXModels("dynamic_resize_scale_13", npy, 0, 0, false, true, 2); + + testONNXModels("resize_size_opset11"); + testONNXModels("resize_size_opset13"); } TEST_P(Test_ONNX_layers, Resize_HumanSeg) -- 2.7.4