30 #include "tests/datasets/ShapeDatasets.h"
44 template <
typename U,
typename T>
47 std::memcpy(
tensor.data(), v.data(),
sizeof(T) * v.size());
49 template <
typename U,
typename T>
50 inline void quantize_and_fill_tensor(U &&
tensor,
const std::vector<T> &v)
52 QuantizationInfo qi =
tensor.quantization_info();
53 std::vector<uint8_t> quantized;
54 quantized.reserve(v.size());
59 std::memcpy(
tensor.data(), quantized.data(),
sizeof(uint8_t) * quantized.size());
61 inline QuantizationInfo qinfo_scaleoffset_from_minmax(
const float min,
const float max)
65 const uint8_t qmin = std::numeric_limits<uint8_t>::min();
66 const uint8_t qmax = std::numeric_limits<uint8_t>::max();
67 const float f_qmin = qmin;
68 const float f_qmax = qmax;
73 scale = (max - min) / (f_qmax - f_qmin);
74 const float offset_from_min = f_qmin - min /
scale;
75 const float offset_from_max = f_qmax - max /
scale;
77 const float offset_from_min_error = std::abs(f_qmin) + std::abs(min /
scale);
78 const float offset_from_max_error = std::abs(f_qmax) + std::abs(max /
scale);
79 const float f_offset = offset_from_min_error < offset_from_max_error ? offset_from_min : offset_from_max;
81 uint8_t uint8_offset = 0;
86 else if(f_offset > f_qmax)
101 AbsoluteTolerance<float> tolerance_boxes = AbsoluteTolerance<float>(0.1f), AbsoluteTolerance<float> tolerance_others = AbsoluteTolerance<float>(0.1f))
103 Tensor box_encoding = create_tensor<Tensor>(TensorShape(4U, 6U, 1U),
data_type, 1, qinfo_scaleoffset_from_minmax(-1.0f, 1.0f));
104 Tensor class_prediction = create_tensor<Tensor>(TensorShape(3U, 6U, 1U),
data_type, 1, qinfo_scaleoffset_from_minmax(0.0f, 1.0f));
105 Tensor anchors = create_tensor<Tensor>(TensorShape(4U, 6U),
data_type, 1, qinfo_scaleoffset_from_minmax(0.0f, 100.5f));
107 box_encoding.allocator()->allocate();
108 class_prediction.allocator()->allocate();
109 anchors.allocator()->allocate();
111 std::vector<float> box_encoding_vector =
113 0.0f, 1.0f, 0.0f, 0.0f,
114 0.0f, -1.0f, 0.0f, 0.0f,
115 0.0f, 0.0f, 0.0f, 0.0f,
116 0.0f, 0.0f, 0.0f, 0.0f,
117 0.0f, 1.0f, 0.0f, 0.0f,
118 0.0f, 0.0f, 0.0f, 0.0f
120 std::vector<float> class_prediction_vector =
129 std::vector<float> anchors_vector =
131 0.4f, 0.4f, 1.1f, 1.1f,
132 0.4f, 0.4f, 1.1f, 1.1f,
133 0.4f, 0.4f, 1.1f, 1.1f,
134 0.4f, 10.4f, 1.1f, 1.1f,
135 0.4f, 10.4f, 1.1f, 1.1f,
136 0.4f, 100.4f, 1.1f, 1.1f
142 fill_tensor(Accessor(box_encoding), box_encoding_vector);
143 fill_tensor(Accessor(class_prediction), class_prediction_vector);
148 quantize_and_fill_tensor(Accessor(box_encoding), box_encoding_vector);
149 quantize_and_fill_tensor(Accessor(class_prediction), class_prediction_vector);
150 quantize_and_fill_tensor(Accessor(anchors), anchors_vector);
158 NEDetectionPostProcessLayer detection;
159 detection.configure(&box_encoding, &class_prediction, &anchors, &output_boxes, &output_classes, &output_scores, &num_detection,
info);
161 output_boxes.allocator()->allocate();
162 output_classes.allocator()->allocate();
163 output_scores.allocator()->allocate();
164 num_detection.allocator()->allocate();
229 framework::dataset::make(
"DetectionPostProcessLayerInfo",{ DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
230 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
231 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
232 DetectionPostProcessLayerInfo(3, 1, 0.0f, 1.5f, 2, {0.0f,0.1f,0.1f,0.1f}),
233 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
234 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f})})),
236 box_encodings_info, classes_info, anchors_info, output_boxes_info, output_classes_info,output_scores_info, num_detection_info, detect_info,
expected)
239 &classes_info.clone()->set_is_resizable(
false),
240 &anchors_info.clone()->set_is_resizable(
false),
241 &output_boxes_info.clone()->set_is_resizable(
false),
242 &output_classes_info.clone()->set_is_resizable(
false),
243 &output_scores_info.clone()->set_is_resizable(
false), &num_detection_info.clone()->set_is_resizable(
false), detect_info);
252 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
253 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } );
256 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 });
272 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
273 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
278 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 });
295 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
296 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
301 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 });
320 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
321 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } );
325 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 });
341 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
342 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
347 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 });
364 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
365 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
369 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 });