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 D,
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<D> quantized;
54 quantized.reserve(v.size());
59 std::memcpy(
tensor.data(), quantized.data(),
sizeof(D) * quantized.size());
62 inline int calc_qinfo(
const float min,
const float max,
float &
scale)
64 const auto qmin = std::numeric_limits<T>::min();
65 const auto qmax = std::numeric_limits<T>::max();
66 const float f_qmin = qmin;
67 const float f_qmax = qmax;
69 scale = (max - min) / (f_qmax - f_qmin);
70 const float offset_from_min = f_qmin - min /
scale;
71 const float offset_from_max = f_qmax - max /
scale;
73 const float offset_from_min_error = std::abs(f_qmin) + std::abs(min /
scale);
74 const float offset_from_max_error = std::abs(f_qmax) + std::abs(max /
scale);
75 const float f_offset = offset_from_min_error < offset_from_max_error ? offset_from_min : offset_from_max;
81 else if(f_offset > f_qmax)
89 return static_cast<int>(tmp_offset);
91 inline QuantizationInfo qinfo_scaleoffset_from_minmax(
DataType data_type,
const float min,
const float max)
113 AbsoluteTolerance<float> tolerance_boxes = AbsoluteTolerance<float>(0.1f), AbsoluteTolerance<float> tolerance_others = AbsoluteTolerance<float>(0.1f))
115 Tensor box_encoding = create_tensor<Tensor>(TensorShape(4U, 6U, 1U),
data_type, 1, qinfo_scaleoffset_from_minmax(
data_type, -1.0f, 1.0f));
116 Tensor class_prediction = create_tensor<Tensor>(TensorShape(3U, 6U, 1U),
data_type, 1, qinfo_scaleoffset_from_minmax(
data_type, 0.0f, 1.0f));
117 Tensor anchors = create_tensor<Tensor>(TensorShape(4U, 6U),
data_type, 1, qinfo_scaleoffset_from_minmax(
data_type, 0.0f, 100.5f));
119 box_encoding.allocator()->allocate();
120 class_prediction.allocator()->allocate();
121 anchors.allocator()->allocate();
123 std::vector<float> box_encoding_vector =
125 0.0f, 1.0f, 0.0f, 0.0f,
126 0.0f, -1.0f, 0.0f, 0.0f,
127 0.0f, 0.0f, 0.0f, 0.0f,
128 0.0f, 0.0f, 0.0f, 0.0f,
129 0.0f, 1.0f, 0.0f, 0.0f,
130 0.0f, 0.0f, 0.0f, 0.0f
132 std::vector<float> class_prediction_vector =
141 std::vector<float> anchors_vector =
143 0.4f, 0.4f, 1.1f, 1.1f,
144 0.4f, 0.4f, 1.1f, 1.1f,
145 0.4f, 0.4f, 1.1f, 1.1f,
146 0.4f, 10.4f, 1.1f, 1.1f,
147 0.4f, 10.4f, 1.1f, 1.1f,
148 0.4f, 100.4f, 1.1f, 1.1f
156 fill_tensor(Accessor(box_encoding), box_encoding_vector);
157 fill_tensor(Accessor(class_prediction), class_prediction_vector);
163 quantize_and_fill_tensor<uint8_t>(Accessor(box_encoding), box_encoding_vector);
164 quantize_and_fill_tensor<uint8_t>(Accessor(class_prediction), class_prediction_vector);
165 quantize_and_fill_tensor<uint8_t>(Accessor(anchors), anchors_vector);
170 quantize_and_fill_tensor<int8_t>(Accessor(box_encoding), box_encoding_vector);
171 quantize_and_fill_tensor<int8_t>(Accessor(class_prediction), class_prediction_vector);
172 quantize_and_fill_tensor<int8_t>(Accessor(anchors), anchors_vector);
184 CPPDetectionPostProcessLayer detection;
185 detection.configure(&box_encoding, &class_prediction, &anchors, &output_boxes, &output_classes, &output_scores, &num_detection,
info);
187 output_boxes.allocator()->allocate();
188 output_classes.allocator()->allocate();
189 output_scores.allocator()->allocate();
190 num_detection.allocator()->allocate();
258 framework::dataset::make(
"DetectionPostProcessLayerInfo",{ DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
259 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
260 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
261 DetectionPostProcessLayerInfo(3, 1, 0.0f, 1.5f, 2, {0.0f,0.1f,0.1f,0.1f}),
262 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f}),
263 DetectionPostProcessLayerInfo(3, 1, 0.0f, 0.5f, 2, {0.1f,0.1f,0.1f,0.1f})})),
265 box_encodings_info, classes_info, anchors_info, output_boxes_info, output_classes_info,output_scores_info, num_detection_info, detect_info,
expected)
268 &classes_info.clone()->set_is_resizable(
false),
269 &anchors_info.clone()->set_is_resizable(
false),
270 &output_boxes_info.clone()->set_is_resizable(
false),
271 &output_classes_info.clone()->set_is_resizable(
false),
272 &output_scores_info.clone()->set_is_resizable(
false), &num_detection_info.clone()->set_is_resizable(
false), detect_info);
282 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } );
285 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 });
302 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
307 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 });
325 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
330 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 });
350 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } );
354 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 });
371 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
376 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 });
394 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
398 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 });
419 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } );
423 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 });
439 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
440 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
445 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 });
462 DetectionPostProcessLayerInfo
info = DetectionPostProcessLayerInfo(3 , 1 , 0.0 ,
463 0.5 , 2 , { 11.0, 11.0, 6.0, 6.0 } ,
467 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 });