From 6940dd720ebb6b3d1df8ca203ab696daefe58189 Mon Sep 17 00:00:00 2001 From: Jim Flynn Date: Fri, 20 Mar 2020 12:25:56 +0000 Subject: renamed Documentation folder 20.02 and added .nojekyll file Signed-off-by: Jim Flynn --- 20.02/class_yolo_test_case.xhtml | 264 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 20.02/class_yolo_test_case.xhtml (limited to '20.02/class_yolo_test_case.xhtml') diff --git a/20.02/class_yolo_test_case.xhtml b/20.02/class_yolo_test_case.xhtml new file mode 100644 index 0000000000..83295b4232 --- /dev/null +++ b/20.02/class_yolo_test_case.xhtml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + +ArmNN: YoloTestCase< Model > Class Template Reference + + + + + + + + + + + + + + + + +
+
+ + + + ArmNN + + + +
+
+  20.02 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
YoloTestCase< Model > Class Template Reference
+
+
+ +

#include <YoloInferenceTest.hpp>

+
+Inheritance diagram for YoloTestCase< Model >:
+
+
+ + +InferenceModelTestCase< Model > +IInferenceTestCase + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 YoloTestCase (Model &model, unsigned int testCaseId, YoloTestCaseData &testCaseData)
 
virtual TestCaseResult ProcessResult (const InferenceTestOptions &options) override
 
- Public Member Functions inherited from InferenceModelTestCase< Model >
 InferenceModelTestCase (Model &model, unsigned int testCaseId, const std::vector< TContainer > &inputs, const std::vector< unsigned int > &outputSizes)
 
virtual void Run () override
 
- Public Member Functions inherited from IInferenceTestCase
virtual ~IInferenceTestCase ()
 
+ + + + + + + + + +

+Additional Inherited Members

- Public Types inherited from InferenceModelTestCase< Model >
using TContainer = boost::variant< std::vector< float >, std::vector< int >, std::vector< unsigned char > >
 
- Protected Member Functions inherited from InferenceModelTestCase< Model >
unsigned int GetTestCaseId () const
 
const std::vector< TContainer > & GetOutputs () const
 
+

Detailed Description

+

template<typename Model>
+class YoloTestCase< Model >

+ + +

Definition at line 23 of file YoloInferenceTest.hpp.

+

Constructor & Destructor Documentation

+ +

◆ YoloTestCase()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
YoloTestCase (Model & model,
unsigned int testCaseId,
YoloTestCaseDatatestCaseData 
)
+
+inline
+
+ +

Definition at line 26 of file YoloInferenceTest.hpp.

+ +

References YoloTestCaseData::m_InputImage, and YoloOutputSize.

+
29  : InferenceModelTestCase<Model>(model, testCaseId, { std::move(testCaseData.m_InputImage) }, { YoloOutputSize })
30  , m_FloatComparer(boost::math::fpc::percent_tolerance(1.0f))
31  , m_TopObjectDetections(std::move(testCaseData.m_TopObjectDetections))
32  {
33  }
constexpr size_t YoloOutputSize
+ +
std::vector< float > m_InputImage
+
std::vector< YoloDetectedObject > m_TopObjectDetections
+
+
+
+

Member Function Documentation

+ +

◆ ProcessResult()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual TestCaseResult ProcessResult (const InferenceTestOptionsoptions)
+
+inlineoverridevirtual
+
+ +

Implements IInferenceTestCase.

+ +

Definition at line 35 of file YoloInferenceTest.hpp.

+ +

References ARMNN_LOG, InferenceModelTestCase< Model >::GetOutputs(), InferenceModelTestCase< Model >::GetTestCaseId(), armnn::IgnoreUnused(), YoloDetectedObject::m_Box, YoloDetectedObject::m_Class, YoloDetectedObject::m_Confidence, YoloBoundingBox::m_H, YoloBoundingBox::m_W, YoloBoundingBox::m_X, YoloBoundingBox::m_Y, YoloImageHeight, YoloImageWidth, and YoloOutputSize.

+
36  {
37  armnn::IgnoreUnused(options);
38 
39  using Boost3dArray = boost::multi_array<float, 3>;
40 
41  const std::vector<float>& output = boost::get<std::vector<float>>(this->GetOutputs()[0]);
42  BOOST_ASSERT(output.size() == YoloOutputSize);
43 
44  constexpr Boost3dArray::index gridSize = 7;
45  constexpr Boost3dArray::index numClasses = 20;
46  constexpr Boost3dArray::index numScales = 2;
47 
48  const float* outputPtr = output.data();
49 
50  // Range 0-980. Class probabilities. 7x7x20
51  Boost3dArray classProbabilities(boost::extents[gridSize][gridSize][numClasses]);
52  for (Boost3dArray::index y = 0; y < gridSize; ++y)
53  {
54  for (Boost3dArray::index x = 0; x < gridSize; ++x)
55  {
56  for (Boost3dArray::index c = 0; c < numClasses; ++c)
57  {
58  classProbabilities[y][x][c] = *outputPtr++;
59  }
60  }
61  }
62 
63  // Range 980-1078. Scales. 7x7x2
64  Boost3dArray scales(boost::extents[gridSize][gridSize][numScales]);
65  for (Boost3dArray::index y = 0; y < gridSize; ++y)
66  {
67  for (Boost3dArray::index x = 0; x < gridSize; ++x)
68  {
69  for (Boost3dArray::index s = 0; s < numScales; ++s)
70  {
71  scales[y][x][s] = *outputPtr++;
72  }
73  }
74  }
75 
76  // Range 1078-1469. Bounding boxes. 7x7x2x4
77  constexpr float imageWidthAsFloat = static_cast<float>(YoloImageWidth);
78  constexpr float imageHeightAsFloat = static_cast<float>(YoloImageHeight);
79 
80  boost::multi_array<float, 4> boxes(boost::extents[gridSize][gridSize][numScales][4]);
81  for (Boost3dArray::index y = 0; y < gridSize; ++y)
82  {
83  for (Boost3dArray::index x = 0; x < gridSize; ++x)
84  {
85  for (Boost3dArray::index s = 0; s < numScales; ++s)
86  {
87  float bx = *outputPtr++;
88  float by = *outputPtr++;
89  float bw = *outputPtr++;
90  float bh = *outputPtr++;
91 
92  boxes[y][x][s][0] = ((bx + static_cast<float>(x)) / 7.0f) * imageWidthAsFloat;
93  boxes[y][x][s][1] = ((by + static_cast<float>(y)) / 7.0f) * imageHeightAsFloat;
94  boxes[y][x][s][2] = bw * bw * static_cast<float>(imageWidthAsFloat);
95  boxes[y][x][s][3] = bh * bh * static_cast<float>(imageHeightAsFloat);
96  }
97  }
98  }
99  BOOST_ASSERT(output.data() + YoloOutputSize == outputPtr);
100 
101  std::vector<YoloDetectedObject> detectedObjects;
102  detectedObjects.reserve(gridSize * gridSize * numScales * numClasses);
103 
104  for (Boost3dArray::index y = 0; y < gridSize; ++y)
105  {
106  for (Boost3dArray::index x = 0; x < gridSize; ++x)
107  {
108  for (Boost3dArray::index s = 0; s < numScales; ++s)
109  {
110  for (Boost3dArray::index c = 0; c < numClasses; ++c)
111  {
112  // Resolved confidence: class probabilities * scales.
113  const float confidence = classProbabilities[y][x][c] * scales[y][x][s];
114 
115  // Resolves bounding box and stores.
116  YoloBoundingBox box;
117  box.m_X = boxes[y][x][s][0];
118  box.m_Y = boxes[y][x][s][1];
119  box.m_W = boxes[y][x][s][2];
120  box.m_H = boxes[y][x][s][3];
121 
122  detectedObjects.emplace_back(c, box, confidence);
123  }
124  }
125  }
126  }
127 
128  // Sorts detected objects by confidence.
129  std::sort(detectedObjects.begin(), detectedObjects.end(),
130  [](const YoloDetectedObject& a, const YoloDetectedObject& b)
131  {
132  // Sorts by largest confidence first, then by class.
133  return a.m_Confidence > b.m_Confidence
134  || (a.m_Confidence == b.m_Confidence && a.m_Class > b.m_Class);
135  });
136 
137  // Checks the top N detections.
138  auto outputIt = detectedObjects.begin();
139  auto outputEnd = detectedObjects.end();
140 
141  for (const YoloDetectedObject& expectedDetection : m_TopObjectDetections)
142  {
143  if (outputIt == outputEnd)
144  {
145  // Somehow expected more things to check than detections found by the model.
146  return TestCaseResult::Abort;
147  }
148 
149  const YoloDetectedObject& detectedObject = *outputIt;
150  if (detectedObject.m_Class != expectedDetection.m_Class)
151  {
152  ARMNN_LOG(error) << "Prediction for test case " << this->GetTestCaseId() <<
153  " is incorrect: Expected (" << expectedDetection.m_Class << ")" <<
154  " but predicted (" << detectedObject.m_Class << ")";
155  return TestCaseResult::Failed;
156  }
157 
158  if (!m_FloatComparer(detectedObject.m_Box.m_X, expectedDetection.m_Box.m_X) ||
159  !m_FloatComparer(detectedObject.m_Box.m_Y, expectedDetection.m_Box.m_Y) ||
160  !m_FloatComparer(detectedObject.m_Box.m_W, expectedDetection.m_Box.m_W) ||
161  !m_FloatComparer(detectedObject.m_Box.m_H, expectedDetection.m_Box.m_H) ||
162  !m_FloatComparer(detectedObject.m_Confidence, expectedDetection.m_Confidence))
163  {
164  ARMNN_LOG(error) << "Detected bounding box for test case " << this->GetTestCaseId() <<
165  " is incorrect";
166  return TestCaseResult::Failed;
167  }
168 
169  ++outputIt;
170  }
171 
172  return TestCaseResult::Ok;
173  }
constexpr unsigned int YoloImageHeight
+ + + +
const std::vector< TContainer > & GetOutputs() const
+
#define ARMNN_LOG(severity)
Definition: Logging.hpp:163
+
void IgnoreUnused(Ts &&...)
+
YoloBoundingBox m_Box
+ + + + +
constexpr size_t YoloOutputSize
+
constexpr unsigned int YoloImageWidth
+
unsigned int m_Class
+ +
+
+
+
The documentation for this class was generated from the following file: +
+
+ + + + -- cgit v1.2.1