From fe15eff9ed2007cd10800ec356ce2e8ea4b5f9d0 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Mon, 1 Jul 2019 16:12:58 +0100 Subject: IVGCVSW-3361 Add end-to-end tests for Resize on CpuRef Signed-off-by: Aron Virginas-Tar Change-Id: Ie89dc91a2fc0281d58c6f1ccef65ed1228d33ccb --- src/backends/backendsCommon/test/CMakeLists.txt | 1 + .../backendsCommon/test/ResizeEndToEndTestImpl.hpp | 147 +++++++++++++++++++++ src/backends/reference/test/RefEndToEndTests.cpp | 69 +++++++++- 3 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp (limited to 'src') diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index caf2dd34b0..bc91bee58e 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -42,6 +42,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources Pooling2dTestImpl.hpp QuantizeHelper.hpp QuantizeTestImpl.hpp + ResizeEndToEndTestImpl.hpp RuntimeTestImpl.hpp SoftmaxTestImpl.hpp SpaceToDepthTestImpl.hpp diff --git a/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp new file mode 100644 index 0000000000..4bf9d510a6 --- /dev/null +++ b/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp @@ -0,0 +1,147 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "QuantizeHelper.hpp" + +#include + +#include +#include + +#include + +#include + +#include +#include + +namespace +{ + +armnn::INetworkPtr CreateResizeNetwork(const armnn::ResizeDescriptor& descriptor, + const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& outputInfo) +{ + using namespace armnn; + + INetworkPtr network(INetwork::Create()); + IConnectableLayer* input = network->AddInputLayer(0, "input"); + IConnectableLayer* resize = network->AddResizeLayer(descriptor, "resize"); + IConnectableLayer* output = network->AddOutputLayer(0, "output"); + + Connect(input, resize, inputInfo, 0, 0); + Connect(resize, output, outputInfo, 0, 0); + + return network; +} + +template +void ResizeEndToEnd(const std::vector& backends, + armnn::DataLayout dataLayout, + armnn::ResizeMethod resizeMethod) +{ + using namespace armnn; + using T = ResolveType; + + constexpr unsigned int inputWidth = 3u; + constexpr unsigned int inputHeight = inputWidth; + + constexpr unsigned int outputWidth = 5u; + constexpr unsigned int outputHeight = outputWidth; + + TensorShape inputShape = MakeTensorShape(1, 1, inputHeight, inputWidth, dataLayout); + TensorShape outputShape = MakeTensorShape(1, 1, outputHeight, outputWidth, dataLayout); + + const float qScale = IsQuantizedType() ? 0.25f : 1.0f; + const int32_t qOffset = IsQuantizedType() ? 50 : 0; + + TensorInfo inputInfo(inputShape, ArmnnType, qScale, qOffset); + TensorInfo outputInfo(outputShape, ArmnnType, qScale, qOffset); + + std::vector inputData = + { + 1.f, 2.f, 3.f, + 4.f, 5.f, 6.f, + 7.f, 8.f, 9.f + }; + + std::vector expectedOutputData; + switch(resizeMethod) + { + case ResizeMethod::Bilinear: + { + expectedOutputData = + { + 1.0f, 1.6f, 2.2f, 2.8f, 3.0f, + 2.8f, 3.4f, 4.0f, 4.6f, 4.8f, + 4.6f, 5.2f, 5.8f, 6.4f, 6.6f, + 6.4f, 7.0f, 7.6f, 8.2f, 8.4f, + 7.0f, 7.6f, 8.2f, 8.8f, 9.0f + }; + break; + } + case ResizeMethod::NearestNeighbor: + { + expectedOutputData = + { + 1.f, 1.f, 2.f, 2.f, 3.f, + 1.f, 1.f, 2.f, 2.f, 3.f, + 4.f, 4.f, 5.f, 5.f, 6.f, + 4.f, 4.f, 5.f, 5.f, 6.f, + 7.f, 7.f, 8.f, 8.f, 9.f + }; + break; + } + default: + { + throw InvalidArgumentException("Unrecognized resize method"); + } + } + + ResizeDescriptor descriptor; + descriptor.m_TargetWidth = outputWidth; + descriptor.m_TargetHeight = outputHeight; + descriptor.m_Method = resizeMethod; + descriptor.m_DataLayout = dataLayout; + + // swizzle data if needed + if (dataLayout == armnn::DataLayout::NHWC) + { + constexpr size_t dataTypeSize = sizeof(float); + const armnn::PermutationVector nchwToNhwc = { 0, 3, 1, 2 }; + + std::vector tmp(inputData.size()); + armnnUtils::Permute(inputInfo.GetShape(), nchwToNhwc, inputData.data(), tmp.data(), dataTypeSize); + inputData = tmp; + } + + // quantize data + std::vector qInputData = QuantizedVector(qScale, qOffset, inputData); + std::vector qExpectedOutputData = QuantizedVector(qScale, qOffset, expectedOutputData); + + INetworkPtr network = CreateResizeNetwork(descriptor, inputInfo, outputInfo); + + EndToEndLayerTestImpl(std::move(network), + { { 0, qInputData } }, + { { 0, qExpectedOutputData } }, + backends); +} + +} // anonymous namespace + +template +void ResizeBilinearEndToEnd(const std::vector& backends, + armnn::DataLayout dataLayout) +{ + ResizeEndToEnd(backends, dataLayout, armnn::ResizeMethod::Bilinear); +} + +template +void ResizeNearestNeighborEndToEnd(const std::vector& backends, + armnn::DataLayout dataLayout) +{ + ResizeEndToEnd(backends, dataLayout, armnn::ResizeMethod::NearestNeighbor); +} \ No newline at end of file diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index a528a54cd2..58f1284ebd 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -5,12 +5,13 @@ #include +#include #include +#include #include #include #include -#include -#include +#include #include #include #include @@ -968,4 +969,66 @@ BOOST_AUTO_TEST_CASE(RefTransposeConvolution2dEndToEndInt16NhwcTest) defaultBackends, armnn::DataLayout::NHWC); } -BOOST_AUTO_TEST_SUITE_END() +// Resize Bilinear +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndFloatNchwTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndUint8NchwTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndInt16NchwTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndFloatNhwcTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndUint8NhwcTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndInt16NhwcTest) +{ + ResizeBilinearEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +// Resize NearestNeighbor +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndFloatNchwTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndUint8NchwTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndInt16NchwTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndFloatNhwcTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndUint8NhwcTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndInt16NhwcTest) +{ + ResizeNearestNeighborEndToEnd(defaultBackends, armnn::DataLayout::NHWC); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file -- cgit v1.2.1