|
|
|
@ -257,6 +257,7 @@ public: |
|
|
|
|
{ |
|
|
|
|
auto& ieInpNode = nodes[0].dynamicCast<InfEngineNgraphNode>()->node; |
|
|
|
|
|
|
|
|
|
#if INF_ENGINE_VER_MAJOR_LE(INF_ENGINE_RELEASE_2021_2) |
|
|
|
|
ngraph::op::InterpolateAttrs attrs; |
|
|
|
|
attrs.pads_begin.push_back(0); |
|
|
|
|
attrs.pads_end.push_back(0); |
|
|
|
@ -275,6 +276,37 @@ public: |
|
|
|
|
std::vector<int64_t> shape = {outHeight, outWidth}; |
|
|
|
|
auto out_shape = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, shape.data()); |
|
|
|
|
auto interp = std::make_shared<ngraph::op::Interpolate>(ieInpNode, out_shape, attrs); |
|
|
|
|
#else |
|
|
|
|
ngraph::op::v4::Interpolate::InterpolateAttrs attrs; |
|
|
|
|
|
|
|
|
|
if (interpolation == "nearest") { |
|
|
|
|
attrs.mode = ngraph::op::v4::Interpolate::InterpolateMode::nearest; |
|
|
|
|
attrs.coordinate_transformation_mode = ngraph::op::v4::Interpolate::CoordinateTransformMode::half_pixel; |
|
|
|
|
} else if (interpolation == "bilinear") { |
|
|
|
|
attrs.mode = ngraph::op::v4::Interpolate::InterpolateMode::linear_onnx; |
|
|
|
|
attrs.coordinate_transformation_mode = ngraph::op::v4::Interpolate::CoordinateTransformMode::asymmetric; |
|
|
|
|
} else { |
|
|
|
|
CV_Error(Error::StsNotImplemented, format("Unsupported interpolation: %s", interpolation.c_str())); |
|
|
|
|
} |
|
|
|
|
attrs.shape_calculation_mode = ngraph::op::v4::Interpolate::ShapeCalcMode::sizes; |
|
|
|
|
|
|
|
|
|
if (alignCorners) { |
|
|
|
|
attrs.coordinate_transformation_mode = ngraph::op::v4::Interpolate::CoordinateTransformMode::align_corners; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
attrs.nearest_mode = ngraph::op::v4::Interpolate::NearestMode::round_prefer_floor; |
|
|
|
|
|
|
|
|
|
std::vector<int64_t> shape = {outHeight, outWidth}; |
|
|
|
|
auto out_shape = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, shape.data()); |
|
|
|
|
|
|
|
|
|
auto& input_shape = ieInpNode->get_shape(); |
|
|
|
|
CV_Assert_N(input_shape[2] != 0, input_shape[3] != 0); |
|
|
|
|
std::vector<float> scales = {static_cast<float>(outHeight) / input_shape[2], static_cast<float>(outWidth) / input_shape[3]}; |
|
|
|
|
auto scales_shape = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, ngraph::Shape{2}, scales.data()); |
|
|
|
|
|
|
|
|
|
auto axes = std::make_shared<ngraph::op::Constant>(ngraph::element::i64, ngraph::Shape{2}, std::vector<int64_t>{2, 3}); |
|
|
|
|
auto interp = std::make_shared<ngraph::op::v4::Interpolate>(ieInpNode, out_shape, scales_shape, axes, attrs); |
|
|
|
|
#endif |
|
|
|
|
return Ptr<BackendNode>(new InfEngineNgraphNode(interp)); |
|
|
|
|
} |
|
|
|
|
#endif // HAVE_DNN_NGRAPH
|
|
|
|
|