diff --git a/src/frontends/onnx/frontend/src/op/reduce.cpp b/src/frontends/onnx/frontend/src/op/reduce.cpp index 9ba7e6c36fa9e8..ed4aaa5d13dc45 100644 --- a/src/frontends/onnx/frontend/src/op/reduce.cpp +++ b/src/frontends/onnx/frontend/src/op/reduce.cpp @@ -136,6 +136,14 @@ std::shared_ptr make_ov_reduction_op(const Node& node, return set_1::identity(node).at(0).get_node_shared_ptr(); } } + +std::shared_ptr onnx_reduce_sum_square(const ov::frontend::onnx::Node& node, + const std::set& supported_types, + const bool axes_as_attr = true) { + const auto input = ov::Output{node.get_ov_inputs().at(0)}; + const auto square_node = std::make_shared(input, input); + return make_ov_reduction_op(node, square_node, supported_types, axes_as_attr); +} } // namespace namespace set_1 { @@ -180,9 +188,7 @@ ov::OutputVector reduce_sum(const ov::frontend::onnx::Node& node) { } ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node) { - const auto input = ov::Output{node.get_ov_inputs().at(0)}; - const auto square_node = std::make_shared(input, input); - return {make_ov_reduction_op(node, square_node, supported_types_v1)}; + return {onnx_reduce_sum_square(node, supported_types_v1)}; } } // namespace set_1 @@ -199,9 +205,11 @@ namespace set_13 { ov::OutputVector reduce_sum(const ov::frontend::onnx::Node& node) { return {make_ov_reduction_op(node, node.get_ov_inputs().at(0), supported_types_v2, false)}; } + ov::OutputVector reduce_l2(const Node& node) { return {make_ov_reduction_op(node, node.get_ov_inputs().at(0), supported_types_v2)}; } + ov::OutputVector reduce_max(const ov::frontend::onnx::Node& node) { return {make_ov_reduction_op(node, node.get_ov_inputs().at(0), supported_types_v3)}; } @@ -209,6 +217,10 @@ ov::OutputVector reduce_max(const ov::frontend::onnx::Node& node) { ov::OutputVector reduce_min(const ov::frontend::onnx::Node& node) { return {make_ov_reduction_op(node, node.get_ov_inputs().at(0), supported_types_v3)}; } + +ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node) { + return {onnx_reduce_sum_square(node, supported_types_v2)}; +} } // namespace set_13 namespace set_18 { @@ -228,6 +240,10 @@ ov::OutputVector reduce_log_sum(const ov::frontend::onnx::Node& node) { make_ov_reduction_op(node, node.get_ov_inputs().at(0), supported_types_v2, false); return {std::make_shared(sum_node)}; } + +ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node) { + return {onnx_reduce_sum_square(node, supported_types_v2, false)}; +} } // namespace set_18 namespace set_20 { diff --git a/src/frontends/onnx/frontend/src/op/reduce.hpp b/src/frontends/onnx/frontend/src/op/reduce.hpp index f361c89fd2d960..740a6127fc3303 100644 --- a/src/frontends/onnx/frontend/src/op/reduce.hpp +++ b/src/frontends/onnx/frontend/src/op/reduce.hpp @@ -79,6 +79,12 @@ ov::OutputVector reduce_sum(const ov::frontend::onnx::Node& node); namespace set_1 { ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node); } // namespace set_1 +namespace set_13 { +ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node); +} // namespace set_13 +namespace set_18 { +ov::OutputVector reduce_sum_square(const ov::frontend::onnx::Node& node); +} // namespace set_18 } // namespace op } // namespace onnx diff --git a/src/frontends/onnx/frontend/src/ops_bridge.cpp b/src/frontends/onnx/frontend/src/ops_bridge.cpp index 02a79979ecaa73..5ab8a792c1fefa 100644 --- a/src/frontends/onnx/frontend/src/ops_bridge.cpp +++ b/src/frontends/onnx/frontend/src/ops_bridge.cpp @@ -503,6 +503,8 @@ OperatorsBridge::OperatorsBridge() { REGISTER_OPERATOR("ReduceSum", 1, reduce_sum); REGISTER_OPERATOR("ReduceSum", 13, reduce_sum); REGISTER_OPERATOR("ReduceSumSquare", 1, reduce_sum_square); + REGISTER_OPERATOR("ReduceSumSquare", 13, reduce_sum_square); + REGISTER_OPERATOR("ReduceSumSquare", 18, reduce_sum_square); REGISTER_OPERATOR("Relu", 1, relu); REGISTER_OPERATOR("Reshape", 1, reshape); REGISTER_OPERATOR("Resize", 1, resize); diff --git a/src/frontends/onnx/tests/models/reduce_sum_square_13.prototxt b/src/frontends/onnx/tests/models/reduce_sum_square_13.prototxt new file mode 100644 index 00000000000000..590fa0c7414504 --- /dev/null +++ b/src/frontends/onnx/tests/models/reduce_sum_square_13.prototxt @@ -0,0 +1,48 @@ +ir_version: 3 +producer_name: "OpenVINO ONNX Frontend" +graph { + node { + input: "A" + output: "B" + op_type: "ReduceSumSquare" + } + name: "compute_graph" + input { + name: "A" + type { + tensor_type { + elem_type: 1 + shape { + dim { + dim_value: 1 + } + dim { + dim_value: 1 + } + dim { + dim_value: 4 + } + dim { + dim_value: 4 + } + } + } + } + } + output { + name: "B" + type { + tensor_type { + elem_type: 1 + shape { + dim { + dim_value: 1 + } + } + } + } + } +} +opset_import { + version: 13 +} diff --git a/src/frontends/onnx/tests/models/reduce_sum_square_18.prototxt b/src/frontends/onnx/tests/models/reduce_sum_square_18.prototxt new file mode 100644 index 00000000000000..4b9e0f944565eb --- /dev/null +++ b/src/frontends/onnx/tests/models/reduce_sum_square_18.prototxt @@ -0,0 +1,48 @@ +ir_version: 3 +producer_name: "OpenVINO ONNX Frontend" +graph { + node { + input: "A" + output: "B" + op_type: "ReduceSumSquare" + } + name: "compute_graph" + input { + name: "A" + type { + tensor_type { + elem_type: 1 + shape { + dim { + dim_value: 1 + } + dim { + dim_value: 1 + } + dim { + dim_value: 4 + } + dim { + dim_value: 4 + } + } + } + } + } + output { + name: "B" + type { + tensor_type { + elem_type: 1 + shape { + dim { + dim_value: 1 + } + } + } + } + } +} +opset_import { + version: 18 +} diff --git a/src/frontends/onnx/tests/onnx_import.in.cpp b/src/frontends/onnx/tests/onnx_import.in.cpp index 3aa45042d6276b..59a53c0016eb1a 100644 --- a/src/frontends/onnx/tests/onnx_import.in.cpp +++ b/src/frontends/onnx/tests/onnx_import.in.cpp @@ -1257,6 +1257,38 @@ OPENVINO_TEST(${BACKEND_NAME}, onnx_model_reduce_sum_square) { test_case.run(); } +OPENVINO_TEST(${BACKEND_NAME}, onnx_model_reduce_sum_square_13) { + auto model = convert_model("reduce_sum_square_13.onnx"); + + // input data shape (1, 1, 4, 4) + Inputs inputs{ + ov::test::NDArray({{{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}}}).get_vector()}; + + // output data shape (1,) + auto expected_output = ov::test::NDArray({{{{16}}}}).get_vector(); + + auto test_case = ov::test::TestCase(model, s_device); + test_case.add_multiple_inputs(inputs); + test_case.add_expected_output(expected_output); + test_case.run(); +} + +OPENVINO_TEST(${BACKEND_NAME}, onnx_model_reduce_sum_square_18) { + auto model = convert_model("reduce_sum_square_18.onnx"); + + // input data shape (1, 1, 4, 4) + Inputs inputs{ + ov::test::NDArray({{{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}}}).get_vector()}; + + // output data shape (1,) + auto expected_output = ov::test::NDArray({{{{16}}}}).get_vector(); + + auto test_case = ov::test::TestCase(model, s_device); + test_case.add_multiple_inputs(inputs); + test_case.add_expected_output(expected_output); + test_case.run(); +} + OPENVINO_TEST(${BACKEND_NAME}, onnx_model_reduce_sum_13_axes_as_constant) { auto model = convert_model("reduce_sum_13_axes_as_constant.onnx"); diff --git a/src/frontends/onnx/tests/tests_python/test_backend.py b/src/frontends/onnx/tests/tests_python/test_backend.py index 75ae10fb9e55c4..91bd1701ca34b5 100644 --- a/src/frontends/onnx/tests/tests_python/test_backend.py +++ b/src/frontends/onnx/tests/tests_python/test_backend.py @@ -488,12 +488,6 @@ def expect_fail(test_case_path, xfail): # type: (str) -> None "OnnxBackendNodeModelTest.test_reduce_prod_keepdims_random_cpu", "OnnxBackendNodeModelTest.test_reduce_prod_negative_axes_keepdims_example_cpu", "OnnxBackendNodeModelTest.test_reduce_prod_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_random_cpu", ), ( xfail_issue_99969, @@ -685,7 +679,6 @@ def expect_fail(test_case_path, xfail): # type: (str) -> None "OnnxBackendNodeModelTest.test_reduce_l1_empty_set_cpu", "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_empty_set_cpu", "OnnxBackendNodeModelTest.test_reduce_prod_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_empty_set_cpu", ), ( skip_misalignment,