blob: 8cc3a26bd8ce9abf12d03f8c4bb141449bf2999f [file] [log] [blame]
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
7#include "QuantizeHelper.hpp"
8
9#include <armnn/ArmNN.hpp>
10
Matteo Martincighe011d202019-11-28 11:35:47 +000011#include <armnnUtils/Permute.hpp>
12
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010013#include <QuantizeHelper.hpp>
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +010014#include <ResolveType.hpp>
15
16#include <backendsCommon/test/CommonTestUtils.hpp>
17
18#include <boost/test/unit_test.hpp>
19
20#include <map>
21#include <vector>
22
23namespace
24{
25
26armnn::INetworkPtr CreateResizeNetwork(const armnn::ResizeDescriptor& descriptor,
27 const armnn::TensorInfo& inputInfo,
28 const armnn::TensorInfo& outputInfo)
29{
30 using namespace armnn;
31
32 INetworkPtr network(INetwork::Create());
33 IConnectableLayer* input = network->AddInputLayer(0, "input");
34 IConnectableLayer* resize = network->AddResizeLayer(descriptor, "resize");
35 IConnectableLayer* output = network->AddOutputLayer(0, "output");
36
37 Connect(input, resize, inputInfo, 0, 0);
38 Connect(resize, output, outputInfo, 0, 0);
39
40 return network;
41}
42
43template<armnn::DataType ArmnnType>
44void ResizeEndToEnd(const std::vector<armnn::BackendId>& backends,
45 armnn::DataLayout dataLayout,
46 armnn::ResizeMethod resizeMethod)
47{
48 using namespace armnn;
49 using T = ResolveType<ArmnnType>;
50
51 constexpr unsigned int inputWidth = 3u;
52 constexpr unsigned int inputHeight = inputWidth;
53
54 constexpr unsigned int outputWidth = 5u;
55 constexpr unsigned int outputHeight = outputWidth;
56
57 TensorShape inputShape = MakeTensorShape(1, 1, inputHeight, inputWidth, dataLayout);
58 TensorShape outputShape = MakeTensorShape(1, 1, outputHeight, outputWidth, dataLayout);
59
60 const float qScale = IsQuantizedType<T>() ? 0.25f : 1.0f;
61 const int32_t qOffset = IsQuantizedType<T>() ? 50 : 0;
62
63 TensorInfo inputInfo(inputShape, ArmnnType, qScale, qOffset);
64 TensorInfo outputInfo(outputShape, ArmnnType, qScale, qOffset);
65
66 std::vector<float> inputData =
67 {
68 1.f, 2.f, 3.f,
69 4.f, 5.f, 6.f,
70 7.f, 8.f, 9.f
71 };
72
73 std::vector<float> expectedOutputData;
74 switch(resizeMethod)
75 {
76 case ResizeMethod::Bilinear:
77 {
78 expectedOutputData =
79 {
80 1.0f, 1.6f, 2.2f, 2.8f, 3.0f,
81 2.8f, 3.4f, 4.0f, 4.6f, 4.8f,
82 4.6f, 5.2f, 5.8f, 6.4f, 6.6f,
83 6.4f, 7.0f, 7.6f, 8.2f, 8.4f,
84 7.0f, 7.6f, 8.2f, 8.8f, 9.0f
85 };
86 break;
87 }
88 case ResizeMethod::NearestNeighbor:
89 {
90 expectedOutputData =
91 {
92 1.f, 1.f, 2.f, 2.f, 3.f,
93 1.f, 1.f, 2.f, 2.f, 3.f,
94 4.f, 4.f, 5.f, 5.f, 6.f,
95 4.f, 4.f, 5.f, 5.f, 6.f,
96 7.f, 7.f, 8.f, 8.f, 9.f
97 };
98 break;
99 }
100 default:
101 {
102 throw InvalidArgumentException("Unrecognized resize method");
103 }
104 }
105
106 ResizeDescriptor descriptor;
107 descriptor.m_TargetWidth = outputWidth;
108 descriptor.m_TargetHeight = outputHeight;
109 descriptor.m_Method = resizeMethod;
110 descriptor.m_DataLayout = dataLayout;
111
112 // swizzle data if needed
113 if (dataLayout == armnn::DataLayout::NHWC)
114 {
115 constexpr size_t dataTypeSize = sizeof(float);
116 const armnn::PermutationVector nchwToNhwc = { 0, 3, 1, 2 };
117
118 std::vector<float> tmp(inputData.size());
119 armnnUtils::Permute(inputInfo.GetShape(), nchwToNhwc, inputData.data(), tmp.data(), dataTypeSize);
120 inputData = tmp;
121 }
122
123 // quantize data
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100124 std::vector<T> qInputData = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
125 std::vector<T> qExpectedOutputData = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
Aron Virginas-Tarfe15eff2019-07-01 16:12:58 +0100126
127 INetworkPtr network = CreateResizeNetwork(descriptor, inputInfo, outputInfo);
128
129 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
130 { { 0, qInputData } },
131 { { 0, qExpectedOutputData } },
132 backends);
133}
134
135} // anonymous namespace
136
137template<armnn::DataType ArmnnType>
138void ResizeBilinearEndToEnd(const std::vector<armnn::BackendId>& backends,
139 armnn::DataLayout dataLayout)
140{
141 ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::Bilinear);
142}
143
144template<armnn::DataType ArmnnType>
145void ResizeNearestNeighborEndToEnd(const std::vector<armnn::BackendId>& backends,
146 armnn::DataLayout dataLayout)
147{
148 ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::NearestNeighbor);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100149}