From edeeb168c6d2612d5b934158bf18c35c843dfc3e Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Fri, 14 Jun 2019 11:09:19 +0100 Subject: IVGCVSW-3264 Add Unit Test for Dilated Convolution2d to armnn Signed-off-by: Teresa Charlin Change-Id: I60da1414ab41ea196cdebc27f0f014a502274fa8 --- .../backendsCommon/test/Conv2dTestImpl.hpp | 6 +- src/backends/backendsCommon/test/LayerTests.cpp | 351 ++++++++++++++++++--- src/backends/backendsCommon/test/LayerTests.hpp | 21 +- src/backends/reference/test/RefLayerTests.cpp | 50 +++ 4 files changed, 375 insertions(+), 53 deletions(-) diff --git a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp index 73b170e930..5f66d2ec85 100644 --- a/src/backends/backendsCommon/test/Conv2dTestImpl.hpp +++ b/src/backends/backendsCommon/test/Conv2dTestImpl.hpp @@ -88,7 +88,9 @@ LayerTestResult SimpleConvolution2dTestImpl( uint32_t padRight = 0, uint32_t padBottom = 0, uint32_t strideX = 1, - uint32_t strideY = 1) + uint32_t strideY = 1, + uint32_t dilationX = 1, + uint32_t dilationY = 1) { unsigned int inputHeight = boost::numeric_cast(originalInput.shape()[2]); unsigned int inputWidth = boost::numeric_cast(originalInput.shape()[3]); @@ -218,6 +220,8 @@ LayerTestResult SimpleConvolution2dTestImpl( data.m_Parameters.m_PadBottom = padBottom; data.m_Parameters.m_BiasEnabled = biasEnabled; data.m_Parameters.m_DataLayout = layout; + data.m_Parameters.m_DilationX = dilationX; + data.m_Parameters.m_DilationY = dilationY; std::unique_ptr workload = workloadFactory.CreateConvolution2d(data, info); inputHandle->Allocate(); diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 115b5ecf41..7f0c933f2b 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -582,6 +582,309 @@ LayerTestResult SimpleConvolution2dAsymmetricPaddingTestCommon( 2); // Padding bottom. } +LayerTestResult Convolution2dAsymmetricPaddingTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout layout) +{ + return SimpleConvolution2dAsymmetricPaddingTestCommon( + workloadFactory, memoryManager, layout, 0.0f, 0); +} + +LayerTestResult Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::DataLayout layout) +{ + return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon + ( + workloadFactory, memoryManager, layout, 0.0f, 0); +} + +LayerTestResult Convolution1dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled) +{ + return Convolution1dTestImpl( + workloadFactory, memoryManager, 0.0f, 0, biasEnabled); +} + +LayerTestResult Convolution1dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled) +{ + return Convolution1dTestImpl( + workloadFactory, memoryManager, 0.1f, 128, biasEnabled); +} + +LayerTestResult CompareConvolution2dTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + armnn::IWorkloadFactory& refWorkloadFactory) +{ + return CompareConvolution2dTestImpl( + workloadFactory, memoryManager, refWorkloadFactory); +} + +template> +LayerTestResult Convolution2d3x3DilationTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const std::vector& inputNoQuantizedValues, + armnn::TensorInfo& inputTensorInfo, + const std::vector& kernelNoQuantizedValues, + armnn::TensorInfo& kernelTensorInfo, + const std::vector& outputExpectedNoQuantizedValues, + armnn::TensorInfo& outputTensorInfo, + uint32_t dilationX, + uint32_t dilationY, + armnn::DataLayout layout = armnn::DataLayout::NCHW, + bool biasEnabled = false +) +{ + float qScale; + int32_t qOffset; + switch (ArmnnType) + { + case armnn::DataType::QuantisedAsymm8: + { + qScale = 0.1f; + qOffset = 128; + break; + } + case armnn::DataType::QuantisedSymm16: + { + qScale = 0.1f; + qOffset = 0; + break; + } + case armnn::DataType::Float32: + default: + { + qScale = 0.f; + qOffset = 0; + break; + } + } + + inputTensorInfo.SetQuantizationScale(qScale); + inputTensorInfo.SetQuantizationOffset(qOffset); + kernelTensorInfo.SetQuantizationScale(qScale); + kernelTensorInfo.SetQuantizationOffset(qOffset); + outputTensorInfo.SetQuantizationScale(qScale); + outputTensorInfo.SetQuantizationOffset(qOffset); + + auto input = MakeTensor(inputTensorInfo, + std::vector(QuantizedVector(inputTensorInfo.GetQuantizationScale(), + inputTensorInfo.GetQuantizationOffset(), + inputNoQuantizedValues))); + auto kernel = MakeTensor(kernelTensorInfo, + std::vector(QuantizedVector(kernelTensorInfo.GetQuantizationScale(), + kernelTensorInfo.GetQuantizationOffset(), + kernelNoQuantizedValues))); + auto expectedOutput = MakeTensor(outputTensorInfo, + std::vector(QuantizedVector(outputTensorInfo.GetQuantizationScale(), + outputTensorInfo.GetQuantizationOffset(), + outputExpectedNoQuantizedValues))); + + uint32_t padLeft = 0; + uint32_t padTop = 0; + uint32_t padRight = 0; + uint32_t padBottom = 0; + uint32_t strideX = 1; + uint32_t strideY = 1; + + return SimpleConvolution2dTestImpl( + workloadFactory, + memoryManager, + input, + kernel, + GetBias2(biasEnabled, qScale * qScale), + expectedOutput, + qScale, + qOffset, + layout, + padLeft, + padTop, + padRight, + padBottom, + strideX, + strideY, + dilationX, + dilationY); +} + +template +LayerTestResult Convolution2d3x3Dilation3x3Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout) +{ + armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType); + std::vector inputNoQuantizedValues = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType); + std::vector kernelNoQuantizedValues = + { + 1, 2, 3, + 4, 5, 6, + 7, 8, 9 + }; + + // Since the dilation rate is 3 this will dilate the kernel to be like 7x7, + // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1 + armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType); + std::vector outputExpectedNoQuantizedValues = + { + 6., 5., 5., 5., + 6., 5., 5., 5., + 6., 5., 5., 5., + 3., 2., 2., 2. + }; + + return Convolution2d3x3DilationTestCommon( + workloadFactory, + memoryManager, + inputNoQuantizedValues, + inputTensorInfo, + kernelNoQuantizedValues, + kernelTensorInfo, + outputExpectedNoQuantizedValues, + outputTensorInfo, + 3, + 3, + layout, + biasEnabled); +} + +template +LayerTestResult Convolution2d2x3x3Dilation3x3Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout) +{ + armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType); + std::vector inputNoQuantizedValues = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType); + std::vector kernelNoQuantizedValues = + { + 1, 2, 3, + 4, 5, 6, + 7, 8, 9, + + 1, 2, 3, + 4, 5, 6, + 7, 8, 9 + }; + + // Since the dilation rate is 3 this will dilate the kernel to be like 7x7, + // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1 + armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType); + std::vector outputExpectedNoQuantizedValues = + { + 12., 10., 10., 10., + 12., 10., 10., 10., + 12., 10., 10., 10., + 6., 4., 4., 4. + }; + + return Convolution2d3x3DilationTestCommon( + workloadFactory, + memoryManager, + inputNoQuantizedValues, + inputTensorInfo, + kernelNoQuantizedValues, + kernelTensorInfo, + outputExpectedNoQuantizedValues, + outputTensorInfo, + 3, + 3, + layout, + biasEnabled); +} + +template LayerTestResult, 4> +Convolution2d3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + +template LayerTestResult, 4> +Convolution2d3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + +template LayerTestResult, 4> +Convolution2d3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + +template LayerTestResult, 4> +Convolution2d2x3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + +template LayerTestResult, 4> +Convolution2d2x3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + +template LayerTestResult, 4> +Convolution2d2x3x3Dilation3x3Test( + armnn::IWorkloadFactory&, + const armnn::IBackendInternal::IMemoryManagerSharedPtr&, + bool, + armnn::DataLayout); + template> LayerTestResult DepthwiseConvolution2dAsymmetricTestCommon( @@ -833,27 +1136,6 @@ LayerTestResult SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon( strideY, dilationX, dilationY); - -} - -LayerTestResult -Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - const armnn::DataLayout layout) -{ - return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon - ( - workloadFactory, memoryManager, layout, 0.0f, 0); -} - -LayerTestResult Convolution2dAsymmetricPaddingTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - const armnn::DataLayout layout) -{ - return SimpleConvolution2dAsymmetricPaddingTestCommon( - workloadFactory, memoryManager, layout, 0.0f, 0); } LayerTestResult DepthwiseConvolution2dTest( @@ -947,33 +1229,6 @@ LayerTestResult DepthwiseConvolution2dDepthMul1Int16Test( workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout); } -LayerTestResult Convolution1dTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - bool biasEnabled) -{ - return Convolution1dTestImpl( - workloadFactory, memoryManager, 0.0f, 0, biasEnabled); -} - -LayerTestResult Convolution1dUint8Test( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - bool biasEnabled) -{ - return Convolution1dTestImpl( - workloadFactory, memoryManager, 0.1f, 128, biasEnabled); -} - -LayerTestResult CompareConvolution2dTest( - armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - armnn::IWorkloadFactory& refWorkloadFactory) -{ - return CompareConvolution2dTestImpl( - workloadFactory, memoryManager, refWorkloadFactory); -} - LayerTestResult CompareDepthwiseConvolution2dFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 4c340447b9..f3d707cf57 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -87,16 +87,15 @@ LayerTestResult SimpleConvolution2d3x3NhwcTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, bool biasEnabled); -LayerTestResult -Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest( +LayerTestResult Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - const armnn::DataLayout layout); + armnn::DataLayout layout); LayerTestResult Convolution2dAsymmetricPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - const armnn::DataLayout layout); + armnn::DataLayout layout); LayerTestResult Convolution1dTest( armnn::IWorkloadFactory& workloadFactory, @@ -114,6 +113,20 @@ LayerTestResult DepthwiseConvolution2dTest( bool biasEnabled, const armnn::DataLayout layout); +template> +LayerTestResult Convolution2d3x3Dilation3x3Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout); + +template> +LayerTestResult Convolution2d2x3x3Dilation3x3Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + bool biasEnabled, + const armnn::DataLayout layout); + LayerTestResult DepthwiseConvolution2dDepthNhwcTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index cf4d9fd6f9..a45c248ce6 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -68,6 +68,56 @@ ARMNN_AUTO_TEST_CASE(SimpleConvolution2dAsymmetricPaddingNhwc, ARMNN_AUTO_TEST_CASE(SimpleConvolution2dSquareNhwc, SimpleConvolution2d3x3NhwcTest, false) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3Nhwc, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3Uint8, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3NhwcUint8, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3Int16, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d3x3Dilation3x3NhwcInt16, + Convolution2d3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) + +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3Nhwc, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3Uint8, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3NhwcUint8, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3Int16, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(Convolution2d2x3x3Dilation3x3NhwcInt16, + Convolution2d2x3x3Dilation3x3Test, + false, + armnn::DataLayout::NHWC) + // Depthwise Convolution ARMNN_AUTO_TEST_CASE(DepthwiseConvolution2d, DepthwiseConvolution2dTest, true, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(DepthwiseConvolution2dUint8, DepthwiseConvolution2dUint8Test, true, armnn::DataLayout::NCHW) -- cgit v1.2.1