Add support (limited, based on Interpolate-1) to Resize-11 ONNX op (#1364)
authorMateusz Bencer <mateusz.bencer@intel.com>
Mon, 27 Jul 2020 13:42:00 +0000 (15:42 +0200)
committerGitHub <noreply@github.com>
Mon, 27 Jul 2020 13:42:00 +0000 (16:42 +0300)
* Implementation of Resize-11

* Added support to sizes input

* Add tests to sizes input

* Added missing comment

* fixed tests

* fixed tests

* Fixed test. part 2.

* review remaks. part 1.

* review remarks. part 2.

Co-authored-by: Tomasz Socha <tomasz.socha@intel.com>
* Added more tests

Co-authored-by: Tomasz Socha <tomasz.socha@intel.com>
14 files changed:
ngraph/src/ngraph/frontend/onnx_import/op/resize.cpp
ngraph/src/ngraph/frontend/onnx_import/op/resize.hpp
ngraph/src/ngraph/frontend/onnx_import/ops_bridge.cpp
ngraph/test/CMakeLists.txt
ngraph/test/backend/interpolate.in.cpp [new file with mode: 0644]
ngraph/test/models/onnx/resize11_scales_down_linear.prototxt [new file with mode: 0644]
ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor.prototxt [new file with mode: 0644]
ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor_dynamic_scales.prototxt [new file with mode: 0644]
ngraph/test/models/onnx/resize11_scales_up_linear_asymmetric.prototxt [new file with mode: 0644]
ngraph/test/models/onnx/resize11_sizes_linear.prototxt [new file with mode: 0644]
ngraph/test/models/onnx/resize11_sizes_nearest_asymmetric_floor.prototxt [new file with mode: 0644]
ngraph/test/onnx/onnx_import.in.cpp
ngraph/test/runtime/ie/unit_test.manifest
ngraph/test/runtime/interpreter/unit_test.manifest

index 2ec9cd6..e07ef5e 100644 (file)
@@ -18,6 +18,7 @@
 #include "default_opset.hpp"
 #include "exceptions.hpp"
 #include "ngraph/op/util/op_types.hpp"
+#include "utils/common.hpp"
 
 namespace ngraph
 {
@@ -25,17 +26,49 @@ namespace ngraph
     {
         namespace op
         {
-            namespace set_1
+            namespace
             {
-                NodeVector resize(const onnx_import::Node& node)
+                std::shared_ptr<ngraph::Node> calculate_output_shape_based_on_scales(
+                    const std::shared_ptr<ngraph::Node>& data,
+                    const std::shared_ptr<ngraph::Node>& scales)
                 {
-                    const auto inputs = node.get_ng_inputs();
-                    const auto data = inputs.at(0);
-                    const auto scales = inputs.at(1);
+                    const auto& data_shape = data->get_output_partial_shape(0);
+                    const auto& scales_shape = scales->get_output_partial_shape(0);
+
+                    if (ngraph::op::is_constant(scales) && data_shape.is_static())
+                    {
+                        const auto scales_const =
+                            as_type_ptr<default_opset::Constant>(scales->shared_from_this());
+
+                        const auto scales_vector = scales_const->cast_vector<float>();
+                        const auto data_static_shape = data_shape.to_shape();
+
+                        std::vector<int64_t> output_shape;
+                        for (size_t i = 0; i < data_static_shape.size(); ++i)
+                        {
+                            output_shape.push_back(
+                                std::floor(data_static_shape.at(i) * scales_vector.at(i)));
+                        }
+                        auto output_shape_const = default_opset::Constant::create(
+                            element::u64, Shape({output_shape.size()}), output_shape);
+
+                        return output_shape_const;
+                    }
+
+                    const auto shape_of_data = std::make_shared<default_opset::Convert>(
+                        std::make_shared<default_opset::ShapeOf>(data), scales->get_element_type());
+                    const auto multiply =
+                        std::make_shared<default_opset::Multiply>(shape_of_data, scales);
+                    const auto output_shape =
+                        std::make_shared<default_opset::Convert>(multiply, ngraph::element::i64);
 
-                    const auto data_shape = data->get_output_partial_shape(0);
-                    const auto scales_shape = scales->get_output_partial_shape(0);
+                    return output_shape;
+                }
 
+                NodeVector build_resize(const Node& node,
+                                        const std::shared_ptr<ngraph::Node>& output_shape,
+                                        const AxisSet& axes)
+                {
                     const auto mode = node.get_attribute_value<std::string>("mode", "nearest");
 
                     std::unordered_set<std::string> supported_modes = {"nearest", "linear"};
@@ -58,53 +91,122 @@ namespace ngraph
                                          supported_modes_str);
                     }
 
+                    auto attrs = ngraph::op::v0::InterpolateAttrs();
+                    attrs.axes = axes;
+                    attrs.mode = mode;
+                    attrs.align_corners = false;
+
+                    const auto inputs = node.get_ng_inputs();
+                    const auto& data = inputs.at(0);
+
+                    return {
+                        std::make_shared<default_opset::Interpolate>(data, output_shape, attrs)};
+                }
+            }
+
+            namespace set_11
+            {
+                NodeVector resize(const onnx_import::Node& node)
+                {
+                    // cubic_coeff_a, extrapolation_value attributes are ignored
+                    // (they do not have influence on supported modes)
+                    const auto coordinate_transformation_mode =
+                        node.get_attribute_value<std::string>("coordinate_transformation_mode",
+                                                              "half_pixel");
                     CHECK_VALID_NODE(
                         node,
-                        (scales_shape.is_static() || data_shape.rank().is_static()),
-                        " Data rank or shape of Scales input is required to be static.");
+                        coordinate_transformation_mode == "asymmetric",
+                        coordinate_transformation_mode,
+                        " - this type of coordinate transformation mode is not supported."
+                        " Only asymmetric mode is supported by current version.");
+
+                    const auto exclude_outside =
+                        node.get_attribute_value<int64_t>("exclude_outside ", 0);
+                    CHECK_VALID_NODE(node,
+                                     exclude_outside == 0,
+                                     "Expected exclude_outside=",
+                                     exclude_outside,
+                                     " mode is not supported. ",
+                                     "Current version supports only exclude_outside equals `0`.");
 
-                    size_t axes_size = scales_shape.is_static() ? scales_shape.to_shape().at(0)
-                                                                : data_shape.rank().get_length();
-                    AxisSet axes;
-                    for (int ax = 0; ax < axes_size; ++ax)
+                    const auto mode = node.get_attribute_value<std::string>("mode", "nearest");
+                    if (mode == "nearest")
                     {
-                        axes.insert(ax);
+                        const auto nearest_mode = node.get_attribute_value<std::string>(
+                            "nearest_mode", "round_prefer_floor");
+                        CHECK_VALID_NODE(
+                            node,
+                            nearest_mode == "floor",
+                            "Expected nearest_mode=",
+                            nearest_mode,
+                            " mode is not supported. ",
+                            "Current version support only nearest_mode equals `floor`");
                     }
 
-                    auto attrs = ngraph::op::v0::InterpolateAttrs();
-                    attrs.axes = axes;
-                    attrs.mode = mode;
-                    attrs.align_corners = false;
+                    // roi input (inputs.at(2)) is ignored because it is used only
+                    // in "tf_crop_and_resize" which is not handled now
+                    const auto inputs = node.get_ng_inputs();
+                    const auto& data = inputs.at(0);
+                    const auto& data_shape = data->get_output_partial_shape(0);
 
-                    if (ngraph::op::is_constant(scales) && data_shape.is_static())
+                    if (inputs.size() == 4) // sizes input is provided
                     {
-                        const auto scales_const =
-                            as_type_ptr<default_opset::Constant>(scales->shared_from_this());
+                        const auto& sizes = inputs.at(3);
+                        const auto& sizes_shape = sizes->get_output_partial_shape(0);
 
-                        auto scales_vector = scales_const->cast_vector<float>();
-                        auto data_static_shape = data_shape.to_shape();
+                        CHECK_VALID_NODE(
+                            node,
+                            (sizes_shape.is_static() || data_shape.rank().is_static()),
+                            " Data rank or shape of sizes input is required to be static.");
 
-                        std::vector<int64_t> output_shape;
-                        for (size_t i = 0; i < data_static_shape.size(); ++i)
-                        {
-                            output_shape.push_back(
-                                std::floor(data_static_shape.at(i) * scales_vector.at(i)));
-                        }
-                        auto output_shape_const = default_opset::Constant::create(
-                            element::u64, Shape({output_shape.size()}), output_shape);
+                        size_t axes_size = sizes_shape.is_static() ? sizes_shape[0].get_length()
+                                                                   : data_shape.rank().get_length();
 
-                        return {std::make_shared<default_opset::Interpolate>(
-                            data, output_shape_const, attrs)};
+                        return build_resize(
+                            node, sizes, AxisSet(common::get_monotonic_range(axes_size)));
                     }
 
-                    auto shape_of_data = std::make_shared<default_opset::Convert>(
-                        std::make_shared<default_opset::ShapeOf>(data), ngraph::element::f32);
-                    auto multiply =
-                        std::make_shared<default_opset::Multiply>(shape_of_data, scales);
-                    auto output_shape = std::make_shared<default_opset::Convert>(
-                        std::make_shared<default_opset::Floor>(multiply), ngraph::element::i64);
-                    return {
-                        std::make_shared<default_opset::Interpolate>(data, output_shape, attrs)};
+                    const auto& scales = inputs.at(2);
+                    const auto& scales_shape = scales->get_output_partial_shape(0);
+
+                    CHECK_VALID_NODE(
+                        node,
+                        (scales_shape.is_static() || data_shape.rank().is_static()),
+                        " Data rank or shape of scales input is required to be static.");
+
+                    size_t axes_size = scales_shape.is_static() ? scales_shape[0].get_length()
+                                                                : data_shape.rank().get_length();
+
+                    const auto output_shape = calculate_output_shape_based_on_scales(data, scales);
+
+                    return build_resize(
+                        node, output_shape, AxisSet(common::get_monotonic_range(axes_size)));
+                }
+            } // namespace set_11
+
+            namespace set_1
+            {
+                NodeVector resize(const onnx_import::Node& node)
+                {
+                    const auto inputs = node.get_ng_inputs();
+                    const auto& data = inputs.at(0);
+                    const auto& scales = inputs.at(1);
+
+                    const auto& data_shape = data->get_output_partial_shape(0);
+                    const auto& scales_shape = scales->get_output_partial_shape(0);
+
+                    CHECK_VALID_NODE(
+                        node,
+                        (scales_shape.is_static() || data_shape.rank().is_static()),
+                        " Data rank or shape of scales input is required to be static.");
+
+                    size_t axes_size = scales_shape.is_static() ? scales_shape[0].get_length()
+                                                                : data_shape.rank().get_length();
+
+                    const auto output_shape = calculate_output_shape_based_on_scales(data, scales);
+
+                    return build_resize(
+                        node, output_shape, AxisSet(common::get_monotonic_range(axes_size)));
                 }
 
             } // namespace set_1
index eac27c4..41b7f90 100644 (file)
@@ -31,6 +31,11 @@ namespace ngraph
 
             } // namespace set_1
 
+            namespace set_11
+            {
+                NodeVector resize(const Node& node);
+            }
+
         } // namespace op
 
     } // namespace onnx_import
index b2dd277..3a1c92f 100644 (file)
@@ -356,6 +356,7 @@ namespace ngraph
             REGISTER_OPERATOR("Relu", 1, relu);
             REGISTER_OPERATOR("Reshape", 1, reshape);
             REGISTER_OPERATOR("Resize", 1, resize);
+            REGISTER_OPERATOR("Resize", 11, resize);
             REGISTER_OPERATOR("ReverseSequence", 1, reverse_sequence);
             REGISTER_OPERATOR("RNN", 1, rnn);
             REGISTER_OPERATOR("RoiAlign", 1, roi_align);
index 29968d5..537443b 100644 (file)
@@ -305,6 +305,7 @@ set(MULTI_TEST_SRC
     backend/gather.in.cpp
     backend/gelu.in.cpp
     backend/group_convolution.in.cpp
+    backend/interpolate.in.cpp
     backend/log.in.cpp
     backend/logical_or.in.cpp
     backend/logical_xor.in.cpp
diff --git a/ngraph/test/backend/interpolate.in.cpp b/ngraph/test/backend/interpolate.in.cpp
new file mode 100644 (file)
index 0000000..98c37a9
--- /dev/null
@@ -0,0 +1,62 @@
+//*****************************************************************************
+// Copyright 2017-2020 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//*****************************************************************************
+
+#include "gtest/gtest.h"
+#include "ngraph/ngraph.hpp"
+#include "ngraph/runtime/tensor.hpp"
+#include "runtime/backend.hpp"
+#include "util/all_close.hpp"
+#include "util/all_close_f.hpp"
+#include "util/engine/test_engines.hpp"
+#include "util/known_element_types.hpp"
+#include "util/ndarray.hpp"
+#include "util/test_case.hpp"
+#include "util/test_control.hpp"
+#include "util/test_tools.hpp"
+
+using namespace std;
+using namespace ngraph;
+
+static string s_manifest = "${MANIFEST}";
+
+using TestEngine = test::ENGINE_CLASS_NAME(${BACKEND_NAME});
+
+NGRAPH_TEST(${BACKEND_NAME}, interpolate_down_scales_const_linear)
+{
+    Shape input_shape{1, 1, 2, 4};
+    Shape output_shape{1, 1, 1, 2};
+    op::v0::InterpolateAttrs attrs;
+    attrs.axes = AxisSet{0, 1, 2, 3};
+    attrs.mode = "linear";
+    attrs.align_corners = false;
+    const auto input = make_shared<op::Parameter>(element::f32, input_shape);
+    const auto output_shape_input = op::Constant::create(element::i64, {4}, {1, 1, 1, 2});
+    std::vector<float> intput_data{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
+
+    auto interpolate = make_shared<op::Interpolate>(input, output_shape_input, attrs);
+    auto f = make_shared<Function>(interpolate, ParameterVector{input});
+
+    auto backend = runtime::Backend::create("IE_CPU");
+    auto input_tensor = backend->create_tensor(element::f32, input_shape);
+    auto result_tensor = backend->create_tensor(element::f32, output_shape);
+    auto handle = backend->compile(f);
+    copy_data(input_tensor, intput_data);
+
+    handle->call_with_validate({result_tensor}, {input_tensor});
+
+    vector<float> expected_output{1.0f, 2.66666651f};
+    EXPECT_TRUE(test::all_close_f(expected_output, read_vector<float>(result_tensor)));
+}
diff --git a/ngraph/test/models/onnx/resize11_scales_down_linear.prototxt b/ngraph/test/models/onnx/resize11_scales_down_linear.prototxt
new file mode 100644 (file)
index 0000000..b0e9007
--- /dev/null
@@ -0,0 +1,124 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    output: "scales"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 4
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 0.6
+        float_data: 0.6
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "roi"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 8
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "linear"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 4
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
diff --git a/ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor.prototxt b/ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor.prototxt
new file mode 100644 (file)
index 0000000..f48e516
--- /dev/null
@@ -0,0 +1,129 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    output: "scales"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 4
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 2.0
+        float_data: 0.5
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "roi"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 8
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "nearest"
+      type: STRING
+    }
+    attribute {
+      name: "nearest_mode"
+      s: "floor"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 4
+          }
+          dim {
+            dim_value: 1
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
diff --git a/ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor_dynamic_scales.prototxt b/ngraph/test/models/onnx/resize11_scales_nearest_asymmetric_floor_dynamic_scales.prototxt
new file mode 100644 (file)
index 0000000..3c83779
--- /dev/null
@@ -0,0 +1,117 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "nearest"
+      type: STRING
+    }
+    attribute {
+      name: "nearest_mode"
+      s: "floor"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+  input {
+  name: "roi"
+  type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 8
+          }
+        }
+      }
+    }
+  }
+  input {
+  name: "scales"
+  type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 4
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 4
+          }
+          dim {
+            dim_value: 1
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
diff --git a/ngraph/test/models/onnx/resize11_scales_up_linear_asymmetric.prototxt b/ngraph/test/models/onnx/resize11_scales_up_linear_asymmetric.prototxt
new file mode 100644 (file)
index 0000000..9a0a7de
--- /dev/null
@@ -0,0 +1,129 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    output: "scales"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 4
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 2.0
+        float_data: 4.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "roi"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 8
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "linear"
+      type: STRING
+    }
+    attribute {
+      name: "nearest_mode"
+      s: "floor"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 4
+          }
+          dim {
+            dim_value: 8
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
diff --git a/ngraph/test/models/onnx/resize11_sizes_linear.prototxt b/ngraph/test/models/onnx/resize11_sizes_linear.prototxt
new file mode 100644 (file)
index 0000000..6de3829
--- /dev/null
@@ -0,0 +1,139 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    output: "scales"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 1
+        float_data: 1.0
+        data_type: 1
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "sizes"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 4
+        data_type: 7
+        int64_data: 2
+        int64_data: 1
+        int64_data: 4
+        int64_data: 8
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "roi"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 8
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    input: "sizes"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "linear"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 4
+          }
+          dim {
+            dim_value: 8
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
diff --git a/ngraph/test/models/onnx/resize11_sizes_nearest_asymmetric_floor.prototxt b/ngraph/test/models/onnx/resize11_sizes_nearest_asymmetric_floor.prototxt
new file mode 100644 (file)
index 0000000..f3ce330
--- /dev/null
@@ -0,0 +1,144 @@
+ir_version: 7
+producer_name: "onnx-importer-test"
+graph {
+  node {
+    output: "scales"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 1
+        float_data: 1.0
+        data_type: 1
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "sizes"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 4
+        data_type: 7
+        int64_data: 2
+        int64_data: 1
+        int64_data: 4
+        int64_data: 1
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    output: "roi"
+    op_type: "Constant"
+    attribute {
+      name: "value"
+      t {
+        dims: 8
+        data_type: 1
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        float_data: 1.0
+        name: "const_tensor"
+      }
+      type: TENSOR
+    }
+  }
+  node {
+    input: "X"
+    input: "roi"
+    input: "scales"
+    input: "sizes"
+    output: "Y"
+    op_type: "Resize"
+    attribute {
+      name: "coordinate_transformation_mode"
+      s: "asymmetric"
+      type: STRING
+    }
+    attribute {
+      name: "cubic_coeff_a"
+      f: -0.75
+      type: FLOAT
+    }
+    attribute {
+      name: "exclude_outside"
+      i: 0
+      type: INT
+    }
+    attribute {
+      name: "extrapolation_value"
+      f: 0
+      type: FLOAT
+    }
+    attribute {
+      name: "mode"
+      s: "nearest"
+      type: STRING
+    }
+    attribute {
+      name: "nearest_mode"
+      s: "floor"
+      type: STRING
+    }
+  }
+  name: "test-model"
+  input {
+    name: "X"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 2
+          }
+        }
+      }
+    }
+  }
+  output {
+    name: "Y"
+    type {
+      tensor_type {
+        elem_type: 1
+        shape {
+          dim {
+            dim_value: 2
+          }
+          dim {
+            dim_value: 1
+          }
+          dim {
+            dim_value: 4
+          }
+          dim {
+            dim_value: 1
+          }
+        }
+      }
+    }
+  }
+}
+opset_import {
+  domain: ""
+  version: 11
+}
+
index 6d47560..c989856 100644 (file)
@@ -1148,6 +1148,113 @@ NGRAPH_TEST(${BACKEND_NAME}, onnx_resize10_up_scales_const_nearest)
     test_case.run();
 }
 
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_scales_down_linear)
+{
+    const auto function = onnx_import::import_onnx_model(
+        file_util::path_join(SERIALIZED_ZOO, "onnx/resize11_scales_down_linear.prototxt"));
+
+    const Shape expected_output_shape{1, 1, 1, 2};
+    auto test_case = test::TestCase<TestEngine>(function);
+    const size_t input_size = 8;
+    std::vector<float> input_data(input_size);
+    std::iota(std::begin(input_data), std::end(input_data), 1.0f);
+    test_case.add_input<float>(input_data);
+    test_case.add_expected_output<float>(expected_output_shape, {1.0f, 2.66666651f});
+
+    test_case.run();
+}
+
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_scales_up_linear_asymmetric)
+{
+    const auto function = onnx_import::import_onnx_model(
+        file_util::path_join(SERIALIZED_ZOO, "onnx/resize11_scales_up_linear_asymmetric.prototxt"));
+
+    const Shape expected_output_shape{2, 1, 4, 8};
+    auto test_case = test::TestCase<TestEngine>(function);
+    const size_t input_size = 8;
+    std::vector<float> input_data{1.0f, 3.0f, 4.0f, 8.0f, 6.0f, 2.0f, 7.0f, 11.0f};
+    test_case.add_input<float>(input_data);
+    test_case.add_expected_output<float>(
+        expected_output_shape,
+        {1.0f,  1.5f,  2.0f, 2.5f, 3.0f, 3.0f,  3.0f,  3.0f,  2.5f,  3.25f, 4.0f,
+         4.75f, 5.5f,  5.5f, 5.5f, 5.5f, 4.0f,  5.0f,  6.0f,  7.0f,  8.0f,  8.0f,
+         8.0f,  8.0f,  4.0f, 5.0f, 6.0f, 7.0f,  8.0f,  8.0f,  8.0f,  8.0f,
+
+         6.0f,  5.0f,  4.0f, 3.0f, 2.0f, 2.0f,  2.0f,  2.0f,  6.5f,  6.5f,  6.5f,
+         6.5f,  6.5f,  6.5f, 6.5f, 6.5f, 7.0f,  8.0f,  9.0f,  10.0f, 11.0f, 11.0f,
+         11.0f, 11.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 11.0f, 11.0f, 11.0f});
+
+    test_case.run();
+}
+
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_scales_nearest_asymmetric_floor)
+{
+    const auto function = onnx_import::import_onnx_model(file_util::path_join(
+        SERIALIZED_ZOO, "onnx/resize11_scales_nearest_asymmetric_floor.prototxt"));
+
+    const Shape expected_output_shape{2, 1, 4, 1};
+    auto test_case = test::TestCase<TestEngine>(function);
+    const std::vector<float> input_data{1.0f, 3.0f, 4.0f, 8.0f, 6.0f, 2.0f, 7.0f, 11.0f};
+    test_case.add_input<float>(input_data);
+    test_case.add_expected_output<float>(expected_output_shape,
+                                         {1.0f, 1.0f, 4.0f, 4.0f, 6.0f, 6.0f, 7.0f, 7.0f});
+
+    test_case.run();
+}
+
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_scales_nearest_asymmetric_floor_dynamic_sizes)
+{
+    const auto function = onnx_import::import_onnx_model(file_util::path_join(
+        SERIALIZED_ZOO, "onnx/resize11_scales_nearest_asymmetric_floor_dynamic_scales.prototxt"));
+
+    const Shape expected_output_shape{2, 1, 4, 1};
+    auto test_case = test::TestCase<TestEngine>(function);
+    const std::vector<float> input_data{1.0f, 3.0f, 4.0f, 8.0f, 6.0f, 2.0f, 7.0f, 11.0f};
+    test_case.add_input<float>(input_data);
+    test_case.add_input<float>(
+        std::vector<float>{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}); // roi
+    test_case.add_input<float>(std::vector<float>{1.0f, 1.0f, 2.0f, 0.5f});  // scales
+    test_case.add_expected_output<float>(expected_output_shape,
+                                         {1.0f, 1.0f, 4.0f, 4.0f, 6.0f, 6.0f, 7.0f, 7.0f});
+
+    test_case.run();
+}
+
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_sizes_nearest_asymmetric_floor)
+{
+    const auto function = onnx_import::import_onnx_model(file_util::path_join(
+        SERIALIZED_ZOO, "onnx/resize11_sizes_nearest_asymmetric_floor.prototxt"));
+
+    const Shape expected_output_shape{2, 1, 4, 1};
+    auto test_case = test::TestCase<TestEngine>(function);
+    std::vector<float> input_data{1.0f, 3.0f, 4.0f, 8.0f, 6.0f, 2.0f, 7.0f, 11.0f};
+    test_case.add_input<float>(input_data);
+    test_case.add_expected_output<float>(expected_output_shape,
+                                         {1.0f, 1.0f, 4.0f, 4.0f, 6.0f, 6.0f, 7.0f, 7.0f});
+
+    test_case.run();
+}
+
+NGRAPH_TEST(${BACKEND_NAME}, onnx_resize11_sizes_linear)
+{
+    const auto function = onnx_import::import_onnx_model(
+        file_util::path_join(SERIALIZED_ZOO, "onnx/resize11_sizes_linear.prototxt"));
+
+    const Shape expected_output_shape{2, 1, 4, 8};
+    auto test_case = test::TestCase<TestEngine>(function);
+    std::vector<float> input_data{2.0f, 4.0f, 1.0f, 3.0f, 7.0f, 8.0f, 9.0f, 6.0f};
+    test_case.add_input<float>(input_data);
+    test_case.add_expected_output<float>(
+        expected_output_shape,
+        {2.0f, 2.5f, 3.0f,  3.5f, 4.0f,  4.0f,  4.0f, 4.0f,  1.5f, 2.0f,  2.5f,  3.0f, 3.5f,
+         3.5f, 3.5f, 3.5f,  1.0f, 1.5f,  2.0f,  2.5f, 3.0f,  3.0f, 3.0f,  3.0f,  1.0f, 1.5f,
+         2.0f, 2.5f, 3.0f,  3.0f, 3.0f,  3.0f,  7.0f, 7.25f, 7.5f, 7.75f, 8.0f,  8.0f, 8.0f,
+         8.0f, 8.0f, 7.75f, 7.5f, 7.25f, 7.0f,  7.0f, 7.0f,  7.0f, 9.0f,  8.25f, 7.5f, 6.75f,
+         6.0f, 6.0f, 6.0f,  6.0f, 9.0f,  8.25f, 7.5f, 6.75f, 6.0f, 6.0f,  6.0f,  6.0f});
+
+    test_case.run();
+}
+
 NGRAPH_TEST(${BACKEND_NAME}, onnx_model_shape)
 {
     auto function =
index 266607c..fd4ccd3 100644 (file)
@@ -1087,8 +1087,17 @@ IE_CPU.atanh
 IE_CPU.asinh
 IE_CPU.acosh
 
+# Interpolate-1 in linear mode
+# 2.666666507720947266 is not close to 3 at index 1
+IE_CPU.interpolate_down_scales_const_linear
+
 # Result mismatch 2.666666507720947266 is not close to 3 at index 1
 IE_CPU.onnx_resize10_down_scales_const_linear
+IE_CPU.onnx_resize11_scales_down_linear
+
+# C++ exception with description "Interpolate operation should be converted to Interp
+# not constant output_shape passed to Interpolate-1
+IE_CPU.onnx_resize11_scales_nearest_asymmetric_floor_dynamic_sizes
 
 # GRUCell operation has a form that is not supported
 IE_CPU.onnx_model_gru_defaults_fwd
index af16982..ec72598 100644 (file)
@@ -20,6 +20,13 @@ INTERPRETER.onnx_upsample8_linear_infer
 INTERPRETER.onnx_upsample9_scales_const_nearest_infer
 INTERPRETER.onnx_upsample9_scales_const_linear_infer
 INTERPRETER.onnx_upsample9_scales_input_nearest_infer
+INTERPRETER.onnx_resize11_scales_down_linear
+INTERPRETER.onnx_resize11_scales_up_linear_asymmetric
+INTERPRETER.onnx_resize11_scales_nearest_asymmetric_floor
+INTERPRETER.onnx_resize11_sizes_nearest_asymmetric_floor
+INTERPRETER.onnx_resize11_sizes_linear
+INTERPRETER.onnx_resize11_scales_nearest_asymmetric_floor_dynamic_sizes
+INTERPRETER.interpolate_down_scales_const_linear
 
 # ONNX Loop
 onnx_controlflow_loop_2d_add_execution