2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
5 #include "YoloDatabase.hpp"
7 #include <armnn/Exceptions.hpp>
14 #include <boost/assert.hpp>
15 #include <boost/format.hpp>
16 #include <boost/log/trivial.hpp>
17 #include <boost/numeric/conversion/cast.hpp>
19 #include "InferenceTestImage.hpp"
23 enum class YoloVocClass : unsigned int
48 constexpr auto to_underlying(E e) noexcept
50 return static_cast<std::underlying_type_t<E>>(e);
53 class ImageNotFoundException : public armnn::Exception
55 using Exception::Exception;
58 using YoloInputOutput = std::pair<const char* const, YoloDetectedObject>;
60 const std::array<YoloInputOutput,1> g_PerTestCaseInputOutput =
63 "yolo_dog_448x448.png",
64 { to_underlying(YoloVocClass::Dog), YoloBoundingBox{ 233.0f, 256.0f, 299.0f, 462.0f }, 0.5088733434677124f }
70 YoloDatabase::YoloDatabase(const std::string& imageDir)
71 : m_ImageDir(imageDir)
75 std::unique_ptr<YoloDatabase::TTestCaseData> YoloDatabase::GetTestCaseData(unsigned int testCaseId)
77 testCaseId = testCaseId % boost::numeric_cast<unsigned int>(g_PerTestCaseInputOutput.size());
78 const auto& testCaseInputOutput = g_PerTestCaseInputOutput[testCaseId];
79 const std::string imagePath = m_ImageDir + testCaseInputOutput.first;
81 // Loads test case input image.
82 std::vector<float> imageData;
85 InferenceTestImage image(imagePath.c_str());
86 if (YoloImageWidth != image.GetWidth() || YoloImageHeight != image.GetHeight())
88 image.Resize(YoloImageWidth, YoloImageHeight, CHECK_LOCATION());
90 imageData = GetImageDataInArmNnLayoutAsNormalizedFloats(ImageChannelLayout::Rgb, image);
92 catch (const InferenceTestImageException& e)
94 BOOST_LOG_TRIVIAL(fatal) << "Failed to load test case " << testCaseId << " with error: " << e.what();
98 // Prepares test case output.
99 std::vector<YoloDetectedObject> topObjectDetections;
100 topObjectDetections.reserve(1);
101 topObjectDetections.push_back(testCaseInputOutput.second);
103 return std::make_unique<YoloTestCaseData>(std::move(imageData), std::move(topObjectDetections));