blob: 071daa7a3199ca54f1f7f91e746ef9421a9fa455 [file] [log] [blame]
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +01001//
Teresa Charlince655882023-11-21 15:44:13 +00002// Copyright © 2017, 2019-2023 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +01003// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Matteo Martincighe011d202019-11-28 11:35:47 +00007#include <armnnUtils/Permute.hpp>
8
Colm Donelanc42a9872022-02-02 16:35:09 +00009#include <armnnUtils/QuantizeHelper.hpp>
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010010#include <ResolveType.hpp>
11
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <CommonTestUtils.hpp>
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010013
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010014#include <map>
15#include <vector>
16
17namespace
18{
19
20armnn::INetworkPtr CreateResizeNetwork(const armnn::ResizeDescriptor& descriptor,
21 const armnn::TensorInfo& inputInfo,
22 const armnn::TensorInfo& outputInfo)
23{
24 using namespace armnn;
25
26 INetworkPtr network(INetwork::Create());
27 IConnectableLayer* input = network->AddInputLayer(0, "input");
28 IConnectableLayer* resize = network->AddResizeLayer(descriptor, "resize");
29 IConnectableLayer* output = network->AddOutputLayer(0, "output");
30
31 Connect(input, resize, inputInfo, 0, 0);
32 Connect(resize, output, outputInfo, 0, 0);
33
34 return network;
35}
36
37template<armnn::DataType ArmnnType>
38void ResizeEndToEnd(const std::vector<armnn::BackendId>& backends,
39 armnn::DataLayout dataLayout,
Teresa Charlince655882023-11-21 15:44:13 +000040 armnn::ResizeMethod resizeMethod,
41 bool alignCorners = false,
42 bool halfPixel = false)
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010043{
44 using namespace armnn;
45 using T = ResolveType<ArmnnType>;
46
47 constexpr unsigned int inputWidth = 3u;
48 constexpr unsigned int inputHeight = inputWidth;
49
50 constexpr unsigned int outputWidth = 5u;
51 constexpr unsigned int outputHeight = outputWidth;
52
53 TensorShape inputShape = MakeTensorShape(1, 1, inputHeight, inputWidth, dataLayout);
54 TensorShape outputShape = MakeTensorShape(1, 1, outputHeight, outputWidth, dataLayout);
55
56 const float qScale = IsQuantizedType<T>() ? 0.25f : 1.0f;
57 const int32_t qOffset = IsQuantizedType<T>() ? 50 : 0;
58
Cathal Corbett5b8093c2021-10-22 11:12:07 +010059 TensorInfo inputInfo(inputShape, ArmnnType, qScale, qOffset, true);
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010060 TensorInfo outputInfo(outputShape, ArmnnType, qScale, qOffset);
61
62 std::vector<float> inputData =
63 {
64 1.f, 2.f, 3.f,
65 4.f, 5.f, 6.f,
66 7.f, 8.f, 9.f
67 };
68
Teresa Charlince655882023-11-21 15:44:13 +000069 if (alignCorners && halfPixel)
70 {
71 throw InvalidArgumentException("alignCorners and halfPixel cannot be true simultaneously ");
72 }
73
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010074 std::vector<float> expectedOutputData;
75 switch(resizeMethod)
76 {
77 case ResizeMethod::Bilinear:
78 {
79 expectedOutputData =
80 {
81 1.0f, 1.6f, 2.2f, 2.8f, 3.0f,
82 2.8f, 3.4f, 4.0f, 4.6f, 4.8f,
83 4.6f, 5.2f, 5.8f, 6.4f, 6.6f,
84 6.4f, 7.0f, 7.6f, 8.2f, 8.4f,
85 7.0f, 7.6f, 8.2f, 8.8f, 9.0f
86 };
87 break;
88 }
89 case ResizeMethod::NearestNeighbor:
90 {
Teresa Charlince655882023-11-21 15:44:13 +000091 if (alignCorners)
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010092 {
Teresa Charlince655882023-11-21 15:44:13 +000093 expectedOutputData =
94 {
95 1.f, 2.f, 2.f, 3.f, 3.f,
96 4.f, 5.f, 5.f, 6.f, 6.f,
97 4.f, 5.f, 5.f, 6.f, 6.f,
98 7.f, 8.f, 8.f, 9.f, 9.f,
99 7.f, 8.f, 8.f, 9.f, 9.f
100 };
101 }
102 else
103 {
104 if (halfPixel)
105 {
106 expectedOutputData =
107 {
108 1.f, 1.f, 2.f, 3.f, 3.f,
109 1.f, 1.f, 2.f, 3.f, 3.f,
110 4.f, 4.f, 5.f, 6.f, 6.f,
111 7.f, 7.f, 8.f, 9.f, 9.f,
112 7.f, 7.f, 8.f, 9.f, 9.f
113 };
114 }
115 else
116 {
117 expectedOutputData =
118 {
119 1.f, 1.f, 2.f, 2.f, 3.f,
120 1.f, 1.f, 2.f, 2.f, 3.f,
121 4.f, 4.f, 5.f, 5.f, 6.f,
122 4.f, 4.f, 5.f, 5.f, 6.f,
123 7.f, 7.f, 8.f, 8.f, 9.f
124 };
125 }
126 }
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +0100127 break;
128 }
129 default:
130 {
131 throw InvalidArgumentException("Unrecognized resize method");
132 }
133 }
134
135 ResizeDescriptor descriptor;
136 descriptor.m_TargetWidth = outputWidth;
137 descriptor.m_TargetHeight = outputHeight;
138 descriptor.m_Method = resizeMethod;
139 descriptor.m_DataLayout = dataLayout;
Teresa Charlince655882023-11-21 15:44:13 +0000140 descriptor.m_AlignCorners = alignCorners;
141 descriptor.m_HalfPixelCenters = halfPixel;
142
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +0100143
144 // swizzle data if needed
145 if (dataLayout == armnn::DataLayout::NHWC)
146 {
147 constexpr size_t dataTypeSize = sizeof(float);
148 const armnn::PermutationVector nchwToNhwc = { 0, 3, 1, 2 };
149
150 std::vector<float> tmp(inputData.size());
151 armnnUtils::Permute(inputInfo.GetShape(), nchwToNhwc, inputData.data(), tmp.data(), dataTypeSize);
152 inputData = tmp;
153 }
154
155 // quantize data
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100156 std::vector<T> qInputData = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
157 std::vector<T> qExpectedOutputData = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +0100158
159 INetworkPtr network = CreateResizeNetwork(descriptor, inputInfo, outputInfo);
160
161 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
162 { { 0, qInputData } },
163 { { 0, qExpectedOutputData } },
164 backends);
165}
166
167} // anonymous namespace
168
169template<armnn::DataType ArmnnType>
170void ResizeBilinearEndToEnd(const std::vector<armnn::BackendId>& backends,
171 armnn::DataLayout dataLayout)
172{
173 ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::Bilinear);
174}
175
176template<armnn::DataType ArmnnType>
177void ResizeNearestNeighborEndToEnd(const std::vector<armnn::BackendId>& backends,
Teresa Charlince655882023-11-21 15:44:13 +0000178 armnn::DataLayout dataLayout,
179 bool alignCorners = false,
180 bool halfPixel = false)
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +0100181{
Teresa Charlince655882023-11-21 15:44:13 +0000182 ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::NearestNeighbor, alignCorners, halfPixel);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100183}