From a0beb3b8aeb8bbea906609e0f50a250c33cde10b Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Mon, 1 Apr 2019 17:04:53 +0100 Subject: IVGCVSW-2872 Unit tests for Quantize layer and reference workload Change-Id: I291c08cb6e359453978b398255cf8ff051ed2686 Signed-off-by: Nattapat Chaimanowong --- src/backends/backendsCommon/test/CMakeLists.txt | 1 + src/backends/backendsCommon/test/LayerTests.cpp | 22 ++++ src/backends/backendsCommon/test/LayerTests.hpp | 12 ++ .../backendsCommon/test/QuantizeTestImpl.hpp | 126 +++++++++++++++++++++ src/backends/reference/test/RefLayerTests.cpp | 5 + 5 files changed, 166 insertions(+) create mode 100644 src/backends/backendsCommon/test/QuantizeTestImpl.hpp (limited to 'src/backends') diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt index 47d52312b6..bc190dd818 100644 --- a/src/backends/backendsCommon/test/CMakeLists.txt +++ b/src/backends/backendsCommon/test/CMakeLists.txt @@ -34,6 +34,7 @@ list(APPEND armnnBackendsCommonUnitTests_sources PermuteTestImpl.hpp Pooling2dTestImpl.hpp QuantizeHelper.hpp + QuantizeTestImpl.hpp ReshapeTestImpl.hpp RuntimeTestImpl.hpp SoftmaxTestImpl.hpp diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index be1d43541c..e8fb84f534 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -44,6 +44,7 @@ #include "ConvertFp32ToFp16TestImpl.hpp" #include "DebugTestImpl.hpp" #include "DequantizeTestImpl.hpp" +#include "QuantizeTestImpl.hpp" // 3-channel 16x8 image used as common input data for a number of Conv2d tests. static std::vector ConvInput3x8x16({ @@ -8977,3 +8978,24 @@ LayerTestResult DequantizeUint8Test( { return DequantizeSimpleTest(workloadFactory, memoryManager); } + +LayerTestResult QuantizeSimpleUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return QuantizeSimpleTest(workloadFactory, memoryManager); +} + +LayerTestResult QuantizeClampUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return QuantizeClampTest(workloadFactory, memoryManager); +} + +LayerTestResult QuantizeClampInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return QuantizeClampTest(workloadFactory, memoryManager); +} diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index c14ba7b35f..b9f73a4717 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -1443,3 +1443,15 @@ LayerTestResult GatherMultiDimParamsMultiDimIndicesUint8Test( LayerTestResult DequantizeUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult QuantizeSimpleUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult QuantizeClampUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult QuantizeClampInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/backendsCommon/test/QuantizeTestImpl.hpp b/src/backends/backendsCommon/test/QuantizeTestImpl.hpp new file mode 100644 index 0000000000..fee68f073e --- /dev/null +++ b/src/backends/backendsCommon/test/QuantizeTestImpl.hpp @@ -0,0 +1,126 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "WorkloadTestUtils.hpp" + +#include + +#include +#include +#include + +#include +#include +#include + + +namespace +{ + +template +LayerTestResult QuantizeTestImpl( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::TensorInfo& inputTensorInfo, + const armnn::TensorInfo& outputTensorInfo, + const std::vector& inputData, + const std::vector& expectedOutputData, + armnn::QuantizeQueueDescriptor descriptor) +{ + boost::multi_array input = MakeTensor(inputTensorInfo, inputData); + + LayerTestResult ret(outputTensorInfo); + ret.outputExpected = MakeTensor(outputTensorInfo, expectedOutputData); + + std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); + std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); + + armnn::WorkloadInfo info; + AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get()); + AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get()); + + std::unique_ptr workload = workloadFactory.CreateQuantize(descriptor, info); + + inputHandle->Allocate(); + outputHandle->Allocate(); + + CopyDataToITensorHandle(inputHandle.get(), input.data()); + + ExecuteWorkload(*workload, memoryManager); + + CopyDataFromITensorHandle(ret.output.data(), outputHandle.get()); + + return ret; +} + +template > +LayerTestResult QuantizeSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::QuantizeQueueDescriptor desc; + + const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32); + const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType, 0.5f, 1); + + std::vector inputData = std::vector( + { + 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, + 10.0f, 11.0f, 12.0f, + }); + + std::vector expectedOutputData = std::vector( + { + 3, 5, 7, + 9, 11, 13, + 15, 17, 19, + 21, 23, 25, + }); + + return QuantizeTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + inputData, + expectedOutputData, + desc); +} + +template > +LayerTestResult QuantizeClampTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + armnn::QuantizeQueueDescriptor desc; + + const armnn::TensorInfo inputTensorInfo({1, 1, 2, 1}, armnn::DataType::Float32); + const armnn::TensorInfo outputTensorInfo({1, 1, 2, 1}, ArmnnOutputType, 0.0001f, 0); + + const T max = std::numeric_limits::max(); + const T min = std::numeric_limits::lowest(); + + std::vector inputData = std::vector( + { + -100.0f, 100.0f + }); + + std::vector expectedOutputData = std::vector( + { + min, max + }); + + return QuantizeTestImpl(workloadFactory, + memoryManager, + inputTensorInfo, + outputTensorInfo, + inputData, + expectedOutputData, + desc); +} + +} // anonymous namespace diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index c0e2e785da..5149b9f132 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -533,4 +533,9 @@ BOOST_AUTO_TEST_CASE(DetectionPostProcessFastNmsUint8) // Dequantize ARMNN_AUTO_TEST_CASE(DequantizeUint8, DequantizeUint8Test) +// Quantize +ARMNN_AUTO_TEST_CASE(QuantizeSimpleUint8, QuantizeSimpleUint8Test) +ARMNN_AUTO_TEST_CASE(QuantizeClampUint8, QuantizeClampUint8Test) +ARMNN_AUTO_TEST_CASE(QuantizeClampInt16, QuantizeClampInt16Test) + BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1