24 using FloatData = std::vector<float>;
25 using QuantData = std::pair<float, int32_t>;
33 static const QuantData s_BoxEncodingsQuantData;
34 static const QuantData s_ScoresQuantData;
35 static const QuantData s_AnchorsQuantData;
37 static const FloatData s_BoxEncodings;
38 static const FloatData s_Scores;
39 static const FloatData s_Anchors;
42 struct RegularNmsExpectedResults
44 static const FloatData s_DetectionBoxes;
45 static const FloatData s_DetectionScores;
46 static const FloatData s_DetectionClasses;
47 static const FloatData s_NumDetections;
50 struct FastNmsExpectedResults
52 static const FloatData s_DetectionBoxes;
53 static const FloatData s_DetectionScores;
54 static const FloatData s_DetectionClasses;
55 static const FloatData s_NumDetections;
62 const QuantData TestData::s_BoxEncodingsQuantData = { 1.00f, 1 };
63 const QuantData TestData::s_ScoresQuantData = { 0.01f, 0 };
64 const QuantData TestData::s_AnchorsQuantData = { 0.50f, 0 };
66 const FloatData TestData::s_BoxEncodings =
68 0.0f, 0.0f, 0.0f, 0.0f,
69 0.0f, 1.0f, 0.0f, 0.0f,
70 0.0f, -1.0f, 0.0f, 0.0f,
71 0.0f, 0.0f, 0.0f, 0.0f,
72 0.0f, 1.0f, 0.0f, 0.0f,
73 0.0f, 0.0f, 0.0f, 0.0f
76 const FloatData TestData::s_Scores =
86 const FloatData TestData::s_Anchors =
88 0.5f, 0.5f, 1.0f, 1.0f,
89 0.5f, 0.5f, 1.0f, 1.0f,
90 0.5f, 0.5f, 1.0f, 1.0f,
91 0.5f, 10.5f, 1.0f, 1.0f,
92 0.5f, 10.5f, 1.0f, 1.0f,
93 0.5f, 100.5f, 1.0f, 1.0f
96 const FloatData RegularNmsExpectedResults::s_DetectionBoxes =
98 0.0f, 10.0f, 1.0f, 11.0f,
99 0.0f, 10.0f, 1.0f, 11.0f,
100 0.0f, 0.0f, 0.0f, 0.0f
103 const FloatData RegularNmsExpectedResults::s_DetectionScores =
108 const FloatData RegularNmsExpectedResults::s_DetectionClasses =
113 const FloatData RegularNmsExpectedResults::s_NumDetections = { 2.0f };
115 const FloatData FastNmsExpectedResults::s_DetectionBoxes =
117 0.0f, 10.0f, 1.0f, 11.0f,
118 0.0f, 0.0f, 1.0f, 1.0f,
119 0.0f, 100.0f, 1.0f, 101.0f
122 const FloatData FastNmsExpectedResults::s_DetectionScores =
127 const FloatData FastNmsExpectedResults::s_DetectionClasses =
132 const FloatData FastNmsExpectedResults::s_NumDetections = { 3.0f };
142 const std::vector<T>& boxEncodingsData,
143 const std::vector<T>& scoresData,
144 const std::vector<T>& anchorsData,
145 const std::vector<float>& expectedDetectionBoxes,
146 const std::vector<float>& expectedDetectionClasses,
147 const std::vector<float>& expectedDetectionScores,
148 const std::vector<float>& expectedNumDetections,
151 std::unique_ptr<armnn::IProfiler> profiler = std::make_unique<armnn::IProfiler>();
154 auto memoryManager = WorkloadFactoryHelper<FactoryType>::GetMemoryManager();
155 FactoryType workloadFactory = WorkloadFactoryHelper<FactoryType>::GetFactory(memoryManager);
156 auto tensorHandleFactory = WorkloadFactoryHelper<FactoryType>::GetTensorHandleFactory(memoryManager);
158 auto boxEncodings = MakeTensor<T, 3>(boxEncodingsInfo, boxEncodingsData);
168 detectionBoxesResult.outputExpected = MakeTensor<float, 3>(detectionBoxesInfo, expectedDetectionBoxes);
170 detectionClassesResult.outputExpected = MakeTensor<float, 2>(detectionClassesInfo, expectedDetectionClasses);
172 detectionScoresResult.outputExpected = MakeTensor<float, 2>(detectionScoresInfo, expectedDetectionScores);
174 numDetectionsResult.outputExpected = MakeTensor<float, 1>(numDetectionInfo, expectedNumDetections);
176 auto boxedHandle = tensorHandleFactory.CreateTensorHandle(boxEncodingsInfo);
177 auto scoreshandle = tensorHandleFactory.CreateTensorHandle(scoresInfo);
178 auto anchorsHandle = tensorHandleFactory.CreateTensorHandle(anchorsInfo);
179 auto outputBoxesHandle = tensorHandleFactory.CreateTensorHandle(detectionBoxesInfo);
180 auto classesHandle = tensorHandleFactory.CreateTensorHandle(detectionClassesInfo);
181 auto outputScoresHandle = tensorHandleFactory.CreateTensorHandle(detectionScoresInfo);
182 auto numDetectionHandle = tensorHandleFactory.CreateTensorHandle(numDetectionInfo);
202 AddInputToWorkload(data, info, boxEncodingsInfo, boxedHandle.get());
203 AddInputToWorkload(data, info, scoresInfo, scoreshandle.get());
204 AddOutputToWorkload(data, info, detectionBoxesInfo, outputBoxesHandle.get());
205 AddOutputToWorkload(data, info, detectionClassesInfo, classesHandle.get());
206 AddOutputToWorkload(data, info, detectionScoresInfo, outputScoresHandle.get());
207 AddOutputToWorkload(data, info, numDetectionInfo, numDetectionHandle.get());
209 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDetectionPostProcess(data, info);
211 boxedHandle->Allocate();
212 scoreshandle->Allocate();
213 outputBoxesHandle->Allocate();
214 classesHandle->Allocate();
215 outputScoresHandle->Allocate();
216 numDetectionHandle->Allocate();
228 BOOST_TEST(
CompareTensors(detectionBoxesResult.output, detectionBoxesResult.outputExpected));
229 BOOST_TEST(
CompareTensors(detectionClassesResult.output, detectionClassesResult.outputExpected));
230 BOOST_TEST(
CompareTensors(detectionScoresResult.output, detectionScoresResult.outputExpected));
231 BOOST_TEST(
CompareTensors(numDetectionsResult.output, numDetectionsResult.outputExpected));
234 template<armnn::DataType QuantizedType,
typename RawType = armnn::ResolveType<QuantizedType>>
239 quant[i] = armnn::Quantize<RawType>(
244 template<
typename FactoryType>
247 return DetectionPostProcessImpl<FactoryType, armnn::DataType::Float32>(
251 TestData::s_BoxEncodings,
254 RegularNmsExpectedResults::s_DetectionBoxes,
255 RegularNmsExpectedResults::s_DetectionClasses,
256 RegularNmsExpectedResults::s_DetectionScores,
257 RegularNmsExpectedResults::s_NumDetections,
266 armnn::TensorInfo boxEncodingsInfo(TestData::s_BoxEncodingsShape, QuantizedType);
279 std::vector<RawType> boxEncodingsData(TestData::s_BoxEncodingsShape.GetNumElements());
280 QuantizeData<QuantizedType>(boxEncodingsData.data(),
281 TestData::s_BoxEncodings.data(),
284 std::vector<RawType> scoresData(TestData::s_ScoresShape.GetNumElements());
285 QuantizeData<QuantizedType>(scoresData.data(),
286 TestData::s_Scores.data(),
289 std::vector<RawType> anchorsData(TestData::s_AnchorsShape.GetNumElements());
290 QuantizeData<QuantizedType>(anchorsData.data(),
291 TestData::s_Anchors.data(),
294 return DetectionPostProcessImpl<FactoryType, QuantizedType>(
301 RegularNmsExpectedResults::s_DetectionBoxes,
302 RegularNmsExpectedResults::s_DetectionClasses,
303 RegularNmsExpectedResults::s_DetectionScores,
304 RegularNmsExpectedResults::s_NumDetections,
308 template<
typename FactoryType>
311 return DetectionPostProcessImpl<FactoryType, armnn::DataType::Float32>(
315 TestData::s_BoxEncodings,
318 FastNmsExpectedResults::s_DetectionBoxes,
319 FastNmsExpectedResults::s_DetectionClasses,
320 FastNmsExpectedResults::s_DetectionScores,
321 FastNmsExpectedResults::s_NumDetections,
330 armnn::TensorInfo boxEncodingsInfo(TestData::s_BoxEncodingsShape, QuantizedType);
343 std::vector<RawType> boxEncodingsData(TestData::s_BoxEncodingsShape.GetNumElements());
344 QuantizeData<QuantizedType>(boxEncodingsData.data(),
345 TestData::s_BoxEncodings.data(),
348 std::vector<RawType> scoresData(TestData::s_ScoresShape.GetNumElements());
349 QuantizeData<QuantizedType>(scoresData.data(),
350 TestData::s_Scores.data(),
353 std::vector<RawType> anchorsData(TestData::s_AnchorsShape.GetNumElements());
354 QuantizeData<QuantizedType>(anchorsData.data(),
355 TestData::s_Anchors.data(),
358 return DetectionPostProcessImpl<FactoryType, QuantizedType>(
365 FastNmsExpectedResults::s_DetectionBoxes,
366 FastNmsExpectedResults::s_DetectionClasses,
367 FastNmsExpectedResults::s_DetectionScores,
368 FastNmsExpectedResults::s_NumDetections,
float m_ScaleW
Center size encoding scale weight.
static ProfilerManager & GetInstance()
void QuantizeData(RawType *quant, const float *dequant, const armnn::TensorInfo &info)
float m_ScaleX
Center size encoding scale x.
boost::test_tools::predicate_result CompareTensors(const boost::multi_array< T, n > &a, const boost::multi_array< T, n > &b, bool compareBoolean=false, bool isDynamic=false)
uint32_t m_DetectionsPerClass
Detections per classes, used in Regular NMS.
armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32)
void DetectionPostProcessImpl(const armnn::TensorInfo &boxEncodingsInfo, const armnn::TensorInfo &scoresInfo, const armnn::TensorInfo &anchorsInfo, const std::vector< T > &boxEncodingsData, const std::vector< T > &scoresData, const std::vector< T > &anchorsData, const std::vector< float > &expectedDetectionBoxes, const std::vector< float > &expectedDetectionClasses, const std::vector< float > &expectedDetectionScores, const std::vector< float > &expectedNumDetections, bool useRegularNms)
typename ResolveTypeImpl< DT >::Type ResolveType
std::vector< float > boxEncodings({ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f })
LayerDescriptor m_Parameters
void DetectionPostProcessRegularNmsFloatTest()
uint32_t m_MaxClassesPerDetection
Maximum numbers of classes per detection, used in Fast NMS.
uint32_t m_MaxDetections
Maximum numbers of detections.
void DetectionPostProcessRegularNmsQuantizedTest()
float m_NmsIouThreshold
Intersection over union threshold.
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
uint32_t m_NumClasses
Number of classes.
void SetQuantizationScale(float scale)
void AllocateAndCopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
bool m_UseRegularNms
Use Regular NMS.
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
float m_ScaleH
Center size encoding scale height.
void DetectionPostProcessFastNmsQuantizedTest()
void RegisterProfiler(IProfiler *profiler)
std::vector< float > scores({ 0.0f, 0.9f, 0.8f, 0.0f, 0.75f, 0.72f, 0.0f, 0.6f, 0.5f, 0.0f, 0.93f, 0.95f, 0.0f, 0.5f, 0.4f, 0.0f, 0.3f, 0.2f })
ClWorkloadFactory FactoryType
void DetectionPostProcessFastNmsFloatTest()
armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32)
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
float m_ScaleY
Center size encoding scale y.
const ConstTensorHandle * m_Anchors
float m_NmsScoreThreshold
NMS score threshold.
unsigned int GetNumElements() const
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
std::vector< float > anchors({ 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 100.5f, 1.0f, 1.0f })