1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #include "YoloDatabase.hpp"
6*89c4ff92SAndroid Build Coastguard Worker
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Exceptions.hpp>
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Logging.hpp>
9*89c4ff92SAndroid Build Coastguard Worker
10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/NumericCast.hpp>
11*89c4ff92SAndroid Build Coastguard Worker
12*89c4ff92SAndroid Build Coastguard Worker #include <array>
13*89c4ff92SAndroid Build Coastguard Worker #include <cstdint>
14*89c4ff92SAndroid Build Coastguard Worker #include <tuple>
15*89c4ff92SAndroid Build Coastguard Worker #include <utility>
16*89c4ff92SAndroid Build Coastguard Worker
17*89c4ff92SAndroid Build Coastguard Worker #include "InferenceTestImage.hpp"
18*89c4ff92SAndroid Build Coastguard Worker
19*89c4ff92SAndroid Build Coastguard Worker namespace
20*89c4ff92SAndroid Build Coastguard Worker {
21*89c4ff92SAndroid Build Coastguard Worker enum class YoloVocClass : unsigned int
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker Aeroplane,
24*89c4ff92SAndroid Build Coastguard Worker Bicycle,
25*89c4ff92SAndroid Build Coastguard Worker Bird,
26*89c4ff92SAndroid Build Coastguard Worker Boat,
27*89c4ff92SAndroid Build Coastguard Worker Bottle,
28*89c4ff92SAndroid Build Coastguard Worker Bus,
29*89c4ff92SAndroid Build Coastguard Worker Car,
30*89c4ff92SAndroid Build Coastguard Worker Cat,
31*89c4ff92SAndroid Build Coastguard Worker Chair,
32*89c4ff92SAndroid Build Coastguard Worker Cow,
33*89c4ff92SAndroid Build Coastguard Worker DiningTable,
34*89c4ff92SAndroid Build Coastguard Worker Dog,
35*89c4ff92SAndroid Build Coastguard Worker Horse,
36*89c4ff92SAndroid Build Coastguard Worker Motorbike,
37*89c4ff92SAndroid Build Coastguard Worker Person,
38*89c4ff92SAndroid Build Coastguard Worker PottedPlant,
39*89c4ff92SAndroid Build Coastguard Worker Sheep,
40*89c4ff92SAndroid Build Coastguard Worker Sofa,
41*89c4ff92SAndroid Build Coastguard Worker Train,
42*89c4ff92SAndroid Build Coastguard Worker TvMonitor
43*89c4ff92SAndroid Build Coastguard Worker };
44*89c4ff92SAndroid Build Coastguard Worker
45*89c4ff92SAndroid Build Coastguard Worker template <typename E>
to_underlying(E e)46*89c4ff92SAndroid Build Coastguard Worker constexpr auto to_underlying(E e) noexcept
47*89c4ff92SAndroid Build Coastguard Worker {
48*89c4ff92SAndroid Build Coastguard Worker return static_cast<std::underlying_type_t<E>>(e);
49*89c4ff92SAndroid Build Coastguard Worker }
50*89c4ff92SAndroid Build Coastguard Worker
51*89c4ff92SAndroid Build Coastguard Worker class ImageNotFoundException : public armnn::Exception
52*89c4ff92SAndroid Build Coastguard Worker {
53*89c4ff92SAndroid Build Coastguard Worker using Exception::Exception;
54*89c4ff92SAndroid Build Coastguard Worker };
55*89c4ff92SAndroid Build Coastguard Worker
56*89c4ff92SAndroid Build Coastguard Worker using YoloInputOutput = std::pair<const char* const, YoloDetectedObject>;
57*89c4ff92SAndroid Build Coastguard Worker
58*89c4ff92SAndroid Build Coastguard Worker const std::array<YoloInputOutput,1> g_PerTestCaseInputOutput =
59*89c4ff92SAndroid Build Coastguard Worker {
60*89c4ff92SAndroid Build Coastguard Worker YoloInputOutput{
61*89c4ff92SAndroid Build Coastguard Worker "yolo_dog_448x448.png",
62*89c4ff92SAndroid Build Coastguard Worker { to_underlying(YoloVocClass::Dog), YoloBoundingBox{ 233.0f, 256.0f, 299.0f, 462.0f }, 0.5088733434677124f }
63*89c4ff92SAndroid Build Coastguard Worker },
64*89c4ff92SAndroid Build Coastguard Worker };
65*89c4ff92SAndroid Build Coastguard Worker
66*89c4ff92SAndroid Build Coastguard Worker } // namespace
67*89c4ff92SAndroid Build Coastguard Worker
YoloDatabase(const std::string & imageDir)68*89c4ff92SAndroid Build Coastguard Worker YoloDatabase::YoloDatabase(const std::string& imageDir)
69*89c4ff92SAndroid Build Coastguard Worker : m_ImageDir(imageDir)
70*89c4ff92SAndroid Build Coastguard Worker {
71*89c4ff92SAndroid Build Coastguard Worker }
72*89c4ff92SAndroid Build Coastguard Worker
GetTestCaseData(unsigned int testCaseId)73*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<YoloDatabase::TTestCaseData> YoloDatabase::GetTestCaseData(unsigned int testCaseId)
74*89c4ff92SAndroid Build Coastguard Worker {
75*89c4ff92SAndroid Build Coastguard Worker testCaseId = testCaseId % armnn::numeric_cast<unsigned int>(g_PerTestCaseInputOutput.size());
76*89c4ff92SAndroid Build Coastguard Worker const auto& testCaseInputOutput = g_PerTestCaseInputOutput[testCaseId];
77*89c4ff92SAndroid Build Coastguard Worker const std::string imagePath = m_ImageDir + testCaseInputOutput.first;
78*89c4ff92SAndroid Build Coastguard Worker
79*89c4ff92SAndroid Build Coastguard Worker // Loads test case input image.
80*89c4ff92SAndroid Build Coastguard Worker std::vector<float> imageData;
81*89c4ff92SAndroid Build Coastguard Worker try
82*89c4ff92SAndroid Build Coastguard Worker {
83*89c4ff92SAndroid Build Coastguard Worker InferenceTestImage image(imagePath.c_str());
84*89c4ff92SAndroid Build Coastguard Worker if (YoloImageWidth != image.GetWidth() || YoloImageHeight != image.GetHeight())
85*89c4ff92SAndroid Build Coastguard Worker {
86*89c4ff92SAndroid Build Coastguard Worker image.Resize(YoloImageWidth, YoloImageHeight, CHECK_LOCATION());
87*89c4ff92SAndroid Build Coastguard Worker }
88*89c4ff92SAndroid Build Coastguard Worker imageData = GetImageDataInArmNnLayoutAsNormalizedFloats(ImageChannelLayout::Rgb, image);
89*89c4ff92SAndroid Build Coastguard Worker }
90*89c4ff92SAndroid Build Coastguard Worker catch (const InferenceTestImageException& e)
91*89c4ff92SAndroid Build Coastguard Worker {
92*89c4ff92SAndroid Build Coastguard Worker ARMNN_LOG(fatal) << "Failed to load test case " << testCaseId << " with error: " << e.what();
93*89c4ff92SAndroid Build Coastguard Worker return nullptr;
94*89c4ff92SAndroid Build Coastguard Worker }
95*89c4ff92SAndroid Build Coastguard Worker
96*89c4ff92SAndroid Build Coastguard Worker // Prepares test case output.
97*89c4ff92SAndroid Build Coastguard Worker std::vector<YoloDetectedObject> topObjectDetections;
98*89c4ff92SAndroid Build Coastguard Worker topObjectDetections.reserve(1);
99*89c4ff92SAndroid Build Coastguard Worker topObjectDetections.push_back(testCaseInputOutput.second);
100*89c4ff92SAndroid Build Coastguard Worker
101*89c4ff92SAndroid Build Coastguard Worker return std::make_unique<YoloTestCaseData>(std::move(imageData), std::move(topObjectDetections));
102*89c4ff92SAndroid Build Coastguard Worker }
103