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::Profiler> profiler = std::make_unique<armnn::Profiler>();
154 auto memoryManager = WorkloadFactoryHelper<FactoryType>::GetMemoryManager();
155 FactoryType workloadFactory = WorkloadFactoryHelper<FactoryType>::GetFactory(memoryManager);
157 auto boxEncodings = MakeTensor<T, 3>(boxEncodingsInfo, boxEncodingsData);
167 detectionBoxesResult.outputExpected = MakeTensor<float, 3>(detectionBoxesInfo, expectedDetectionBoxes);
169 detectionClassesResult.outputExpected = MakeTensor<float, 2>(detectionClassesInfo, expectedDetectionClasses);
171 detectionScoresResult.outputExpected = MakeTensor<float, 2>(detectionScoresInfo, expectedDetectionScores);
173 numDetectionsResult.outputExpected = MakeTensor<float, 1>(numDetectionInfo, expectedNumDetections);
175 std::unique_ptr<armnn::ITensorHandle> boxedHandle = workloadFactory.CreateTensorHandle(boxEncodingsInfo);
176 std::unique_ptr<armnn::ITensorHandle> scoreshandle = workloadFactory.CreateTensorHandle(scoresInfo);
177 std::unique_ptr<armnn::ITensorHandle> anchorsHandle = workloadFactory.CreateTensorHandle(anchorsInfo);
178 std::unique_ptr<armnn::ITensorHandle> outputBoxesHandle = workloadFactory.CreateTensorHandle(detectionBoxesInfo);
179 std::unique_ptr<armnn::ITensorHandle> classesHandle = workloadFactory.CreateTensorHandle(detectionClassesInfo);
180 std::unique_ptr<armnn::ITensorHandle> outputScoresHandle = workloadFactory.CreateTensorHandle(detectionScoresInfo);
181 std::unique_ptr<armnn::ITensorHandle> numDetectionHandle = workloadFactory.CreateTensorHandle(numDetectionInfo);
201 AddInputToWorkload(data, info, boxEncodingsInfo, boxedHandle.get());
202 AddInputToWorkload(data, info, scoresInfo, scoreshandle.get());
203 AddOutputToWorkload(data, info, detectionBoxesInfo, outputBoxesHandle.get());
204 AddOutputToWorkload(data, info, detectionClassesInfo, classesHandle.get());
205 AddOutputToWorkload(data, info, detectionScoresInfo, outputScoresHandle.get());
206 AddOutputToWorkload(data, info, numDetectionInfo, numDetectionHandle.get());
208 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDetectionPostProcess(data, info);
210 boxedHandle->Allocate();
211 scoreshandle->Allocate();
212 outputBoxesHandle->Allocate();
213 classesHandle->Allocate();
214 outputScoresHandle->Allocate();
215 numDetectionHandle->Allocate();
227 BOOST_TEST(
CompareTensors(detectionBoxesResult.output, detectionBoxesResult.outputExpected));
228 BOOST_TEST(
CompareTensors(detectionClassesResult.output, detectionClassesResult.outputExpected));
229 BOOST_TEST(
CompareTensors(detectionScoresResult.output, detectionScoresResult.outputExpected));
230 BOOST_TEST(
CompareTensors(numDetectionsResult.output, numDetectionsResult.outputExpected));
233 template<armnn::DataType QuantizedType,
typename RawType = armnn::ResolveType<QuantizedType>>
238 quant[i] = armnn::Quantize<RawType>(
243 template<
typename FactoryType>
246 return DetectionPostProcessImpl<FactoryType, armnn::DataType::Float32>(
250 TestData::s_BoxEncodings,
253 RegularNmsExpectedResults::s_DetectionBoxes,
254 RegularNmsExpectedResults::s_DetectionClasses,
255 RegularNmsExpectedResults::s_DetectionScores,
256 RegularNmsExpectedResults::s_NumDetections,
265 armnn::TensorInfo boxEncodingsInfo(TestData::s_BoxEncodingsShape, QuantizedType);
278 std::vector<RawType> boxEncodingsData(TestData::s_BoxEncodingsShape.GetNumElements());
279 QuantizeData<QuantizedType>(boxEncodingsData.data(),
280 TestData::s_BoxEncodings.data(),
283 std::vector<RawType> scoresData(TestData::s_ScoresShape.GetNumElements());
284 QuantizeData<QuantizedType>(scoresData.data(),
285 TestData::s_Scores.data(),
288 std::vector<RawType> anchorsData(TestData::s_AnchorsShape.GetNumElements());
289 QuantizeData<QuantizedType>(anchorsData.data(),
290 TestData::s_Anchors.data(),
293 return DetectionPostProcessImpl<FactoryType, QuantizedType>(
300 RegularNmsExpectedResults::s_DetectionBoxes,
301 RegularNmsExpectedResults::s_DetectionClasses,
302 RegularNmsExpectedResults::s_DetectionScores,
303 RegularNmsExpectedResults::s_NumDetections,
307 template<
typename FactoryType>
310 return DetectionPostProcessImpl<FactoryType, armnn::DataType::Float32>(
314 TestData::s_BoxEncodings,
317 FastNmsExpectedResults::s_DetectionBoxes,
318 FastNmsExpectedResults::s_DetectionClasses,
319 FastNmsExpectedResults::s_DetectionScores,
320 FastNmsExpectedResults::s_NumDetections,
329 armnn::TensorInfo boxEncodingsInfo(TestData::s_BoxEncodingsShape, QuantizedType);
342 std::vector<RawType> boxEncodingsData(TestData::s_BoxEncodingsShape.GetNumElements());
343 QuantizeData<QuantizedType>(boxEncodingsData.data(),
344 TestData::s_BoxEncodings.data(),
347 std::vector<RawType> scoresData(TestData::s_ScoresShape.GetNumElements());
348 QuantizeData<QuantizedType>(scoresData.data(),
349 TestData::s_Scores.data(),
352 std::vector<RawType> anchorsData(TestData::s_AnchorsShape.GetNumElements());
353 QuantizeData<QuantizedType>(anchorsData.data(),
354 TestData::s_Anchors.data(),
357 return DetectionPostProcessImpl<FactoryType, QuantizedType>(
364 FastNmsExpectedResults::s_DetectionBoxes,
365 FastNmsExpectedResults::s_DetectionClasses,
366 FastNmsExpectedResults::s_DetectionScores,
367 FastNmsExpectedResults::s_NumDetections,
float m_ScaleW
Center size encoding scale weight.
void RegisterProfiler(Profiler *profiler)
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)
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)
const ConstCpuTensorHandle * m_Anchors
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()
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.
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 })