blob: c89e586f034ffefe59c03f22907e90c99967ee0f [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <backendsCommon/test/EndToEndTestImpl.hpp>
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +00007
8#include <backendsCommon/test/DetectionPostProcessTestImpl.hpp>
narpra01db2b1602019-01-23 15:23:11 +00009#include <backendsCommon/test/GatherEndToEndTestImpl.hpp>
narpra01b9546cf2018-11-20 15:21:28 +000010#include <backendsCommon/test/MergerTestImpl.hpp>
FrancisMurtagh2262bbd2018-12-20 16:09:45 +000011#include <backendsCommon/test/ArithmeticTestImpl.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010012
13#include <boost/test/unit_test.hpp>
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000014#include <boost/test/execution_monitor.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010015
16BOOST_AUTO_TEST_SUITE(RefEndToEnd)
17
narpra01b9546cf2018-11-20 15:21:28 +000018std::vector<armnn::BackendId> defaultBackends = {armnn::Compute::CpuRef};
19
Aron Virginas-Tar70104002018-10-24 15:33:28 +010020BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Float32)
21{
narpra01b9546cf2018-11-20 15:21:28 +000022 BOOST_TEST(ConstantUsageFloat32Test(defaultBackends));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010023}
24
25BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Uint8)
26{
narpra01b9546cf2018-11-20 15:21:28 +000027 BOOST_TEST(ConstantUsageUint8Test(defaultBackends));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010028}
29
30BOOST_AUTO_TEST_CASE(Unsigned8)
31{
32 using namespace armnn;
33
34 // Create runtime in which test will run
35 armnn::IRuntime::CreationOptions options;
36 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
37
38 // Builds up the structure of the network.
39 armnn::INetworkPtr net(INetwork::Create());
40
41 IConnectableLayer* input = net->AddInputLayer(0, "input");
42 IConnectableLayer* softmax = net->AddSoftmaxLayer(SoftmaxDescriptor(), "softmax");
43 IConnectableLayer* output = net->AddOutputLayer(0, "output");
44
45 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
46 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
47
48 // Sets the tensors in the network.
49 TensorInfo inputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8);
50 inputTensorInfo.SetQuantizationOffset(100);
51 inputTensorInfo.SetQuantizationScale(10000.0f);
52 input->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
53
54 TensorInfo outputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8);
55 outputTensorInfo.SetQuantizationOffset(0);
56 outputTensorInfo.SetQuantizationScale(1.0f/255.0f);
57 softmax->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
58
59 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +000060 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +010061
62 // Loads it into the runtime.
63 NetworkId netId;
64 auto error = runtime->LoadNetwork(netId, std::move(optNet));
65 BOOST_TEST(error == Status::Success);
66
67 // Creates structures for input & output.
68 std::vector<uint8_t> inputData
69 {
70 1, 10, 3, 200, 5 // Some inputs - one of which is sufficiently larger than the others to saturate softmax.
71 };
72 std::vector<uint8_t> outputData(5);
73
74 armnn::InputTensors inputTensors
75 {
76 {0, armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())}
77 };
78 armnn::OutputTensors outputTensors
79 {
80 {0, armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
81 };
82
83 // Does the inference.
84 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
85
86 // Checks the results.
87 BOOST_TEST(outputData[0] == 0);
88 BOOST_TEST(outputData[1] == 0);
89 BOOST_TEST(outputData[2] == 0);
90 BOOST_TEST(outputData[3] == 255); // softmax has been saturated.
91 BOOST_TEST(outputData[4] == 0);
92}
93
94BOOST_AUTO_TEST_CASE(TrivialAdd)
95{
96 // This test was designed to match "AddTwo" in android nn/runtime/test/TestTrivialModel.cpp.
97
98 using namespace armnn;
99
100 // Create runtime in which test will run
101 armnn::IRuntime::CreationOptions options;
102 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
103
104 // Builds up the structure of the network.
105 armnn::INetworkPtr net(INetwork::Create());
106
107 IConnectableLayer* input1 = net->AddInputLayer(0);
108 IConnectableLayer* input2 = net->AddInputLayer(1);
109 IConnectableLayer* add = net->AddAdditionLayer();
110 IConnectableLayer* output = net->AddOutputLayer(0);
111
112 input1->GetOutputSlot(0).Connect(add->GetInputSlot(0));
113 input2->GetOutputSlot(0).Connect(add->GetInputSlot(1));
114 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
115
116 // Sets the tensors in the network.
117 TensorInfo tensorInfo(TensorShape({3, 4}), DataType::Float32);
118 input1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
119 input2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
120 add->GetOutputSlot(0).SetTensorInfo(tensorInfo);
121
122 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +0000123 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100124
125 // Loads it into the runtime.
126 NetworkId netId;
127 runtime->LoadNetwork(netId, std::move(optNet));
128
129 // Creates structures for input & output - matching android nn test.
130 std::vector<float> input1Data
131 {
132 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f
133 };
134 std::vector<float> input2Data
135 {
136 100.f, 200.f, 300.f, 400.f, 500.f, 600.f, 700.f, 800.f, 900.f, 1000.f, 1100.f, 1200.f
137 };
138 std::vector<float> outputData(12);
139
140 InputTensors inputTensors
141 {
142 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input1Data.data())},
143 {1,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input2Data.data())}
144 };
145 OutputTensors outputTensors
146 {
147 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
148 };
149
150 // Does the inference.
151 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
152
153 // Checks the results
154 BOOST_TEST(outputData[0] == 101);
155 BOOST_TEST(outputData[1] == 202);
156 BOOST_TEST(outputData[2] == 303);
157 BOOST_TEST(outputData[3] == 404);
158 BOOST_TEST(outputData[4] == 505);
159 BOOST_TEST(outputData[5] == 606);
160 BOOST_TEST(outputData[6] == 707);
161 BOOST_TEST(outputData[7] == 808);
162 BOOST_TEST(outputData[8] == 909);
163 BOOST_TEST(outputData[9] == 1010);
164 BOOST_TEST(outputData[10] == 1111);
165 BOOST_TEST(outputData[11] == 1212);
166}
167
168BOOST_AUTO_TEST_CASE(MultipleOutputs)
169{
170 using namespace armnn;
171
172 // Create runtime in which test will run
173 armnn::IRuntime::CreationOptions options;
174 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
175
176 // Builds up the structure of the network.
177 INetworkPtr net(INetwork::Create());
178
179 IConnectableLayer* input = net->AddInputLayer(0);
180
181 // ReLu1
182 ActivationDescriptor activation1Descriptor;
183 activation1Descriptor.m_Function = ActivationFunction::BoundedReLu;
184 activation1Descriptor.m_A = 1.f;
185 activation1Descriptor.m_B = -1.f;
186 IConnectableLayer* activation1 = net->AddActivationLayer(activation1Descriptor);
187
188 // ReLu6
189 ActivationDescriptor activation2Descriptor;
190 activation2Descriptor.m_Function = ActivationFunction::BoundedReLu;
191 activation2Descriptor.m_A = 6.0f;
192 IConnectableLayer* activation2 = net->AddActivationLayer(activation2Descriptor);
193
194 // BoundedReLu(min=2, max=5)
195 ActivationDescriptor activation3Descriptor;
196 activation3Descriptor.m_Function = ActivationFunction::BoundedReLu;
197 activation3Descriptor.m_A = 5.0f;
198 activation3Descriptor.m_B = 2.0f;
199 IConnectableLayer* activation3 = net->AddActivationLayer(activation3Descriptor);
200
201 IConnectableLayer* output1 = net->AddOutputLayer(0);
202 IConnectableLayer* output2 = net->AddOutputLayer(1);
203 IConnectableLayer* output3 = net->AddOutputLayer(2);
204
205 input->GetOutputSlot(0).Connect(activation1->GetInputSlot(0));
206 input->GetOutputSlot(0).Connect(activation2->GetInputSlot(0));
207 input->GetOutputSlot(0).Connect(activation3->GetInputSlot(0));
208
209 activation1->GetOutputSlot(0).Connect(output1->GetInputSlot(0));
210 activation2->GetOutputSlot(0).Connect(output2->GetInputSlot(0));
211 activation3->GetOutputSlot(0).Connect(output3->GetInputSlot(0));
212
213 // Sets the tensors in the network.
214 TensorInfo tensorInfo(TensorShape({ 10 }), DataType::Float32);
215 input->GetOutputSlot(0).SetTensorInfo(tensorInfo);
216 activation1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
217 activation2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
218 activation3->GetOutputSlot(0).SetTensorInfo(tensorInfo);
219
220 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +0000221 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100222
223 // Loads it into the runtime.
224 NetworkId netId;
225 runtime->LoadNetwork(netId, std::move(optNet));
226
227 // Creates structures for input & output.
228 const std::vector<float> inputData{ 3.f, 5.f, 2.f, 3.f, 7.f, 0.f, -2.f, -1.f, 3.f, 3.f };
229
230 std::vector<float> output1Data(inputData.size());
231 std::vector<float> output2Data(inputData.size());
232 std::vector<float> output3Data(inputData.size());
233
234 InputTensors inputTensors
235 {
236 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())}
237 };
238 OutputTensors outputTensors
239 {
240 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), output1Data.data())},
241 {1,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 1), output2Data.data())},
242 {2,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 2), output3Data.data())}
243 };
244
245 // Does the inference.
246 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
247
248 // Checks the results.
249 BOOST_TEST(output1Data == std::vector<float>({ 1.f, 1.f, 1.f, 1.f, 1.f, 0.f, -1.f, -1.f, 1.f, 1.f })); // ReLu1
250 BOOST_TEST(output2Data == std::vector<float>({ 3.f, 5.f, 2.f, 3.f, 6.f, 0.f, 0.f, 0.f, 3.f, 3.f })); // ReLu6
251 BOOST_TEST(output3Data == std::vector<float>({ 3.f, 5.f, 2.f, 3.f, 5.f, 2.f, 2.f, 2.f, 3.f, 3.f })); // [2, 5]
252}
253
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000254BOOST_AUTO_TEST_CASE(TrivialMin)
255{
256 using namespace armnn;
257
258 // Create runtime in which test will run
259 armnn::IRuntime::CreationOptions options;
260 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
261
262 // Builds up the structure of the network.
263 armnn::INetworkPtr net(INetwork::Create());
264
265 IConnectableLayer* input1 = net->AddInputLayer(0);
266 IConnectableLayer* input2 = net->AddInputLayer(1);
267 IConnectableLayer* min = net->AddMinimumLayer();
268 IConnectableLayer* output = net->AddOutputLayer(0);
269
270 input1->GetOutputSlot(0).Connect(min->GetInputSlot(0));
271 input2->GetOutputSlot(0).Connect(min->GetInputSlot(1));
272 min->GetOutputSlot(0).Connect(output->GetInputSlot(0));
273
274 // Sets the tensors in the network.
275 TensorInfo tensorInfo(TensorShape({1, 1, 1, 4}), DataType::Float32);
276 input1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
277 input2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
278 min->GetOutputSlot(0).SetTensorInfo(tensorInfo);
279
280 // optimize the network
281 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
282
283 // Loads it into the runtime.
284 NetworkId netId;
285 runtime->LoadNetwork(netId, std::move(optNet));
286
287 // Creates structures for input & output - matching android nn test.
288 std::vector<float> input1Data
289 {
290 1.0f, 2.0f, 3.0f, 4.0f
291 };
292 std::vector<float> input2Data
293 {
294 2.0f, 1.0f, 5.0f, 2.0f
295 };
296 std::vector<float> outputData(4);
297
298 InputTensors inputTensors
299 {
300 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input1Data.data())},
301 {1,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input2Data.data())}
302 };
303 OutputTensors outputTensors
304 {
305 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
306 };
307
308 // Does the inference.
309 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
310
311 // Checks the results
312 BOOST_TEST(outputData[0] == 1);
313 BOOST_TEST(outputData[1] == 1);
314 BOOST_TEST(outputData[2] == 3);
315 BOOST_TEST(outputData[3] == 2);
316}
317
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000318BOOST_AUTO_TEST_CASE(RefEqualSimpleEndToEndTest)
319{
kevmay012b4d88e2019-01-24 14:05:09 +0000320 const std::vector<uint8_t> expectedOutput({ 1, 1, 1, 1, 0, 0, 0, 0,
321 0, 0, 0, 0, 1, 1, 1, 1 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000322
kevmay012b4d88e2019-01-24 14:05:09 +0000323 ArithmeticSimpleEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
324 LayerType::Equal,
325 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000326}
327
328BOOST_AUTO_TEST_CASE(RefGreaterSimpleEndToEndTest)
329{
kevmay012b4d88e2019-01-24 14:05:09 +0000330 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
331 0, 0, 0, 0, 0, 0, 0, 0 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000332
kevmay012b4d88e2019-01-24 14:05:09 +0000333 ArithmeticSimpleEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
334 LayerType::Greater,
335 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000336}
337
338BOOST_AUTO_TEST_CASE(RefEqualSimpleEndToEndUint8Test)
339{
340 const std::vector<uint8_t> expectedOutput({ 1, 1, 1, 1, 0, 0, 0, 0,
341 0, 0, 0, 0, 1, 1, 1, 1 });
342
kevmay012b4d88e2019-01-24 14:05:09 +0000343 ArithmeticSimpleEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
344 LayerType::Equal,
345 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000346}
347
348BOOST_AUTO_TEST_CASE(RefGreaterSimpleEndToEndUint8Test)
349{
350 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
351 0, 0, 0, 0, 0, 0, 0, 0 });
352
kevmay012b4d88e2019-01-24 14:05:09 +0000353 ArithmeticSimpleEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
354 LayerType::Greater,
355 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000356}
357
358BOOST_AUTO_TEST_CASE(RefEqualBroadcastEndToEndTest)
359{
kevmay012b4d88e2019-01-24 14:05:09 +0000360 const std::vector<uint8_t> expectedOutput({ 1, 0, 1, 1, 0, 0,
361 0, 0, 0, 0, 0, 0 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000362
kevmay012b4d88e2019-01-24 14:05:09 +0000363 ArithmeticBroadcastEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
364 LayerType::Equal,
365 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000366}
367
368BOOST_AUTO_TEST_CASE(RefGreaterBroadcastEndToEndTest)
369{
kevmay012b4d88e2019-01-24 14:05:09 +0000370 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
371 1, 1, 1, 1, 1, 1 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000372
kevmay012b4d88e2019-01-24 14:05:09 +0000373 ArithmeticBroadcastEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
374 LayerType::Greater,
375 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000376}
377
378BOOST_AUTO_TEST_CASE(RefEqualBroadcastEndToEndUint8Test)
379{
380 const std::vector<uint8_t > expectedOutput({ 1, 0, 1, 1, 0, 0,
381 0, 0, 0, 0, 0, 0 });
382
kevmay012b4d88e2019-01-24 14:05:09 +0000383 ArithmeticBroadcastEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
384 LayerType::Equal,
385 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000386}
387
388BOOST_AUTO_TEST_CASE(RefGreaterBroadcastEndToEndUint8Test)
389{
390 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
391 1, 1, 1, 1, 1, 1 });
392
kevmay012b4d88e2019-01-24 14:05:09 +0000393 ArithmeticBroadcastEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
394 LayerType::Greater,
395 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000396}
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000397
narpra01b9546cf2018-11-20 15:21:28 +0000398BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim0Test)
399{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000400 MergerDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000401}
402
403BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim0Uint8Test)
404{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000405 MergerDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000406}
407
408BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim1Test)
409{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000410 MergerDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000411}
412
413BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim1Uint8Test)
414{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000415 MergerDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000416}
417
418BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim2Test)
419{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000420 MergerDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000421}
422
423BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim2Uint8Test)
424{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000425 MergerDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000426}
427
428BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim3Test)
429{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000430 MergerDim3EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000431}
432
433BOOST_AUTO_TEST_CASE(RefMergerEndToEndDim3Uint8Test)
434{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000435 MergerDim3EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000436}
437
narpra01db2b1602019-01-23 15:23:11 +0000438BOOST_AUTO_TEST_CASE(RefGatherFloatTest)
439{
440 GatherEndToEnd<armnn::DataType::Float32>(defaultBackends);
441}
442
443BOOST_AUTO_TEST_CASE(RefGatherUint8Test)
444{
445 GatherEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
446}
447
448BOOST_AUTO_TEST_CASE(RefGatherMultiDimFloatTest)
449{
450 GatherMultiDimEndToEnd<armnn::DataType::Float32>(defaultBackends);
451}
452
453BOOST_AUTO_TEST_CASE(RefGatherMultiDimUint8Test)
454{
455 GatherMultiDimEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
456}
457
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +0000458BOOST_AUTO_TEST_CASE(RefDetectionPostProcessRegularNmsTest)
459{
460 std::vector<float> boxEncodings({
461 0.0f, 0.0f, 0.0f, 0.0f,
462 0.0f, 1.0f, 0.0f, 0.0f,
463 0.0f, -1.0f, 0.0f, 0.0f,
464 0.0f, 0.0f, 0.0f, 0.0f,
465 0.0f, 1.0f, 0.0f, 0.0f,
466 0.0f, 0.0f, 0.0f, 0.0f
467 });
468 std::vector<float> scores({
469 0.0f, 0.9f, 0.8f,
470 0.0f, 0.75f, 0.72f,
471 0.0f, 0.6f, 0.5f,
472 0.0f, 0.93f, 0.95f,
473 0.0f, 0.5f, 0.4f,
474 0.0f, 0.3f, 0.2f
475 });
476 std::vector<float> anchors({
477 0.5f, 0.5f, 1.0f, 1.0f,
478 0.5f, 0.5f, 1.0f, 1.0f,
479 0.5f, 0.5f, 1.0f, 1.0f,
480 0.5f, 10.5f, 1.0f, 1.0f,
481 0.5f, 10.5f, 1.0f, 1.0f,
482 0.5f, 100.5f, 1.0f, 1.0f
483 });
484 DetectionPostProcessRegularNmsEndToEnd<armnn::DataType::Float32>(defaultBackends, boxEncodings, scores, anchors);
485}
486
487inline void QuantizeData(uint8_t* quant, const float* dequant, const TensorInfo& info)
488{
489 for (size_t i = 0; i < info.GetNumElements(); i++)
490 {
491 quant[i] = armnn::Quantize<uint8_t>(dequant[i], info.GetQuantizationScale(), info.GetQuantizationOffset());
492 }
493}
494
495BOOST_AUTO_TEST_CASE(RefDetectionPostProcessRegularNmsUint8Test)
496{
497 armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32);
498 armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32);
499 armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
500
501 boxEncodingsInfo.SetQuantizationScale(1.0f);
502 boxEncodingsInfo.SetQuantizationOffset(1);
503 scoresInfo.SetQuantizationScale(0.01f);
504 scoresInfo.SetQuantizationOffset(0);
505 anchorsInfo.SetQuantizationScale(0.5f);
506 anchorsInfo.SetQuantizationOffset(0);
507
508 std::vector<float> boxEncodings({
509 0.0f, 0.0f, 0.0f, 0.0f,
510 0.0f, 1.0f, 0.0f, 0.0f,
511 0.0f, -1.0f, 0.0f, 0.0f,
512 0.0f, 0.0f, 0.0f, 0.0f,
513 0.0f, 1.0f, 0.0f, 0.0f,
514 0.0f, 0.0f, 0.0f, 0.0f
515 });
516 std::vector<float> scores({
517 0.0f, 0.9f, 0.8f,
518 0.0f, 0.75f, 0.72f,
519 0.0f, 0.6f, 0.5f,
520 0.0f, 0.93f, 0.95f,
521 0.0f, 0.5f, 0.4f,
522 0.0f, 0.3f, 0.2f
523 });
524 std::vector<float> anchors({
525 0.5f, 0.5f, 1.0f, 1.0f,
526 0.5f, 0.5f, 1.0f, 1.0f,
527 0.5f, 0.5f, 1.0f, 1.0f,
528 0.5f, 10.5f, 1.0f, 1.0f,
529 0.5f, 10.5f, 1.0f, 1.0f,
530 0.5f, 100.5f, 1.0f, 1.0f
531 });
532
533 std::vector<uint8_t> qBoxEncodings(boxEncodings.size(), 0);
534 std::vector<uint8_t> qScores(scores.size(), 0);
535 std::vector<uint8_t> qAnchors(anchors.size(), 0);
536 QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo);
537 QuantizeData(qScores.data(), scores.data(), scoresInfo);
538 QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo);
539 DetectionPostProcessRegularNmsEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, qBoxEncodings,
540 qScores, qAnchors,
541 1.0f, 1, 0.01f, 0, 0.5f, 0);
542}
543
544BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsTest)
545{
546 std::vector<float> boxEncodings({
547 0.0f, 0.0f, 0.0f, 0.0f,
548 0.0f, 1.0f, 0.0f, 0.0f,
549 0.0f, -1.0f, 0.0f, 0.0f,
550 0.0f, 0.0f, 0.0f, 0.0f,
551 0.0f, 1.0f, 0.0f, 0.0f,
552 0.0f, 0.0f, 0.0f, 0.0f
553 });
554 std::vector<float> scores({
555 0.0f, 0.9f, 0.8f,
556 0.0f, 0.75f, 0.72f,
557 0.0f, 0.6f, 0.5f,
558 0.0f, 0.93f, 0.95f,
559 0.0f, 0.5f, 0.4f,
560 0.0f, 0.3f, 0.2f
561 });
562 std::vector<float> anchors({
563 0.5f, 0.5f, 1.0f, 1.0f,
564 0.5f, 0.5f, 1.0f, 1.0f,
565 0.5f, 0.5f, 1.0f, 1.0f,
566 0.5f, 10.5f, 1.0f, 1.0f,
567 0.5f, 10.5f, 1.0f, 1.0f,
568 0.5f, 100.5f, 1.0f, 1.0f
569 });
570 DetectionPostProcessFastNmsEndToEnd<armnn::DataType::Float32>(defaultBackends, boxEncodings, scores, anchors);
571}
572
573BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsUint8Test)
574{
575 armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32);
576 armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32);
577 armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
578
579 boxEncodingsInfo.SetQuantizationScale(1.0f);
580 boxEncodingsInfo.SetQuantizationOffset(1);
581 scoresInfo.SetQuantizationScale(0.01f);
582 scoresInfo.SetQuantizationOffset(0);
583 anchorsInfo.SetQuantizationScale(0.5f);
584 anchorsInfo.SetQuantizationOffset(0);
585
586 std::vector<float> boxEncodings({
587 0.0f, 0.0f, 0.0f, 0.0f,
588 0.0f, 1.0f, 0.0f, 0.0f,
589 0.0f, -1.0f, 0.0f, 0.0f,
590 0.0f, 0.0f, 0.0f, 0.0f,
591 0.0f, 1.0f, 0.0f, 0.0f,
592 0.0f, 0.0f, 0.0f, 0.0f
593 });
594 std::vector<float> scores({
595 0.0f, 0.9f, 0.8f,
596 0.0f, 0.75f, 0.72f,
597 0.0f, 0.6f, 0.5f,
598 0.0f, 0.93f, 0.95f,
599 0.0f, 0.5f, 0.4f,
600 0.0f, 0.3f, 0.2f
601 });
602 std::vector<float> anchors({
603 0.5f, 0.5f, 1.0f, 1.0f,
604 0.5f, 0.5f, 1.0f, 1.0f,
605 0.5f, 0.5f, 1.0f, 1.0f,
606 0.5f, 10.5f, 1.0f, 1.0f,
607 0.5f, 10.5f, 1.0f, 1.0f,
608 0.5f, 100.5f, 1.0f, 1.0f
609 });
610
611 std::vector<uint8_t> qBoxEncodings(boxEncodings.size(), 0);
612 std::vector<uint8_t> qScores(scores.size(), 0);
613 std::vector<uint8_t> qAnchors(anchors.size(), 0);
614 QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo);
615 QuantizeData(qScores.data(), scores.data(), scoresInfo);
616 QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo);
617 DetectionPostProcessFastNmsEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, qBoxEncodings,
618 qScores, qAnchors,
619 1.0f, 1, 0.01f, 0, 0.5f, 0);
620}
621
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000622BOOST_AUTO_TEST_SUITE_END()