diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 28dd4d9b77..ba4d542731 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -3187,10 +3187,19 @@ void ONNXImporter::parseLayerNorm(LayerParams& layerParams, const opencv_onnx::N // Remove additional outputs (Mean, InvStdDev) if (node_proto.output_size() > 1) { + // remove from graph proto + for (size_t i = 1; i < node_proto.output_size(); i++) { + for (int j = graph_proto.output_size() - 1; j >= 0; j--) { + if (graph_proto.output(j).name() == node_proto.output(i)) { + graph_proto.mutable_output()->DeleteSubrange(j, 1); + break; + } + } + } + // remove from node proto auto outputName = node_proto.output(0); opencv_onnx::NodeProto node_proto_ = node_proto; - node_proto_.clear_output(); - node_proto_.add_output(outputName); + node_proto_.mutable_output()->DeleteSubrange(1, node_proto_.output_size() - 1); addLayer(layerParams, node_proto_); } else diff --git a/modules/dnn/test/test_graph_simplifier.cpp b/modules/dnn/test/test_graph_simplifier.cpp index f6334f929a..58fffd3713 100644 --- a/modules/dnn/test/test_graph_simplifier.cpp +++ b/modules/dnn/test/test_graph_simplifier.cpp @@ -43,6 +43,7 @@ TEST_F(Test_Graph_Simplifier, GeluApproximationSubGraph) { TEST_F(Test_Graph_Simplifier, LayerNormSubGraph) { test("layer_norm_expanded", "LayerNormalization"); + test("layer_norm_expanded_with_initializers", "LayerNormalization"); } TEST_F(Test_Graph_Simplifier, ResizeSubgraph) { diff --git a/modules/dnn/test/test_onnx_conformance.cpp b/modules/dnn/test/test_onnx_conformance.cpp index 13c5c5b232..5b783722c4 100644 --- a/modules/dnn/test/test_onnx_conformance.cpp +++ b/modules/dnn/test/test_onnx_conformance.cpp @@ -339,6 +339,25 @@ static const TestCase testConformanceConfig[] = { {"test_isinf_negative", 1, 1}, {"test_isinf_positive", 1, 1}, {"test_isnan", 1, 1}, + {"test_layer_normalization_2d_axis0", 3, 1}, + {"test_layer_normalization_2d_axis1", 3, 1}, + {"test_layer_normalization_2d_axis_negative_1", 3, 1}, + {"test_layer_normalization_2d_axis_negative_2", 3, 1}, + {"test_layer_normalization_3d_axis0_epsilon", 3, 1}, + {"test_layer_normalization_3d_axis1_epsilon", 3, 1}, + {"test_layer_normalization_3d_axis2_epsilon", 3, 1}, + {"test_layer_normalization_3d_axis_negative_1_epsilon", 3, 1}, + {"test_layer_normalization_3d_axis_negative_2_epsilon", 3, 1}, + {"test_layer_normalization_3d_axis_negative_3_epsilon", 3, 1}, + {"test_layer_normalization_4d_axis0", 3, 1}, + {"test_layer_normalization_4d_axis1", 3, 1}, + {"test_layer_normalization_4d_axis2", 3, 1}, + {"test_layer_normalization_4d_axis3", 3, 1}, + {"test_layer_normalization_4d_axis_negative_1", 3, 1}, + {"test_layer_normalization_4d_axis_negative_2", 3, 1}, + {"test_layer_normalization_4d_axis_negative_3", 3, 1}, + {"test_layer_normalization_4d_axis_negative_4", 3, 1}, + {"test_layer_normalization_default_axis", 3, 1}, {"test_leakyrelu", 1, 1}, {"test_leakyrelu_default", 1, 1}, {"test_leakyrelu_example", 1, 1}, diff --git a/modules/dnn/test/test_onnx_conformance_layer_filter__openvino.inl.hpp b/modules/dnn/test/test_onnx_conformance_layer_filter__openvino.inl.hpp index 339746f5f2..94687a1e26 100644 --- a/modules/dnn/test/test_onnx_conformance_layer_filter__openvino.inl.hpp +++ b/modules/dnn/test/test_onnx_conformance_layer_filter__openvino.inl.hpp @@ -792,6 +792,82 @@ CASE(test_isinf_positive) // no filter CASE(test_isnan) // no filter +CASE(test_layer_normalization_2d_axis0) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_2d_axis1) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_2d_axis_negative_1) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_2d_axis_negative_2) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis0_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis1_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis2_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis_negative_1_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis_negative_2_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_3d_axis_negative_3_epsilon) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis0) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis1) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis2) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis3) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis_negative_1) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis_negative_2) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis_negative_3) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_4d_axis_negative_4) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif +CASE(test_layer_normalization_default_axis) +#if SKIP_SET_1 + SKIP_NON_CPU; +#endif CASE(test_leakyrelu) // no filter CASE(test_leakyrelu_default) diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 7be3e8a385..aa60cea890 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -2674,36 +2674,6 @@ TEST_P(Test_ONNX_layers, Tile) testONNXModels("tile", pb); } -TEST_P(Test_ONNX_layers, LayerNorm) -{ - testONNXModels("test_layer_normalization_2d_axis0", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_2d_axis1", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_2d_axis_negative_1", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_2d_axis_negative_2", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis0_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis1_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis2_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis_negative_1_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis_negative_2_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_3d_axis_negative_3_epsilon", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis0", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis1", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis2", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis3", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis_negative_1", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis_negative_2", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis_negative_3", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_4d_axis_negative_4", pb, 0, 0, false, true, 3); - testONNXModels("test_layer_normalization_default_axis", pb, 0, 0, false, true, 3); -} - -// for testing graph simplification -TEST_P(Test_ONNX_layers, LayerNormExpanded) -{ - testONNXModels("layer_norm_expanded"); - testONNXModels("layer_norm_expanded_with_initializers"); -} - TEST_P(Test_ONNX_layers, Gelu) { testONNXModels("gelu");