From 77562dc560a3e292c3679d08bd2813293eb3a68f Mon Sep 17 00:00:00 2001 From: Anthony Barbier Date: Mon, 26 Feb 2018 17:18:32 +0000 Subject: Revert "IVGCVSW-1018 Fix valid region for Scale" Introduced some regression: http://afs-mpg.arm.com/job/ComputeLibrary_Gerrit_Review/2398/parsed_console/ This reverts commit bb35167d1f6622c85a248b808a32c8f97120bd5a. Change-Id: I6d3ec5e487b1232ffc07ed2df3bc62ae807c35e6 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/122273 Reviewed-by: Michalis Spyrou Tested-by: Jenkins --- arm_compute/core/Helpers.inl | 113 +++++++++---------------------------------- 1 file changed, 24 insertions(+), 89 deletions(-) (limited to 'arm_compute/core/Helpers.inl') diff --git a/arm_compute/core/Helpers.inl b/arm_compute/core/Helpers.inl index 899805a701..8b86c22676 100644 --- a/arm_compute/core/Helpers.inl +++ b/arm_compute/core/Helpers.inl @@ -290,98 +290,33 @@ inline bool set_quantization_info_if_empty(ITensorInfo &info, QuantizationInfo q inline ValidRegion calculate_valid_region_scale(const ITensorInfo &src_info, const TensorShape &dst_shape, InterpolationPolicy policy, BorderSize border_size, bool border_undefined) { - const float scale_x = static_cast(dst_shape[0]) / src_info.tensor_shape()[0]; - const float scale_y = static_cast(dst_shape[1]) / src_info.tensor_shape()[1]; - - int valid_start_out_x; - int valid_start_out_y; - int valid_end_out_x; - int valid_end_out_y; - - switch(policy) - { - case InterpolationPolicy::NEAREST_NEIGHBOR: - { - const float valid_start_in_x = src_info.valid_region().anchor[0]; - const float valid_start_in_y = src_info.valid_region().anchor[1]; - - const float valid_end_in_x = src_info.valid_region().anchor[0] + src_info.valid_region().shape[0]; - const float valid_end_in_y = src_info.valid_region().anchor[1] + src_info.valid_region().shape[1]; - - // (start_out + 0.5) / scale >= start_in - // --> start_out >= (start_in * scale) - 0.5 - // --> start_out = ceil((start_in * scale) - 0.5) - valid_start_out_x = std::ceil((valid_start_in_x * scale_x) - 0.5f); - valid_start_out_y = std::ceil((valid_start_in_y * scale_y) - 0.5f); - - // (end_out - 0.5) / scale < end_in - // --> end_out < (end_in * scale) + 0.5 - // --> end_out = ceil((end_in * scale) + 0.5 - 1) - valid_end_out_x = std::ceil((valid_end_in_x * scale_x) - 0.5f); - valid_end_out_y = std::ceil((valid_end_in_y * scale_y) - 0.5f); - - break; - } - case InterpolationPolicy::BILINEAR: - { - const float k = border_undefined ? 0.5f : 0.0f; - - const float valid_start_in_x = src_info.valid_region().anchor[0] + k; - const float valid_start_in_y = src_info.valid_region().anchor[1] + k; - - const float valid_end_in_x = src_info.valid_region().anchor[0] + src_info.valid_region().shape[0] - k; - const float valid_end_in_y = src_info.valid_region().anchor[1] + src_info.valid_region().shape[1] - k; - - // (start_out + 0.5) / scale >= start_in - // --> start_out >= (start_in * scale) - 0.5 - // --> start_out = ceil((start_in * scale) - 0.5) - valid_start_out_x = std::ceil((valid_start_in_x * scale_x) - 0.5f); - valid_start_out_y = std::ceil((valid_start_in_y * scale_y) - 0.5f); - - // (end_out - 0.5) / scale <= end_in - // --> end_out <= (end_in * scale) + 0.5 - // --> end_out = floor((end_in * scale) + 0.5) - valid_end_out_x = std::floor((valid_end_in_x * scale_x) + 0.5f); - valid_end_out_y = std::floor((valid_end_in_y * scale_y) + 0.5f); - - break; - } - case InterpolationPolicy::AREA: - { - const float valid_start_in_x = src_info.valid_region().anchor[0]; - const float valid_start_in_y = src_info.valid_region().anchor[1]; - - const float valid_end_in_x = src_info.valid_region().anchor[0] + src_info.valid_region().shape[0]; - const float valid_end_in_y = src_info.valid_region().anchor[1] + src_info.valid_region().shape[1]; - - // start_out / scale >= start_in - // --> start_out >= start_in * scale - // --> start_out = ceil(start_in * scale) - valid_start_out_x = std::ceil(valid_start_in_x * scale_x); - valid_start_out_y = std::ceil(valid_start_in_y * scale_y); - - // end_out / scale <= end_in - // --> end_out <= end_in * scale - // --> end_out = floor(end_in * scale) - valid_end_out_x = std::floor(valid_end_in_x * scale_x); - valid_end_out_y = std::floor(valid_end_in_y * scale_y); - - break; - } - default: - { - ARM_COMPUTE_ERROR("Invalid InterpolationPolicy"); - break; - } - } + const auto wr = static_cast(dst_shape[0]) / static_cast(src_info.tensor_shape()[0]); + const auto hr = static_cast(dst_shape[1]) / static_cast(src_info.tensor_shape()[1]); ValidRegion valid_region{ Coordinates(), dst_shape, src_info.tensor_shape().num_dimensions() }; - valid_region.anchor.set(0, valid_start_out_x); - valid_region.anchor.set(1, valid_start_out_y); - - valid_region.shape.set(0, static_cast(valid_end_out_x - valid_start_out_x)); - valid_region.shape.set(1, static_cast(valid_end_out_y - valid_start_out_y)); + Coordinates &anchor = valid_region.anchor; + TensorShape &shape = valid_region.shape; + + anchor.set(0, (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[0]) + border_size.left + 0.5f) * wr - 0.5f) : + ((static_cast(src_info.valid_region().anchor[0]) + 0.5f) * wr - 0.5f)); + anchor.set(1, (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[1]) + border_size.top + 0.5f) * hr - 0.5f) : + ((static_cast(src_info.valid_region().anchor[1]) + 0.5f) * hr - 0.5f)); + float shape_out_x = (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[0]) + static_cast(src_info.valid_region().shape[0]) - 1) - 1 + 0.5f) * wr - 0.5f : + ((static_cast(src_info.valid_region().anchor[0]) + static_cast(src_info.valid_region().shape[0])) + 0.5f) * wr - 0.5f; + float shape_out_y = (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[1]) + static_cast(src_info.valid_region().shape[1]) - 1) - 1 + 0.5f) * hr - 0.5f : + ((static_cast(src_info.valid_region().anchor[1]) + static_cast(src_info.valid_region().shape[1])) + 0.5f) * hr - 0.5f; + + shape.set(0, shape_out_x - anchor[0]); + shape.set(1, shape_out_y - anchor[1]); return valid_region; } -- cgit v1.2.1