From 3687ee1e7719436ff155a35911946b045903e8b6 Mon Sep 17 00:00:00 2001 From: Sang-Hoon Park Date: Wed, 24 Jun 2020 13:34:04 +0100 Subject: COMPMID-3539: Ignore align_corners for scaled size of 1 Scale kernels failed to validate when align_corners is true for scaled output size 1. Change this behavior to ignoring align_corners value to be aligned with expected behavior of higher-level frameworks. Also the minimum output size generated by the fixture for Scale kernels is changed to 1. Change-Id: Ib8e479af8bc43de3780005545f0c53fe195dc22e Signed-off-by: Sang-Hoon Park Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3478 Tested-by: Arm Jenkins Reviewed-by: Georgios Pinitas Comments-Addressed: Arm Jenkins --- tests/validation/CL/Scale.cpp | 17 ----------------- tests/validation/NEON/Scale.cpp | 17 ----------------- tests/validation/fixtures/ScaleFixture.h | 7 ++----- tests/validation/reference/Scale.cpp | 7 +++++-- 4 files changed, 7 insertions(+), 41 deletions(-) (limited to 'tests') diff --git a/tests/validation/CL/Scale.cpp b/tests/validation/CL/Scale.cpp index 50c148dfba..8a010032a3 100644 --- a/tests/validation/CL/Scale.cpp +++ b/tests/validation/CL/Scale.cpp @@ -186,23 +186,6 @@ TEST_CASE(AlignedCornerNotSupported, framework::DatasetMode::ALL) ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS); } -TEST_CASE(InvalidAlignedCornerOutput, framework::DatasetMode::ALL) -{ - // Bilinear with aligned corners require at least 2x2 output to prevent overflow. - // Also, aligned corners require sampling policy to be TOP_LEFT. - constexpr auto interpolation_policy = InterpolationPolicy::BILINEAR; - constexpr bool align_corners = true; - constexpr auto sampling_policy = SamplingPolicy::TOP_LEFT; - const auto invalid_output_shape = TensorShape{ 1, 1, 3, 2 }; - - const auto input = TensorInfo{ default_input_shape, 1, default_data_type, default_data_layout }; - const auto output = TensorInfo{ invalid_output_shape, 1, default_data_type, default_data_layout }; - Status result{}; - - result = CLScale::validate(&input, &output, ScaleKernelInfo{ interpolation_policy, default_border_mode, PixelValue(), sampling_policy, default_use_padding, align_corners }); - ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS); -} - TEST_CASE(WindowShrink, framework::DatasetMode::ALL) { const auto input = TensorInfo{ TensorShape(37U, 37U, 2U), 1, DataType::F32 }; diff --git a/tests/validation/NEON/Scale.cpp b/tests/validation/NEON/Scale.cpp index f4a9b9df56..a7eb4b2d8d 100644 --- a/tests/validation/NEON/Scale.cpp +++ b/tests/validation/NEON/Scale.cpp @@ -244,23 +244,6 @@ TEST_CASE(AlignedCornerNotSupported, framework::DatasetMode::ALL) result = NEScale::validate(&input, &output, ScaleKernelInfo{ interpolation_policy, default_border_mode, PixelValue(), sampling_policy, default_use_padding, align_corners }); ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS); } - -TEST_CASE(InvalidAlignedCornerOutput, framework::DatasetMode::ALL) -{ - // Bilinear with aligned corners require at least 2x2 output to prevent overflow. - // Also, aligned corners require sampling policy to be TOP_LEFT. - constexpr auto interpolation_policy = InterpolationPolicy::BILINEAR; - constexpr bool align_corners = true; - constexpr auto sampling_policy = SamplingPolicy::TOP_LEFT; - const auto invalid_output_shape = TensorShape{ 1, 1, 3, 2 }; - - const auto input = TensorInfo{ input_shape, 1, default_data_type, default_data_layout }; - const auto output = TensorInfo{ invalid_output_shape, 1, default_data_type, default_data_layout }; - Status result{}; - - result = NEScale::validate(&input, &output, ScaleKernelInfo{ interpolation_policy, default_border_mode, PixelValue(), sampling_policy, default_use_padding, align_corners }); - ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS); -} TEST_SUITE_END() // Validate template diff --git a/tests/validation/fixtures/ScaleFixture.h b/tests/validation/fixtures/ScaleFixture.h index 12d9012ece..b7a821fad4 100644 --- a/tests/validation/fixtures/ScaleFixture.h +++ b/tests/validation/fixtures/ScaleFixture.h @@ -74,11 +74,8 @@ protected: constexpr float max_width{ 8192.0f }; constexpr float max_height{ 6384.0f }; - - const bool is_align_corners_used = _align_corners && arm_compute::is_align_corners_allowed(_sampling_policy); - - const float min_width = is_align_corners_used ? 2.f : 1.f; - const float min_height = is_align_corners_used ? 2.f : 1.f; + const float min_width{ 1.f }; + const float min_height{ 1.f }; std::mt19937 generator(library->seed()); std::uniform_real_distribution distribution_float(_min_scale, _max_scale); diff --git a/tests/validation/reference/Scale.cpp b/tests/validation/reference/Scale.cpp index cb4ad6f909..44beabb2d4 100644 --- a/tests/validation/reference/Scale.cpp +++ b/tests/validation/reference/Scale.cpp @@ -26,6 +26,7 @@ #include "Utils.h" #include "arm_compute/core/utils/misc/Utility.h" +#include "src/core/utils/ScaleUtils.h" namespace arm_compute { @@ -46,9 +47,11 @@ SimpleTensor scale_core(const SimpleTensor &in, float scale_x, float scale shape_scaled.set(1, (in.shape()[1] + round_value) * scale_y, /* apply_dim_correction = */ false); SimpleTensor out(shape_scaled, in.data_type()); + align_corners = align_corners && arm_compute::scale_utils::is_align_corners_allowed_output_shape(out.shape(), DataLayout::NCHW); + // Compute the ratio between source width/height and destination width/height - const auto wr = arm_compute::calculate_resize_ratio(in.shape()[0], out.shape()[0], align_corners); - const auto hr = arm_compute::calculate_resize_ratio(in.shape()[1], out.shape()[1], align_corners); + const auto wr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[0], out.shape()[0], align_corners); + const auto hr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[1], out.shape()[1], align_corners); const auto width = static_cast(in.shape().x()); const auto height = static_cast(in.shape().y()); -- cgit v1.2.1