xref: /aosp_15_r20/external/ComputeLibrary/tests/validation/CPP/DetectionPostProcessLayer.cpp (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2019-2020 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #include "arm_compute/core/Types.h"
25*c217d954SCole Faust #include "arm_compute/runtime/CPP/functions/CPPDetectionPostProcessLayer.h"
26*c217d954SCole Faust #include "arm_compute/runtime/Tensor.h"
27*c217d954SCole Faust #include "arm_compute/runtime/TensorAllocator.h"
28*c217d954SCole Faust #include "tests/NEON/Accessor.h"
29*c217d954SCole Faust #include "tests/PaddingCalculator.h"
30*c217d954SCole Faust #include "tests/datasets/ShapeDatasets.h"
31*c217d954SCole Faust #include "tests/framework/Asserts.h"
32*c217d954SCole Faust #include "tests/framework/Macros.h"
33*c217d954SCole Faust #include "tests/framework/datasets/Datasets.h"
34*c217d954SCole Faust #include "tests/validation/Validation.h"
35*c217d954SCole Faust 
36*c217d954SCole Faust namespace arm_compute
37*c217d954SCole Faust {
38*c217d954SCole Faust namespace test
39*c217d954SCole Faust {
40*c217d954SCole Faust namespace validation
41*c217d954SCole Faust {
42*c217d954SCole Faust namespace
43*c217d954SCole Faust {
44*c217d954SCole Faust template <typename U, typename T>
fill_tensor(U && tensor,const std::vector<T> & v)45*c217d954SCole Faust inline void fill_tensor(U &&tensor, const std::vector<T> &v)
46*c217d954SCole Faust {
47*c217d954SCole Faust     std::memcpy(tensor.data(), v.data(), sizeof(T) * v.size());
48*c217d954SCole Faust }
49*c217d954SCole Faust template <typename D, typename U, typename T>
quantize_and_fill_tensor(U && tensor,const std::vector<T> & v)50*c217d954SCole Faust inline void quantize_and_fill_tensor(U &&tensor, const std::vector<T> &v)
51*c217d954SCole Faust {
52*c217d954SCole Faust     QuantizationInfo qi = tensor.quantization_info();
53*c217d954SCole Faust     std::vector<D>   quantized;
54*c217d954SCole Faust     quantized.reserve(v.size());
55*c217d954SCole Faust     for(auto elem : v)
56*c217d954SCole Faust     {
57*c217d954SCole Faust         quantized.emplace_back(Qasymm8QuantizationHelper<D>::quantize(elem, qi));
58*c217d954SCole Faust     }
59*c217d954SCole Faust     std::memcpy(tensor.data(), quantized.data(), sizeof(D) * quantized.size());
60*c217d954SCole Faust }
61*c217d954SCole Faust template <typename T>
calc_qinfo(const float min,const float max,float & scale)62*c217d954SCole Faust inline int calc_qinfo(const float min, const float max, float &scale)
63*c217d954SCole Faust {
64*c217d954SCole Faust     const auto  qmin   = std::numeric_limits<T>::min();
65*c217d954SCole Faust     const auto  qmax   = std::numeric_limits<T>::max();
66*c217d954SCole Faust     const float f_qmin = qmin;
67*c217d954SCole Faust     const float f_qmax = qmax;
68*c217d954SCole Faust 
69*c217d954SCole Faust     scale                       = (max - min) / (f_qmax - f_qmin);
70*c217d954SCole Faust     const float offset_from_min = f_qmin - min / scale;
71*c217d954SCole Faust     const float offset_from_max = f_qmax - max / scale;
72*c217d954SCole Faust 
73*c217d954SCole Faust     const float offset_from_min_error = std::abs(f_qmin) + std::abs(min / scale);
74*c217d954SCole Faust     const float offset_from_max_error = std::abs(f_qmax) + std::abs(max / scale);
75*c217d954SCole Faust     const float f_offset              = offset_from_min_error < offset_from_max_error ? offset_from_min : offset_from_max;
76*c217d954SCole Faust     T           tmp_offset;
77*c217d954SCole Faust     if(f_offset < f_qmin)
78*c217d954SCole Faust     {
79*c217d954SCole Faust         tmp_offset = qmin;
80*c217d954SCole Faust     }
81*c217d954SCole Faust     else if(f_offset > f_qmax)
82*c217d954SCole Faust     {
83*c217d954SCole Faust         tmp_offset = qmax;
84*c217d954SCole Faust     }
85*c217d954SCole Faust     else
86*c217d954SCole Faust     {
87*c217d954SCole Faust         tmp_offset = static_cast<T>(arm_compute::support::cpp11::round(f_offset));
88*c217d954SCole Faust     }
89*c217d954SCole Faust     return static_cast<int>(tmp_offset);
90*c217d954SCole Faust }
qinfo_scaleoffset_from_minmax(DataType data_type,const float min,const float max)91*c217d954SCole Faust inline QuantizationInfo qinfo_scaleoffset_from_minmax(DataType data_type, const float min, const float max)
92*c217d954SCole Faust {
93*c217d954SCole Faust     int   offset = 0;
94*c217d954SCole Faust     float scale  = 0;
95*c217d954SCole Faust 
96*c217d954SCole Faust     // Continue only if [min,max] is a valid range and not a point
97*c217d954SCole Faust     if(min != max)
98*c217d954SCole Faust     {
99*c217d954SCole Faust         if(data_type == DataType::QASYMM8_SIGNED)
100*c217d954SCole Faust         {
101*c217d954SCole Faust             offset = calc_qinfo<int8_t>(min, max, scale);
102*c217d954SCole Faust         }
103*c217d954SCole Faust         else
104*c217d954SCole Faust         {
105*c217d954SCole Faust             offset = calc_qinfo<uint8_t>(min, max, scale);
106*c217d954SCole Faust         }
107*c217d954SCole Faust     }
108*c217d954SCole Faust     return QuantizationInfo(scale, offset);
109*c217d954SCole Faust }
110*c217d954SCole Faust 
base_test_case(DetectionPostProcessLayerInfo info,DataType data_type,const SimpleTensor<float> & expected_output_boxes,const SimpleTensor<float> & expected_output_classes,const SimpleTensor<float> & expected_output_scores,const SimpleTensor<float> & expected_num_detection,AbsoluteTolerance<float> tolerance_boxes=AbsoluteTolerance<float> (0.1f),AbsoluteTolerance<float> tolerance_others=AbsoluteTolerance<float> (0.1f))111*c217d954SCole Faust inline void base_test_case(DetectionPostProcessLayerInfo info, DataType data_type, const SimpleTensor<float> &expected_output_boxes,
112*c217d954SCole Faust                            const SimpleTensor<float> &expected_output_classes, const SimpleTensor<float> &expected_output_scores, const SimpleTensor<float> &expected_num_detection,
113*c217d954SCole Faust                            AbsoluteTolerance<float> tolerance_boxes = AbsoluteTolerance<float>(0.1f), AbsoluteTolerance<float> tolerance_others = AbsoluteTolerance<float>(0.1f))
114*c217d954SCole Faust {
115*c217d954SCole Faust     Tensor box_encoding     = create_tensor<Tensor>(TensorShape(4U, 6U, 1U), data_type, 1, qinfo_scaleoffset_from_minmax(data_type, -1.0f, 1.0f));
116*c217d954SCole Faust     Tensor class_prediction = create_tensor<Tensor>(TensorShape(3U, 6U, 1U), data_type, 1, qinfo_scaleoffset_from_minmax(data_type, 0.0f, 1.0f));
117*c217d954SCole Faust     Tensor anchors          = create_tensor<Tensor>(TensorShape(4U, 6U), data_type, 1, qinfo_scaleoffset_from_minmax(data_type, 0.0f, 100.5f));
118*c217d954SCole Faust 
119*c217d954SCole Faust     box_encoding.allocator()->allocate();
120*c217d954SCole Faust     class_prediction.allocator()->allocate();
121*c217d954SCole Faust     anchors.allocator()->allocate();
122*c217d954SCole Faust 
123*c217d954SCole Faust     std::vector<float> box_encoding_vector =
124*c217d954SCole Faust     {
125*c217d954SCole Faust         0.0f, 1.0f, 0.0f, 0.0f,
126*c217d954SCole Faust         0.0f, -1.0f, 0.0f, 0.0f,
127*c217d954SCole Faust         0.0f, 0.0f, 0.0f, 0.0f,
128*c217d954SCole Faust         0.0f, 0.0f, 0.0f, 0.0f,
129*c217d954SCole Faust         0.0f, 1.0f, 0.0f, 0.0f,
130*c217d954SCole Faust         0.0f, 0.0f, 0.0f, 0.0f
131*c217d954SCole Faust     };
132*c217d954SCole Faust     std::vector<float> class_prediction_vector =
133*c217d954SCole Faust     {
134*c217d954SCole Faust         0.0f, 0.7f, 0.68f,
135*c217d954SCole Faust         0.0f, 0.6f, 0.5f,
136*c217d954SCole Faust         0.0f, 0.9f, 0.83f,
137*c217d954SCole Faust         0.0f, 0.91f, 0.97f,
138*c217d954SCole Faust         0.0f, 0.5f, 0.4f,
139*c217d954SCole Faust         0.0f, 0.31f, 0.22f
140*c217d954SCole Faust     };
141*c217d954SCole Faust     std::vector<float> anchors_vector =
142*c217d954SCole Faust     {
143*c217d954SCole Faust         0.4f, 0.4f, 1.1f, 1.1f,
144*c217d954SCole Faust         0.4f, 0.4f, 1.1f, 1.1f,
145*c217d954SCole Faust         0.4f, 0.4f, 1.1f, 1.1f,
146*c217d954SCole Faust         0.4f, 10.4f, 1.1f, 1.1f,
147*c217d954SCole Faust         0.4f, 10.4f, 1.1f, 1.1f,
148*c217d954SCole Faust         0.4f, 100.4f, 1.1f, 1.1f
149*c217d954SCole Faust     };
150*c217d954SCole Faust 
151*c217d954SCole Faust     // Fill the tensors with random pre-generated values
152*c217d954SCole Faust     switch(data_type)
153*c217d954SCole Faust     {
154*c217d954SCole Faust         case DataType::F32:
155*c217d954SCole Faust         {
156*c217d954SCole Faust             fill_tensor(Accessor(box_encoding), box_encoding_vector);
157*c217d954SCole Faust             fill_tensor(Accessor(class_prediction), class_prediction_vector);
158*c217d954SCole Faust             fill_tensor(Accessor(anchors), anchors_vector);
159*c217d954SCole Faust         }
160*c217d954SCole Faust         break;
161*c217d954SCole Faust         case DataType::QASYMM8:
162*c217d954SCole Faust         {
163*c217d954SCole Faust             quantize_and_fill_tensor<uint8_t>(Accessor(box_encoding), box_encoding_vector);
164*c217d954SCole Faust             quantize_and_fill_tensor<uint8_t>(Accessor(class_prediction), class_prediction_vector);
165*c217d954SCole Faust             quantize_and_fill_tensor<uint8_t>(Accessor(anchors), anchors_vector);
166*c217d954SCole Faust         }
167*c217d954SCole Faust         break;
168*c217d954SCole Faust         case DataType::QASYMM8_SIGNED:
169*c217d954SCole Faust         {
170*c217d954SCole Faust             quantize_and_fill_tensor<int8_t>(Accessor(box_encoding), box_encoding_vector);
171*c217d954SCole Faust             quantize_and_fill_tensor<int8_t>(Accessor(class_prediction), class_prediction_vector);
172*c217d954SCole Faust             quantize_and_fill_tensor<int8_t>(Accessor(anchors), anchors_vector);
173*c217d954SCole Faust         }
174*c217d954SCole Faust         break;
175*c217d954SCole Faust         default:
176*c217d954SCole Faust             return;
177*c217d954SCole Faust     }
178*c217d954SCole Faust 
179*c217d954SCole Faust     // Determine the output through the CPP kernel
180*c217d954SCole Faust     Tensor                       output_boxes;
181*c217d954SCole Faust     Tensor                       output_classes;
182*c217d954SCole Faust     Tensor                       output_scores;
183*c217d954SCole Faust     Tensor                       num_detection;
184*c217d954SCole Faust     CPPDetectionPostProcessLayer detection;
185*c217d954SCole Faust     detection.configure(&box_encoding, &class_prediction, &anchors, &output_boxes, &output_classes, &output_scores, &num_detection, info);
186*c217d954SCole Faust 
187*c217d954SCole Faust     output_boxes.allocator()->allocate();
188*c217d954SCole Faust     output_classes.allocator()->allocate();
189*c217d954SCole Faust     output_scores.allocator()->allocate();
190*c217d954SCole Faust     num_detection.allocator()->allocate();
191*c217d954SCole Faust 
192*c217d954SCole Faust     // Run the kernel
193*c217d954SCole Faust     detection.run();
194*c217d954SCole Faust 
195*c217d954SCole Faust     // Validate against the expected output
196*c217d954SCole Faust     // Validate output boxes
197*c217d954SCole Faust     validate(Accessor(output_boxes), expected_output_boxes, tolerance_boxes);
198*c217d954SCole Faust     // Validate detection classes
199*c217d954SCole Faust     validate(Accessor(output_classes), expected_output_classes, tolerance_others);
200*c217d954SCole Faust     // Validate detection scores
201*c217d954SCole Faust     validate(Accessor(output_scores), expected_output_scores, tolerance_others);
202*c217d954SCole Faust     // Validate num detections
203*c217d954SCole Faust     validate(Accessor(num_detection), expected_num_detection, tolerance_others);
204*c217d954SCole Faust }
205*c217d954SCole Faust } // namespace
206*c217d954SCole Faust 
207*c217d954SCole Faust TEST_SUITE(CPP)
TEST_SUITE(DetectionPostProcessLayer)208*c217d954SCole Faust TEST_SUITE(DetectionPostProcessLayer)
209*c217d954SCole Faust 
210*c217d954SCole Faust // *INDENT-OFF*
211*c217d954SCole Faust // clang-format off
212*c217d954SCole Faust DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(zip(zip(
213*c217d954SCole Faust         framework::dataset::make("BoxEncodingsInfo", { TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
214*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 3U), 1, DataType::F32),  // Mismatching batch_size
215*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::S8), // Unsupported data type
216*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32), // Wrong Detection Info
217*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32), // Wrong boxes dimensions
218*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::QASYMM8), // Wrong score dimension
219*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::QASYMM8_SIGNED)}), // Wrong score dimension
220*c217d954SCole Faust         framework::dataset::make("ClassPredsInfo",{ TensorInfo(TensorShape(3U ,10U), 1, DataType::F32),
221*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::F32),
222*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::F32),
223*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::F32),
224*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::F32),
225*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::QASYMM8),
226*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U ,10U), 1, DataType::QASYMM8_SIGNED)})),
227*c217d954SCole Faust         framework::dataset::make("AnchorsInfo",{ TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
228*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
229*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
230*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
231*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::F32),
232*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::QASYMM8),
233*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 10U, 1U), 1, DataType::QASYMM8_SIGNED)})),
234*c217d954SCole Faust         framework::dataset::make("OutputBoxInfo", { TensorInfo(TensorShape(4U, 3U, 1U), 1, DataType::F32),
235*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 3U, 1U), 1, DataType::F32),
236*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 3U, 1U), 1, DataType::S8),
237*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 3U, 1U), 1, DataType::F32),
238*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U, 5U, 1U), 1, DataType::F32),
239*c217d954SCole Faust                                                 TensorInfo(TensorShape(4U, 3U, 1U), 1, DataType::F32)})),
240*c217d954SCole Faust         framework::dataset::make("OuputClassesInfo",{ TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
241*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
242*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
243*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
244*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
245*c217d954SCole Faust                                                 TensorInfo(TensorShape(6U, 1U), 1, DataType::F32)})),
246*c217d954SCole Faust         framework::dataset::make("OutputScoresInfo",{ TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
247*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
248*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
249*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
250*c217d954SCole Faust                                                 TensorInfo(TensorShape(3U, 1U), 1, DataType::F32),
251*c217d954SCole Faust                                                 TensorInfo(TensorShape(6U, 1U), 1, DataType::F32)})),
252*c217d954SCole Faust         framework::dataset::make("NumDetectionsInfo",{ TensorInfo(TensorShape(1U), 1, DataType::F32),
253*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U), 1, DataType::F32),
254*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U), 1, DataType::F32),
255*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U), 1, DataType::F32),
256*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U), 1, DataType::F32),
257*c217d954SCole Faust                                                 TensorInfo(TensorShape(1U), 1, DataType::F32)})),
258*c217d954SCole Faust         framework::dataset::make("DetectionPostProcessLayerInfo",{ DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
259*c217d954SCole Faust                                                 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
260*c217d954SCole Faust                                                 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
261*c217d954SCole Faust                                                 DetectionPostProcessLayerInfo(3, 1, 0.0f, 1.5f, 2, {0.0f,0.1f,0.1f,0.1f}),
262*c217d954SCole Faust                                                 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
263*c217d954SCole Faust                                                 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f})})),
264*c217d954SCole Faust         framework::dataset::make("Expected", {true, false, false, false, false, false })),
265*c217d954SCole Faust         box_encodings_info, classes_info, anchors_info, output_boxes_info, output_classes_info,output_scores_info, num_detection_info, detect_info, expected)
266*c217d954SCole Faust {
267*c217d954SCole Faust     const Status status = CPPDetectionPostProcessLayer::validate(&box_encodings_info.clone()->set_is_resizable(false),
268*c217d954SCole Faust             &classes_info.clone()->set_is_resizable(false),
269*c217d954SCole Faust             &anchors_info.clone()->set_is_resizable(false),
270*c217d954SCole Faust             &output_boxes_info.clone()->set_is_resizable(false),
271*c217d954SCole Faust             &output_classes_info.clone()->set_is_resizable(false),
272*c217d954SCole Faust             &output_scores_info.clone()->set_is_resizable(false), &num_detection_info.clone()->set_is_resizable(false), detect_info);
273*c217d954SCole Faust     ARM_COMPUTE_EXPECT(bool(status) == expected, framework::LogLevel::ERRORS);
274*c217d954SCole Faust }
275*c217d954SCole Faust // clang-format on
276*c217d954SCole Faust // *INDENT-ON*
277*c217d954SCole Faust 
278*c217d954SCole Faust TEST_SUITE(F32)
TEST_CASE(Float_general,framework::DatasetMode::ALL)279*c217d954SCole Faust TEST_CASE(Float_general, framework::DatasetMode::ALL)
280*c217d954SCole Faust {
281*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
282*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/);
283*c217d954SCole Faust     // Fill expected detection boxes
284*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
285*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
286*c217d954SCole Faust     // Fill expected detection classes
287*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
288*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
289*c217d954SCole Faust     // Fill expected detection scores
290*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
291*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
292*c217d954SCole Faust     // Fill expected num detections
293*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
294*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
295*c217d954SCole Faust     // Run base test
296*c217d954SCole Faust     base_test_case(info, DataType::F32, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection);
297*c217d954SCole Faust }
298*c217d954SCole Faust 
TEST_CASE(Float_fast,framework::DatasetMode::ALL)299*c217d954SCole Faust TEST_CASE(Float_fast, framework::DatasetMode::ALL)
300*c217d954SCole Faust {
301*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
302*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
303*c217d954SCole Faust                                                                        false /*use_regular_nms*/, 1 /*detections_per_class*/);
304*c217d954SCole Faust 
305*c217d954SCole Faust     // Fill expected detection boxes
306*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
307*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
308*c217d954SCole Faust     // Fill expected detection classes
309*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
310*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
311*c217d954SCole Faust     // Fill expected detection scores
312*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
313*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
314*c217d954SCole Faust     // Fill expected num detections
315*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
316*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
317*c217d954SCole Faust 
318*c217d954SCole Faust     // Run base test
319*c217d954SCole Faust     base_test_case(info, DataType::F32, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection);
320*c217d954SCole Faust }
321*c217d954SCole Faust 
TEST_CASE(Float_regular,framework::DatasetMode::ALL)322*c217d954SCole Faust TEST_CASE(Float_regular, framework::DatasetMode::ALL)
323*c217d954SCole Faust {
324*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
325*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
326*c217d954SCole Faust                                                                        true /*use_regular_nms*/, 1 /*detections_per_class*/);
327*c217d954SCole Faust 
328*c217d954SCole Faust     // Fill expected detection boxes
329*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
330*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, 9.85, 0.95, 10.95, 0.0f, 0.0f, 0.0f, 0.0f });
331*c217d954SCole Faust     // Fill expected detection classes
332*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
333*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
334*c217d954SCole Faust     // Fill expected detection scores
335*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
336*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.91f, 0.0f });
337*c217d954SCole Faust     // Fill expected num detections
338*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
339*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 2.f });
340*c217d954SCole Faust 
341*c217d954SCole Faust     // Run test
342*c217d954SCole Faust     base_test_case(info, DataType::F32, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection);
343*c217d954SCole Faust }
344*c217d954SCole Faust TEST_SUITE_END() // F32
345*c217d954SCole Faust 
TEST_SUITE(QASYMM8)346*c217d954SCole Faust TEST_SUITE(QASYMM8)
347*c217d954SCole Faust TEST_CASE(Quantized_general, framework::DatasetMode::ALL)
348*c217d954SCole Faust {
349*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
350*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/);
351*c217d954SCole Faust 
352*c217d954SCole Faust     // Fill expected detection boxes
353*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
354*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
355*c217d954SCole Faust     // Fill expected detection classes
356*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
357*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
358*c217d954SCole Faust     // Fill expected detection scores
359*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
360*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
361*c217d954SCole Faust     // Fill expected num detections
362*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
363*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
364*c217d954SCole Faust     // Run test
365*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
366*c217d954SCole Faust }
367*c217d954SCole Faust 
TEST_CASE(Quantized_fast,framework::DatasetMode::ALL)368*c217d954SCole Faust TEST_CASE(Quantized_fast, framework::DatasetMode::ALL)
369*c217d954SCole Faust {
370*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
371*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
372*c217d954SCole Faust                                                                        false /*use_regular_nms*/, 1 /*detections_per_class*/);
373*c217d954SCole Faust 
374*c217d954SCole Faust     // Fill expected detection boxes
375*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
376*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
377*c217d954SCole Faust     // Fill expected detection classes
378*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
379*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
380*c217d954SCole Faust     // Fill expected detection scores
381*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
382*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
383*c217d954SCole Faust     // Fill expected num detections
384*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
385*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
386*c217d954SCole Faust 
387*c217d954SCole Faust     // Run base test
388*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
389*c217d954SCole Faust }
390*c217d954SCole Faust 
TEST_CASE(Quantized_regular,framework::DatasetMode::ALL)391*c217d954SCole Faust TEST_CASE(Quantized_regular, framework::DatasetMode::ALL)
392*c217d954SCole Faust {
393*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
394*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
395*c217d954SCole Faust                                                                        true /*use_regular_nms*/, 1 /*detections_per_class*/);
396*c217d954SCole Faust     // Fill expected detection boxes
397*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
398*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, 9.85, 0.95, 10.95, 0.0f, 0.0f, 0.0f, 0.0f });
399*c217d954SCole Faust     // Fill expected detection classes
400*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
401*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
402*c217d954SCole Faust     // Fill expected detection scores
403*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
404*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.95f, 0.91f, 0.0f });
405*c217d954SCole Faust     // Fill expected num detections
406*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
407*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 2.f });
408*c217d954SCole Faust 
409*c217d954SCole Faust     // Run test
410*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
411*c217d954SCole Faust }
412*c217d954SCole Faust 
413*c217d954SCole Faust TEST_SUITE_END() // QASYMM8
414*c217d954SCole Faust 
TEST_SUITE(QASYMM8_SIGNED)415*c217d954SCole Faust TEST_SUITE(QASYMM8_SIGNED)
416*c217d954SCole Faust TEST_CASE(Quantized_general, framework::DatasetMode::ALL)
417*c217d954SCole Faust {
418*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
419*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/);
420*c217d954SCole Faust 
421*c217d954SCole Faust     // Fill expected detection boxes
422*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
423*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
424*c217d954SCole Faust     // Fill expected detection classes
425*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
426*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
427*c217d954SCole Faust     // Fill expected detection scores
428*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
429*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
430*c217d954SCole Faust     // Fill expected num detections
431*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
432*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
433*c217d954SCole Faust     // Run test
434*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8_SIGNED, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
435*c217d954SCole Faust }
436*c217d954SCole Faust 
TEST_CASE(Quantized_fast,framework::DatasetMode::ALL)437*c217d954SCole Faust TEST_CASE(Quantized_fast, framework::DatasetMode::ALL)
438*c217d954SCole Faust {
439*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
440*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
441*c217d954SCole Faust                                                                        false /*use_regular_nms*/, 1 /*detections_per_class*/);
442*c217d954SCole Faust 
443*c217d954SCole Faust     // Fill expected detection boxes
444*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
445*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, -0.15, 0.95, 0.95, -0.15, 99.85, 0.95, 100.95 });
446*c217d954SCole Faust     // Fill expected detection classes
447*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
448*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
449*c217d954SCole Faust     // Fill expected detection scores
450*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
451*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.97f, 0.95f, 0.31f });
452*c217d954SCole Faust     // Fill expected num detections
453*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
454*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 3.f });
455*c217d954SCole Faust 
456*c217d954SCole Faust     // Run base test
457*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8_SIGNED, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
458*c217d954SCole Faust }
459*c217d954SCole Faust 
TEST_CASE(Quantized_regular,framework::DatasetMode::ALL)460*c217d954SCole Faust TEST_CASE(Quantized_regular, framework::DatasetMode::ALL)
461*c217d954SCole Faust {
462*c217d954SCole Faust     DetectionPostProcessLayerInfo info = DetectionPostProcessLayerInfo(3 /*max_detections*/, 1 /*max_classes_per_detection*/, 0.0 /*nms_score_threshold*/,
463*c217d954SCole Faust                                                                        0.5 /*nms_iou_threshold*/, 2 /*num_classes*/, { 11.0, 11.0, 6.0, 6.0 } /*scale*/,
464*c217d954SCole Faust                                                                        true /*use_regular_nms*/, 1 /*detections_per_class*/);
465*c217d954SCole Faust     // Fill expected detection boxes
466*c217d954SCole Faust     SimpleTensor<float> expected_output_boxes(TensorShape(4U, 3U), DataType::F32);
467*c217d954SCole Faust     fill_tensor(expected_output_boxes, std::vector<float> { -0.15, 9.85, 0.95, 10.95, -0.15, 9.85, 0.95, 10.95, 0.0f, 0.0f, 0.0f, 0.0f });
468*c217d954SCole Faust     // Fill expected detection classes
469*c217d954SCole Faust     SimpleTensor<float> expected_output_classes(TensorShape(3U), DataType::F32);
470*c217d954SCole Faust     fill_tensor(expected_output_classes, std::vector<float> { 1.0f, 0.0f, 0.0f });
471*c217d954SCole Faust     // Fill expected detection scores
472*c217d954SCole Faust     SimpleTensor<float> expected_output_scores(TensorShape(3U), DataType::F32);
473*c217d954SCole Faust     fill_tensor(expected_output_scores, std::vector<float> { 0.95f, 0.91f, 0.0f });
474*c217d954SCole Faust     // Fill expected num detections
475*c217d954SCole Faust     SimpleTensor<float> expected_num_detection(TensorShape(1U), DataType::F32);
476*c217d954SCole Faust     fill_tensor(expected_num_detection, std::vector<float> { 2.f });
477*c217d954SCole Faust 
478*c217d954SCole Faust     // Run test
479*c217d954SCole Faust     base_test_case(info, DataType::QASYMM8_SIGNED, expected_output_boxes, expected_output_classes, expected_output_scores, expected_num_detection, AbsoluteTolerance<float>(0.3f));
480*c217d954SCole Faust }
481*c217d954SCole Faust 
482*c217d954SCole Faust TEST_SUITE_END() // QASYMM8_SIGNED
483*c217d954SCole Faust 
484*c217d954SCole Faust TEST_SUITE_END() // DetectionPostProcessLayer
485*c217d954SCole Faust TEST_SUITE_END() // CPP
486*c217d954SCole Faust } // namespace validation
487*c217d954SCole Faust } // namespace test
488*c217d954SCole Faust } // namespace arm_compute
489