2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
5 #include "Cifar10Database.hpp"
7 #include <boost/numeric/conversion/cast.hpp>
8 #include <boost/log/trivial.hpp>
12 constexpr unsigned int g_kCifar10ImageByteSize = 1 + 3 * 32 * 32;
14 Cifar10Database::Cifar10Database(const std::string& binaryFileDirectory, bool rgbPack)
15 : m_BinaryDirectory(binaryFileDirectory), m_RgbPack(rgbPack)
19 std::unique_ptr<Cifar10Database::TTestCaseData> Cifar10Database::GetTestCaseData(unsigned int testCaseId)
21 std::vector<unsigned char> I(g_kCifar10ImageByteSize);
23 std::string fullpath = m_BinaryDirectory + std::string("test_batch.bin");
25 std::ifstream fileStream(fullpath, std::ios::binary);
26 if (!fileStream.is_open())
28 BOOST_LOG_TRIVIAL(fatal) << "Failed to load " << fullpath;
32 fileStream.seekg(testCaseId * g_kCifar10ImageByteSize, std::ios_base::beg);
33 fileStream.read(reinterpret_cast<char*>(&I[0]), g_kCifar10ImageByteSize);
35 if (!fileStream.good())
37 BOOST_LOG_TRIVIAL(fatal) << "Failed to read " << fullpath;
42 std::vector<float> inputImageData;
43 inputImageData.resize(g_kCifar10ImageByteSize - 1);
46 unsigned int countR_o;
47 unsigned int countG_o;
48 unsigned int countB_o;
49 unsigned int countR = 1;
50 unsigned int countG = 1 + 32 * 32;
51 unsigned int countB = 1 + 2 * 32 * 32;
64 countB_o = 2 * 32 * 32;
68 for (unsigned int h = 0; h < 32; h++)
70 for (unsigned int w = 0; w < 32; w++)
72 inputImageData[countR_o] = boost::numeric_cast<float>(I[countR++]);
73 inputImageData[countG_o] = boost::numeric_cast<float>(I[countG++]);
74 inputImageData[countB_o] = boost::numeric_cast<float>(I[countB++]);
82 const unsigned int label = boost::numeric_cast<unsigned int>(I[0]);
83 return std::make_unique<TTestCaseData>(label, std::move(inputImageData));