blob: bfad8e8381b4acbc4e2afb10a0e1cddffeef4511 [file] [log] [blame]
Manuel Bottini5209be52019-02-13 16:34:56 +00001/*
2 * Copyright (c) 2019 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/runtime/CL/CLScheduler.h"
25#include "arm_compute/runtime/CL/functions/CLComputeAllAnchors.h"
26#include "arm_compute/runtime/CL/functions/CLGenerateProposalsLayer.h"
27#include "arm_compute/runtime/CL/functions/CLPermute.h"
28#include "arm_compute/runtime/CL/functions/CLSlice.h"
29#include "tests/CL/CLAccessor.h"
30#include "tests/CL/CLArrayAccessor.h"
31#include "tests/Globals.h"
32#include "tests/framework/Macros.h"
33#include "tests/framework/datasets/Datasets.h"
34#include "tests/validation/Validation.h"
35#include "tests/validation/fixtures/ComputeAllAnchorsFixture.h"
36#include "utils/TypePrinter.h"
37
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
46template <typename U, typename T>
47inline void fill_tensor(U &&tensor, const std::vector<T> &v)
48{
49 std::memcpy(tensor.data(), v.data(), sizeof(T) * v.size());
50}
51
52template <typename T>
53inline void fill_tensor(CLAccessor &&tensor, const std::vector<T> &v)
54{
55 if(tensor.data_layout() == DataLayout::NCHW)
56 {
57 std::memcpy(tensor.data(), v.data(), sizeof(T) * v.size());
58 }
59 else
60 {
61 const int channels = tensor.shape()[0];
62 const int width = tensor.shape()[1];
63 const int height = tensor.shape()[2];
64 for(int x = 0; x < width; ++x)
65 {
66 for(int y = 0; y < height; ++y)
67 {
68 for(int c = 0; c < channels; ++c)
69 {
70 *(reinterpret_cast<T *>(tensor(Coordinates(c, x, y)))) = *(reinterpret_cast<const T *>(v.data() + x + y * width + c * height * width));
71 }
72 }
73 }
74 }
75}
76
77const auto ComputeAllInfoDataset = framework::dataset::make("ComputeAllInfo",
78{
79 ComputeAnchorsInfo(10U, 10U, 1. / 16.f),
80 ComputeAnchorsInfo(100U, 1U, 1. / 2.f),
81 ComputeAnchorsInfo(100U, 1U, 1. / 4.f),
82 ComputeAnchorsInfo(100U, 100U, 1. / 4.f),
83
84});
Michele Di Giorgio6b612f52019-09-05 12:30:22 +010085
86constexpr AbsoluteTolerance<int16_t> tolerance_qsymm16(1);
Manuel Bottini5209be52019-02-13 16:34:56 +000087} // namespace
88
89TEST_SUITE(CL)
90TEST_SUITE(GenerateProposals)
91
92// *INDENT-OFF*
93// clang-format off
94DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(zip(
95 framework::dataset::make("scores", { TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F32),
96 TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F16), // Mismatching types
97 TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F16), // Wrong deltas (number of transformation non multiple of 4)
98 TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F16), // Wrong anchors (number of values per roi != 5)
99 TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F16), // Output tensor num_valid_proposals not scalar
100 TensorInfo(TensorShape(100U, 100U, 9U), 1, DataType::F16)}), // num_valid_proposals not U32
101 framework::dataset::make("deltas",{ TensorInfo(TensorShape(100U, 100U, 36U), 1, DataType::F32),
102 TensorInfo(TensorShape(100U, 100U, 36U), 1, DataType::F32),
103 TensorInfo(TensorShape(100U, 100U, 38U), 1, DataType::F32),
104 TensorInfo(TensorShape(100U, 100U, 38U), 1, DataType::F32),
105 TensorInfo(TensorShape(100U, 100U, 38U), 1, DataType::F32),
106 TensorInfo(TensorShape(100U, 100U, 38U), 1, DataType::F32)})),
107 framework::dataset::make("anchors", { TensorInfo(TensorShape(4U, 9U), 1, DataType::F32),
108 TensorInfo(TensorShape(4U, 9U), 1, DataType::F32),
109 TensorInfo(TensorShape(4U, 9U), 1, DataType::F32),
110 TensorInfo(TensorShape(5U, 9U), 1, DataType::F32),
111 TensorInfo(TensorShape(4U, 9U), 1, DataType::F32),
112 TensorInfo(TensorShape(4U, 9U), 1, DataType::F32)})),
113 framework::dataset::make("proposals", { TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32),
114 TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32),
115 TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32),
116 TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32),
117 TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32),
118 TensorInfo(TensorShape(5U, 100U*100U*9U), 1, DataType::F32)})),
119 framework::dataset::make("scores_out", { TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32),
120 TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32),
121 TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32),
122 TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32),
123 TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32),
124 TensorInfo(TensorShape(100U*100U*9U), 1, DataType::F32)})),
125 framework::dataset::make("num_valid_proposals", { TensorInfo(TensorShape(1U, 1U), 1, DataType::U32),
126 TensorInfo(TensorShape(1U, 1U), 1, DataType::U32),
127 TensorInfo(TensorShape(1U, 1U), 1, DataType::U32),
128 TensorInfo(TensorShape(1U, 1U), 1, DataType::U32),
129 TensorInfo(TensorShape(1U, 10U), 1, DataType::U32),
130 TensorInfo(TensorShape(1U, 1U), 1, DataType::F16)})),
131 framework::dataset::make("generate_proposals_info", { GenerateProposalsInfo(10.f, 10.f, 1.f),
132 GenerateProposalsInfo(10.f, 10.f, 1.f),
133 GenerateProposalsInfo(10.f, 10.f, 1.f),
134 GenerateProposalsInfo(10.f, 10.f, 1.f),
135 GenerateProposalsInfo(10.f, 10.f, 1.f),
136 GenerateProposalsInfo(10.f, 10.f, 1.f)})),
137 framework::dataset::make("Expected", { true, false, false, false, false, false })),
138 scores, deltas, anchors, proposals, scores_out, num_valid_proposals, generate_proposals_info, expected)
139{
140 ARM_COMPUTE_EXPECT(bool(CLGenerateProposalsLayer::validate(&scores.clone()->set_is_resizable(true),
141 &deltas.clone()->set_is_resizable(true),
142 &anchors.clone()->set_is_resizable(true),
143 &proposals.clone()->set_is_resizable(true),
144 &scores_out.clone()->set_is_resizable(true),
145 &num_valid_proposals.clone()->set_is_resizable(true),
146 generate_proposals_info)) == expected, framework::LogLevel::ERRORS);
147}
148// clang-format on
149// *INDENT-ON*
150
151template <typename T>
152using CLComputeAllAnchorsFixture = ComputeAllAnchorsFixture<CLTensor, CLAccessor, CLComputeAllAnchors, T>;
153
154TEST_SUITE(Float)
155TEST_SUITE(FP32)
156DATA_TEST_CASE(IntegrationTestCaseAllAnchors, framework::DatasetMode::ALL, framework::dataset::make("DataType", { DataType::F32 }),
157 data_type)
158{
159 const int values_per_roi = 4;
160 const int num_anchors = 3;
161 const int feature_height = 4;
162 const int feature_width = 3;
163
164 SimpleTensor<float> anchors_expected(TensorShape(values_per_roi, feature_width * feature_height * num_anchors), DataType::F32);
165 fill_tensor(anchors_expected, std::vector<float> { -26, -19, 87, 86,
166 -81, -27, 58, 63,
167 -44, -15, 55, 36,
168 -10, -19, 103, 86,
169 -65, -27, 74, 63,
170 -28, -15, 71, 36,
171 6, -19, 119, 86,
172 -49, -27, 90, 63,
173 -12, -15, 87, 36,
174 -26, -3, 87, 102,
175 -81, -11, 58, 79,
176 -44, 1, 55, 52,
177 -10, -3, 103, 102,
178 -65, -11, 74, 79,
179 -28, 1, 71, 52,
180 6, -3, 119, 102,
181 -49, -11, 90, 79,
182 -12, 1, 87, 52,
183 -26, 13, 87, 118,
184 -81, 5, 58, 95,
185 -44, 17, 55, 68,
186 -10, 13, 103, 118,
187 -65, 5, 74, 95,
188 -28, 17, 71, 68,
189 6, 13, 119, 118,
190 -49, 5, 90, 95,
191 -12, 17, 87, 68,
192 -26, 29, 87, 134,
193 -81, 21, 58, 111,
194 -44, 33, 55, 84,
195 -10, 29, 103, 134,
196 -65, 21, 74, 111,
197 -28, 33, 71, 84,
198 6, 29, 119, 134,
199 -49, 21, 90, 111,
200 -12, 33, 87, 84
201 });
202
203 CLTensor all_anchors;
204 CLTensor anchors = create_tensor<CLTensor>(TensorShape(4, num_anchors), data_type);
205
206 // Create and configure function
207 CLComputeAllAnchors compute_anchors;
208 compute_anchors.configure(&anchors, &all_anchors, ComputeAnchorsInfo(feature_width, feature_height, 1. / 16.0));
209 anchors.allocator()->allocate();
210 all_anchors.allocator()->allocate();
211
212 fill_tensor(CLAccessor(anchors), std::vector<float> { -26, -19, 87, 86,
213 -81, -27, 58, 63,
214 -44, -15, 55, 36
215 });
216 // Compute function
217 compute_anchors.run();
218 validate(CLAccessor(all_anchors), anchors_expected);
219}
220
221DATA_TEST_CASE(IntegrationTestCaseGenerateProposals, framework::DatasetMode::ALL, combine(framework::dataset::make("DataType", { DataType::F32 }),
222 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
223 data_type, data_layout)
224{
225 const int values_per_roi = 4;
226 const int num_anchors = 2;
227 const int feature_height = 4;
228 const int feature_width = 5;
229
230 std::vector<float> scores_vector
231 {
232 5.055894435664012e-04f, 1.270304909820112e-03f, 2.492271113912067e-03f, 5.951663827809190e-03f,
233 7.846917156877404e-03f, 6.776275276294789e-03f, 6.761571012891965e-03f, 4.898292096237725e-03f,
234 6.044472332578605e-04f, 3.203334118759474e-03f, 2.947527908919908e-03f, 6.313238560015770e-03f,
235 7.931767757095738e-03f, 8.764345805102866e-03f, 7.325012199914913e-03f, 4.317069470446271e-03f,
236 2.372537409795522e-03f, 1.589227460352735e-03f, 7.419477503600818e-03f, 3.157690354133824e-05f,
237 1.125915135986472e-03f, 9.865363483872330e-03f, 2.429454743386769e-03f, 2.724460564167563e-03f,
238 7.670409838207963e-03f, 5.558891552328172e-03f, 7.876904873099614e-03f, 6.824746047239291e-03f,
239 7.023817548067892e-03f, 3.651314909238673e-04f, 6.720443709032501e-03f, 5.935615511606155e-03f,
240 2.837349642759774e-03f, 1.787235113610299e-03f, 4.538568889918262e-03f, 3.391510678188818e-03f,
241 7.328474239481874e-03f, 6.306967923936016e-03f, 8.102218904895860e-04f, 3.366646521610209e-03f
242 };
243
244 std::vector<float> bbx_vector
245 {
246 5.066650471856862e-03, -7.638671742936328e-03, 2.549596503988635e-03, -8.316416756423296e-03,
247 -2.397471917924575e-04, 7.370595187754891e-03, -2.771880178185262e-03, 3.958364873973579e-03,
248 4.493661094712284e-03, 2.016487051533088e-03, -5.893883038142033e-03, 7.570636080807809e-03,
249 -1.395511229386785e-03, 3.686686052704696e-03, -7.738166245767079e-03, -1.947306329828059e-03,
250 -9.299719716045681e-03, -3.476410493413708e-03, -2.390761190919604e-03, 4.359281254364210e-03,
251 -2.135251160164030e-04, 9.203299843371962e-03, 4.042322775006053e-03, -9.464271243910754e-03,
252 2.566239543229305e-03, -9.691093900220627e-03, -4.019283034310979e-03, 8.145470429508792e-03,
253 7.345087308315662e-04, 7.049642787384043e-03, -2.768492313674294e-03, 6.997160053405803e-03,
254 6.675346697112969e-03, 2.353293365652274e-03, -3.612002585241749e-04, 1.592076522068768e-03,
255 -8.354188900818149e-04, -5.232515333564140e-04, 6.946683728847089e-03, -8.469757407935994e-03,
256 -8.985324496496555e-03, 4.885832859017961e-03, -7.662967577576512e-03, 7.284124004335807e-03,
257 -5.812167510299458e-03, -5.760336800482398e-03, 6.040416930336549e-03, 5.861508595443691e-03,
258 -5.509243096133549e-04, -2.006142470055888e-03, -7.205925340416066e-03, -1.117459082969758e-03,
259 4.233247017623154e-03, 8.079257498201178e-03, 2.962639022639513e-03, 7.069474943472751e-03,
260 -8.562946284971293e-03, -8.228634642768271e-03, -6.116245322799971e-04, -7.213122000180859e-03,
261 1.693094399433209e-03, -4.287504459132290e-03, 8.740365683925144e-03, 3.751788160720638e-03,
262 7.006764222862830e-03, 9.676754678358187e-03, -6.458757235812945e-03, -4.486506575589758e-03,
263 -4.371087196816259e-03, 3.542166755953152e-03, -2.504808998699504e-03, 5.666601724512010e-03,
264 -3.691862724546129e-03, 3.689809719085287e-03, 9.079930264704458e-03, 6.365127787359476e-03,
265 2.881681788246101e-06, 9.991866069315165e-03, -1.104757466496565e-03, -2.668455405633477e-03,
266 -1.225748887087659e-03, 6.530536159094015e-03, 3.629468917975644e-03, 1.374426066950348e-03,
267 -2.404098881570632e-03, -4.791365049441602e-03, -2.970654027009094e-03, 7.807553690294366e-03,
268 -1.198321129505323e-03, -3.574885336949881e-03, -5.380848303732298e-03, 9.705151282165116e-03,
269 -1.005217683242201e-03, 9.178094036278405e-03, -5.615977269541644e-03, 5.333533158509859e-03,
270 -2.817116206168516e-03, 6.672609782000503e-03, 6.575769501651313e-03, 8.987596634989362e-03,
271 -1.283530791296188e-03, 1.687717120057778e-03, 3.242391851439037e-03, -7.312060454341677e-03,
272 4.735335326324270e-03, -6.832367028817463e-03, -5.414854835884652e-03, -9.352380213755996e-03,
273 -3.682662043703889e-03, -6.127508590419776e-04, -7.682256596819467e-03, 9.569532628790246e-03,
274 -1.572157284518933e-03, -6.023034366859191e-03, -5.110873282582924e-03, -8.697072236660256e-03,
275 -3.235150419663566e-03, -8.286320236471386e-03, -5.229472409112913e-03, 9.920785896115053e-03,
276 -2.478413362126123e-03, -9.261324796935007e-03, 1.718512310840434e-04, 3.015875488208480e-03,
277 -6.172932549255669e-03, -4.031715551985103e-03, -9.263878005853677e-03, -2.815310738453385e-03,
278 7.075307462133643e-03, 1.404611747938669e-03, -1.518548732533266e-03, -9.293430941655778e-03,
279 6.382186966633246e-03, 8.256835789169248e-03, 3.196907843506736e-03, 8.821615689753433e-03,
280 -7.661543424832439e-03, 1.636273081822326e-03, -8.792373335756125e-03, 2.958775812049877e-03,
281 -6.269300278071262e-03, 6.248285790856450e-03, -3.675414624536002e-03, -1.692616700318762e-03,
282 4.126007647815893e-03, -9.155291689759584e-03, -8.432616039924004e-03, 4.899980636213323e-03,
283 3.511535019681671e-03, -1.582745757177339e-03, -2.703657774917963e-03, 6.738168990840388e-03,
284 4.300455303937919e-03, 9.618312854781494e-03, 2.762142918402472e-03, -6.590025003382154e-03,
285 -2.071168373801788e-03, 8.613893943683627e-03, 9.411190295341036e-03, -6.129018930548372e-03
286 };
287
288 std::vector<float> anchors_vector{ -26, -19, 87, 86, -81, -27, 58, 63 };
289 ;
290
291 SimpleTensor<float> proposals_expected(TensorShape(5, 9), DataType::F32);
292 fill_tensor(proposals_expected, std::vector<float>
293 {
294 0, 0, 0, 75.269, 64.4388,
295 0, 21.9579, 13.0535, 119, 99,
296 0, 38.303, 0, 119, 87.6447,
297 0, 0, 0, 119, 64.619,
298 0, 0, 20.7997, 74.0714, 99,
299 0, 0, 0, 91.8963, 79.3724,
300 0, 0, 4.42377, 58.1405, 95.1781,
301 0, 0, 13.4405, 104.799, 99,
302 0, 38.9066, 28.2434, 119, 99,
303
304 });
305
306 SimpleTensor<float> scores_expected(TensorShape(9), DataType::F32);
307 fill_tensor(scores_expected, std::vector<float>
308 {
309 0.00986536,
310 0.00876435,
311 0.00784692,
312 0.00767041,
313 0.00732847,
314 0.00682475,
315 0.00672044,
316 0.00631324,
317 3.15769e-05
318 });
319
320 TensorShape scores_shape = TensorShape(feature_width, feature_height, num_anchors);
321 TensorShape deltas_shape = TensorShape(feature_width, feature_height, values_per_roi * num_anchors);
322 if(data_layout == DataLayout::NHWC)
323 {
324 permute(scores_shape, PermutationVector(2U, 0U, 1U));
325 permute(deltas_shape, PermutationVector(2U, 0U, 1U));
326 }
327
328 // Inputs
329 CLTensor scores = create_tensor<CLTensor>(scores_shape, data_type, 1, QuantizationInfo(), data_layout);
330 CLTensor bbox_deltas = create_tensor<CLTensor>(deltas_shape, data_type, 1, QuantizationInfo(), data_layout);
331 CLTensor anchors = create_tensor<CLTensor>(TensorShape(values_per_roi, num_anchors), data_type);
332
333 // Outputs
334 CLTensor proposals;
335 CLTensor num_valid_proposals;
336 CLTensor scores_out;
337 num_valid_proposals.allocator()->init(TensorInfo(TensorShape(1), 1, DataType::U32));
338
339 CLGenerateProposalsLayer generate_proposals;
340 generate_proposals.configure(&scores, &bbox_deltas, &anchors, &proposals, &scores_out, &num_valid_proposals,
341 GenerateProposalsInfo(120, 100, 0.166667f, 1 / 16.0, 6000, 300, 0.7f, 16.0f));
342
343 // Allocate memory for input/output tensors
344 scores.allocator()->allocate();
345 bbox_deltas.allocator()->allocate();
346 anchors.allocator()->allocate();
347 proposals.allocator()->allocate();
348 num_valid_proposals.allocator()->allocate();
349 scores_out.allocator()->allocate();
350 // Fill inputs
351 fill_tensor(CLAccessor(scores), scores_vector);
352 fill_tensor(CLAccessor(bbox_deltas), bbx_vector);
353 fill_tensor(CLAccessor(anchors), anchors_vector);
354
355 // Run operator
356 generate_proposals.run();
357 // Gather num_valid_proposals
358 num_valid_proposals.map();
359 const uint32_t N = *reinterpret_cast<uint32_t *>(num_valid_proposals.ptr_to_element(Coordinates(0, 0)));
360 num_valid_proposals.unmap();
361
362 // Select the first N entries of the proposals
363 CLTensor proposals_final;
364 CLSlice select_proposals;
365 select_proposals.configure(&proposals, &proposals_final, Coordinates(0, 0), Coordinates(values_per_roi + 1, N));
366 proposals_final.allocator()->allocate();
367 select_proposals.run();
368
Michele Di Giorgio6b612f52019-09-05 12:30:22 +0100369 // Select the first N entries of the scores
Manuel Bottini5209be52019-02-13 16:34:56 +0000370 CLTensor scores_final;
371 CLSlice select_scores;
372 select_scores.configure(&scores_out, &scores_final, Coordinates(0), Coordinates(N));
373 scores_final.allocator()->allocate();
374 select_scores.run();
375
376 const RelativeTolerance<float> tolerance_f32(1e-5f);
377 // Validate the output
378 validate(CLAccessor(proposals_final), proposals_expected, tolerance_f32);
379 validate(CLAccessor(scores_final), scores_expected, tolerance_f32);
380}
381
382FIXTURE_DATA_TEST_CASE(ComputeAllAnchors, CLComputeAllAnchorsFixture<float>, framework::DatasetMode::ALL,
383 combine(combine(framework::dataset::make("NumAnchors", { 2, 4, 8 }), ComputeAllInfoDataset), framework::dataset::make("DataType", { DataType::F32 })))
384{
385 // Validate output
386 validate(CLAccessor(_target), _reference);
387}
388TEST_SUITE_END() // FP32
389
390TEST_SUITE(FP16)
391FIXTURE_DATA_TEST_CASE(ComputeAllAnchors, CLComputeAllAnchorsFixture<half>, framework::DatasetMode::ALL,
392 combine(combine(framework::dataset::make("NumAnchors", { 2, 4, 8 }), ComputeAllInfoDataset), framework::dataset::make("DataType", { DataType::F16 })))
393{
394 // Validate output
395 validate(CLAccessor(_target), _reference);
396}
397TEST_SUITE_END() // FP16
398TEST_SUITE_END() // Float
399
Michele Di Giorgio6b612f52019-09-05 12:30:22 +0100400template <typename T>
401using CLComputeAllAnchorsQuantizedFixture = ComputeAllAnchorsQuantizedFixture<CLTensor, CLAccessor, CLComputeAllAnchors, T>;
402
403TEST_SUITE(Quantized)
404TEST_SUITE(QASYMM8)
405FIXTURE_DATA_TEST_CASE(ComputeAllAnchors, CLComputeAllAnchorsQuantizedFixture<int16_t>, framework::DatasetMode::ALL,
406 combine(combine(combine(framework::dataset::make("NumAnchors", { 2, 4, 8 }), ComputeAllInfoDataset),
407 framework::dataset::make("DataType", { DataType::QSYMM16 })),
408 framework::dataset::make("QuantInfo", { QuantizationInfo(0.125f, 0) })))
409{
410 // Validate output
411 validate(CLAccessor(_target), _reference, tolerance_qsymm16);
412}
413TEST_SUITE_END() // QASYMM8
414TEST_SUITE_END() // Quantized
415
Manuel Bottini5209be52019-02-13 16:34:56 +0000416TEST_SUITE_END() // GenerateProposals
417TEST_SUITE_END() // CL
418
419} // namespace validation
420} // namespace test
421} // namespace arm_compute