From 73f66421c6719c007325b69d51ca73dd58eb8c33 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Mon, 23 Sep 2019 19:11:59 +0100 Subject: IVGCVSW-3885 Add reference workload for DepthToSpace Signed-off-by: Aron Virginas-Tar Change-Id: Id937dc4425884ad1985dcdfaae8bf3fb64f0c766 --- src/backends/backendsCommon/common.mk | 1 + src/backends/backendsCommon/test/CMakeLists.txt | 2 + src/backends/backendsCommon/test/LayerTests.hpp | 1 + .../test/layerTests/DepthToSpaceTestImpl.cpp | 342 +++++++++++++++++++++ .../test/layerTests/DepthToSpaceTestImpl.hpp | 36 +++ 5 files changed, 382 insertions(+) create mode 100644 src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp create mode 100644 src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/common.mk b/src/backends/backendsCommon/common.mk index abf924aca5..343af5a019 100644 --- a/src/backends/backendsCommon/common.mk +++ b/src/backends/backendsCommon/common.mk @@ -45,6 +45,7 @@ COMMON_TEST_SOURCES := \ test/layerTests/ConvertFp16ToFp32TestImpl.cpp \ test/layerTests/ConvertFp32ToFp16TestImpl.cpp \ test/layerTests/DebugTestImpl.cpp \ + test/layerTests/DepthToSpaceTestImpl.cpp \ test/layerTests/DequantizeTestImpl.cpp \ test/layerTests/DivisionTestImpl.cpp \ test/layerTests/EqualTestImpl.cpp \ diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 0cebf90319..481d7d8423 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -63,6 +63,8 @@ list(APPEND armnnBackendsCommonUnitTests_sources layerTests/ConvertFp32ToFp16TestImpl.hpp layerTests/DebugTestImpl.cpp layerTests/DebugTestImpl.hpp + layerTests/DepthToSpaceTestImpl.cpp + layerTests/DepthToSpaceTestImpl.hpp layerTests/DequantizeTestImpl.cpp layerTests/DequantizeTestImpl.hpp layerTests/DetectionPostProcessTestImpl.hpp diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 14ff26610f..84125b55d3 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp new file mode 100644 index 0000000000..9588f560ef --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp @@ -0,0 +1,342 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "DepthToSpaceTestImpl.hpp" + +#include + +#include + +#include +#include + +#include + +namespace +{ + +template +LayerTestResult DepthToSpaceTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::TensorInfo& inputInfo, + armnn::TensorInfo& outputInfo, + std::vector& inputData, + std::vector& expectedOutputData, + armnn::DepthToSpaceQueueDescriptor descriptor, + const float qScale = 1.0f, + const int32_t qOffset = 0) +{ + const armnn::PermutationVector permVector{0, 2, 3, 1}; + + if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW) + { + inputInfo = armnnUtils::Permuted(inputInfo, permVector); + outputInfo = armnnUtils::Permuted(outputInfo, permVector); + + constexpr size_t typeSize = sizeof(float); + + std::vector inputTmp(inputData.size()); + armnnUtils::Permute(inputInfo.GetShape(), permVector, inputData.data(), inputTmp.data(), typeSize); + inputData = inputTmp; + + std::vector outputTmp(expectedOutputData.size()); + armnnUtils::Permute(outputInfo.GetShape(), permVector, expectedOutputData.data(), outputTmp.data(), typeSize); + expectedOutputData = outputTmp; + } + + if(armnn::IsQuantizedType()) + { + inputInfo.SetQuantizationScale(qScale); + inputInfo.SetQuantizationOffset(qOffset); + outputInfo.SetQuantizationScale(qScale); + outputInfo.SetQuantizationOffset(qOffset); + } + + boost::multi_array input = MakeTensor(inputInfo, QuantizedVector(qScale, qOffset, inputData)); + + LayerTestResult result(outputInfo); + result.outputExpected = MakeTensor(outputInfo, QuantizedVector(qScale, qOffset, expectedOutputData)); + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputInfo); + + armnn::WorkloadInfo info; + AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateDepthToSpace(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), input.origin()); + + workload->Execute(); + + CopyDataFromITensorHandle(result.output.origin(), outputHandle.get()); + return result; +} + +} // anonymous namespace + +template +LayerTestResult DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 1, 1, 1, 8 }; + unsigned int outputShape[] = { 1, 2, 2, 2 }; + + // in: + // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]] + // + // out: + // [[[[1, 2, 3], [4, 5, 6]], + // [[7, 8, 9], [10, 11, 12]]]] + + std::vector input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f }; + std::vector expectedOutput = input; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template +LayerTestResult DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 1, 2, 2, 4 }; + unsigned int outputShape[] = { 1, 4, 4, 1 }; + + // in: + // [[[[1, 2, 3, 4], + // [5, 6, 7, 8]], + // [[9, 10, 11, 12], + // [13, 14, 15, 16]]]] + // + // out: + // [[[ [1], [2], [5], [6]], + // [ [3], [4], [7], [8]], + // [ [9], [10], [13], [14]], + // [ [11], [12], [15], [16]]]] + + std::vector input = + { + 1.f, 2.f, 3.f, 4.f, + + 5.f, 6.f, 7.f, 8.f, + + 9.f, 10.f, 11.f, 12.f, + + 13.f, 14.f, 15.f, 16.f + }; + + std::vector expectedOutput + { + 1.f, 2.f, 5.f, 6.f, + 3.f, 4.f, 7.f, 8.f, + 9.f, 10.f, 13.f, 14.f, + 11.f, 12.f, 15.f, 16.f + }; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template +LayerTestResult DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 2, 1, 1, 4 }; + unsigned int outputShape[] = { 2, 2, 2, 1 }; + + std::vector input = + { + 1.f, 2.f, 3.f, 4.f, // batch 0 + 5.f, 6.f, 7.f, 8.f // batch 1 + }; + + std::vector expectedOutput = input; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +template +LayerTestResult DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout) +{ + unsigned int inputShape[] = { 2, 2, 2, 4 }; + unsigned int outputShape[] = { 2, 4, 4, 1 }; + + std::vector input = + { + 1.f, 2.f, 3.f, 4.f, + + 5.f, 6.f, 7.f, 8.f, + + 9.f, 10.f, 11.f, 12.f, + + 13.f, 14.f, 15.f, 16.f, + + + 17.f, 18.f, 19.f, 20.f, + + 21.f, 22.f, 23.f, 24.f, + + 25.f, 26.f, 27.f, 28.f, + + 29.f, 30.f, 31.f, 32.f + }; + + std::vector expectedOutput + { + 1.f, 2.f, 5.f, 6.f, + 3.f, 4.f, 7.f, 8.f, + 9.f, 10.f, 13.f, 14.f, + 11.f, 12.f, 15.f, 16.f, + + + 17.f, 18.f, 21.f, 22.f, + 19.f, 20.f, 23.f, 24.f, + 25.f, 26.f, 29.f, 30.f, + 27.f, 28.f, 31.f, 32.f + }; + + armnn::DepthToSpaceQueueDescriptor desc; + desc.m_Parameters.m_DataLayout = dataLayout; + desc.m_Parameters.m_BlockSize = 2; + + armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); + armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); + + return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); +} + +// Float32 +template LayerTestResult, 4> +DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// Float16 +template LayerTestResult, 4> +DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// QuantisedAsymm8 +template LayerTestResult, 4> +DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +// QuantisedSymm16 +template LayerTestResult, 4> +DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template LayerTestResult, 4> +DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); diff --git a/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp new file mode 100644 index 0000000000..4dbcd266d7 --- /dev/null +++ b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.hpp @@ -0,0 +1,36 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "LayerTestResult.hpp" + +#include + +#include +#include + +template> +LayerTestResult DepthToSpaceTest1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template> +LayerTestResult DepthToSpaceTest2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template> +LayerTestResult DepthToSpaceTest3( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); + +template> +LayerTestResult DepthToSpaceTest4( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout dataLayout); -- cgit v1.2.1