blob: 9a53456e81e0513beb6e206b755ae011d16e8c2c [file] [log] [blame]
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <armnn/INetwork.hpp>
9#include <backendsCommon/test/CommonTestUtils.hpp>
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010010#include <ResolveType.hpp>
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +000011
12namespace{
13
14template<typename T>
15armnn::INetworkPtr CreateDetectionPostProcessNetwork(const armnn::TensorInfo& boxEncodingsInfo,
16 const armnn::TensorInfo& scoresInfo,
17 const armnn::TensorInfo& anchorsInfo,
18 const std::vector<T>& anchors,
19 bool useRegularNms)
20{
21 armnn::TensorInfo detectionBoxesInfo({ 1, 3, 4 }, armnn::DataType::Float32);
22 armnn::TensorInfo detectionScoresInfo({ 1, 3 }, armnn::DataType::Float32);
23 armnn::TensorInfo detectionClassesInfo({ 1, 3 }, armnn::DataType::Float32);
24 armnn::TensorInfo numDetectionInfo({ 1 }, armnn::DataType::Float32);
25
26 armnn::DetectionPostProcessDescriptor desc;
27 desc.m_UseRegularNms = useRegularNms;
28 desc.m_MaxDetections = 3;
29 desc.m_MaxClassesPerDetection = 1;
30 desc.m_DetectionsPerClass =1;
31 desc.m_NmsScoreThreshold = 0.0;
32 desc.m_NmsIouThreshold = 0.5;
33 desc.m_NumClasses = 2;
34 desc.m_ScaleY = 10.0;
35 desc.m_ScaleX = 10.0;
36 desc.m_ScaleH = 5.0;
37 desc.m_ScaleW = 5.0;
38
39 armnn::INetworkPtr net(armnn::INetwork::Create());
40
41 armnn::IConnectableLayer* boxesLayer = net->AddInputLayer(0);
42 armnn::IConnectableLayer* scoresLayer = net->AddInputLayer(1);
43 armnn::ConstTensor anchorsTensor(anchorsInfo, anchors.data());
44 armnn::IConnectableLayer* detectionLayer = net->AddDetectionPostProcessLayer(desc, anchorsTensor,
45 "DetectionPostProcess");
46 armnn::IConnectableLayer* detectionBoxesLayer = net->AddOutputLayer(0, "detectionBoxes");
47 armnn::IConnectableLayer* detectionClassesLayer = net->AddOutputLayer(1, "detectionClasses");
48 armnn::IConnectableLayer* detectionScoresLayer = net->AddOutputLayer(2, "detectionScores");
49 armnn::IConnectableLayer* numDetectionLayer = net->AddOutputLayer(3, "numDetection");
50 Connect(boxesLayer, detectionLayer, boxEncodingsInfo, 0, 0);
51 Connect(scoresLayer, detectionLayer, scoresInfo, 0, 1);
52 Connect(detectionLayer, detectionBoxesLayer, detectionBoxesInfo, 0, 0);
53 Connect(detectionLayer, detectionClassesLayer, detectionClassesInfo, 1, 0);
54 Connect(detectionLayer, detectionScoresLayer, detectionScoresInfo, 2, 0);
55 Connect(detectionLayer, numDetectionLayer, numDetectionInfo, 3, 0);
56
57 return net;
58}
59
60template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
61void DetectionPostProcessEndToEnd(const std::vector<BackendId>& backends, bool useRegularNms,
62 const std::vector<T>& boxEncodings,
63 const std::vector<T>& scores,
64 const std::vector<T>& anchors,
65 const std::vector<float>& expectedDetectionBoxes,
66 const std::vector<float>& expectedDetectionClasses,
67 const std::vector<float>& expectedDetectionScores,
68 const std::vector<float>& expectedNumDetections,
69 float boxScale = 1.0f,
70 int32_t boxOffset = 0,
71 float scoreScale = 1.0f,
72 int32_t scoreOffset = 0,
73 float anchorScale = 1.0f,
74 int32_t anchorOffset = 0)
75{
76 armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, ArmnnType);
77 armnn::TensorInfo scoresInfo({ 1, 6, 3}, ArmnnType);
78 armnn::TensorInfo anchorsInfo({ 6, 4 }, ArmnnType);
79
80 boxEncodingsInfo.SetQuantizationScale(boxScale);
81 boxEncodingsInfo.SetQuantizationOffset(boxOffset);
82 scoresInfo.SetQuantizationScale(scoreScale);
83 scoresInfo.SetQuantizationOffset(scoreOffset);
84 anchorsInfo.SetQuantizationScale(anchorScale);
85 anchorsInfo.SetQuantizationOffset(anchorOffset);
86
87 // Builds up the structure of the network
88 armnn::INetworkPtr net = CreateDetectionPostProcessNetwork<T>(boxEncodingsInfo, scoresInfo,
89 anchorsInfo, anchors, useRegularNms);
90
91 BOOST_TEST_CHECKPOINT("create a network");
92
93 std::map<int, std::vector<T>> inputTensorData = {{ 0, boxEncodings }, { 1, scores }};
94 std::map<int, std::vector<float>> expectedOutputData = {{ 0, expectedDetectionBoxes },
95 { 1, expectedDetectionClasses },
96 { 2, expectedDetectionScores },
97 { 3, expectedNumDetections }};
98
99 EndToEndLayerTestImpl<ArmnnType, armnn::DataType::Float32>(
100 move(net), inputTensorData, expectedOutputData, backends);
101}
102
103template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
104void DetectionPostProcessRegularNmsEndToEnd(const std::vector<BackendId>& backends,
105 const std::vector<T>& boxEncodings,
106 const std::vector<T>& scores,
107 const std::vector<T>& anchors,
108 float boxScale = 1.0f,
109 int32_t boxOffset = 0,
110 float scoreScale = 1.0f,
111 int32_t scoreOffset = 0,
112 float anchorScale = 1.0f,
113 int32_t anchorOffset = 0)
114{
115 std::vector<float> expectedDetectionBoxes({
116 0.0f, 10.0f, 1.0f, 11.0f,
117 0.0f, 10.0f, 1.0f, 11.0f,
118 0.0f, 0.0f, 0.0f, 0.0f
119 });
120 std::vector<float> expectedDetectionScores({ 0.95f, 0.93f, 0.0f });
121 std::vector<float> expectedDetectionClasses({ 1.0f, 0.0f, 0.0f });
122 std::vector<float> expectedNumDetections({ 2.0f });
123
124 DetectionPostProcessEndToEnd<ArmnnType>(backends, true, boxEncodings, scores, anchors,
125 expectedDetectionBoxes, expectedDetectionClasses,
126 expectedDetectionScores, expectedNumDetections,
127 boxScale, boxOffset, scoreScale, scoreOffset,
128 anchorScale, anchorOffset);
129
130};
131
132
133template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
134void DetectionPostProcessFastNmsEndToEnd(const std::vector<BackendId>& backends,
135 const std::vector<T>& boxEncodings,
136 const std::vector<T>& scores,
137 const std::vector<T>& anchors,
138 float boxScale = 1.0f,
139 int32_t boxOffset = 0,
140 float scoreScale = 1.0f,
141 int32_t scoreOffset = 0,
142 float anchorScale = 1.0f,
143 int32_t anchorOffset = 0)
144{
145 std::vector<float> expectedDetectionBoxes({
146 0.0f, 10.0f, 1.0f, 11.0f,
147 0.0f, 0.0f, 1.0f, 1.0f,
148 0.0f, 100.0f, 1.0f, 101.0f
149 });
150 std::vector<float> expectedDetectionScores({ 0.95f, 0.9f, 0.3f });
151 std::vector<float> expectedDetectionClasses({ 1.0f, 0.0f, 0.0f });
152 std::vector<float> expectedNumDetections({ 3.0f });
153
154 DetectionPostProcessEndToEnd<ArmnnType>(backends, false, boxEncodings, scores, anchors,
155 expectedDetectionBoxes, expectedDetectionClasses,
156 expectedDetectionScores, expectedNumDetections,
157 boxScale, boxOffset, scoreScale, scoreOffset,
158 anchorScale, anchorOffset);
159
160};
161
162} // anonymous namespace