blob: 9e90da50323705ab64e1d81dd2083a07858b53d1 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
telsoa014fcda012018-03-09 14:13:49 +00002// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#include "Cifar10Database.hpp"
6
Derek Lamberti08446972019-11-26 16:38:31 +00007#include <armnn/Logging.hpp>
Matthew Sloyan80c6b142020-09-08 12:00:32 +01008#include <armnn/utility/NumericCast.hpp>
Derek Lamberti08446972019-11-26 16:38:31 +00009
telsoa014fcda012018-03-09 14:13:49 +000010#include <fstream>
11#include <vector>
12
13constexpr unsigned int g_kCifar10ImageByteSize = 1 + 3 * 32 * 32;
14
15Cifar10Database::Cifar10Database(const std::string& binaryFileDirectory, bool rgbPack)
16 : m_BinaryDirectory(binaryFileDirectory), m_RgbPack(rgbPack)
17{
18}
19
20std::unique_ptr<Cifar10Database::TTestCaseData> Cifar10Database::GetTestCaseData(unsigned int testCaseId)
21{
22 std::vector<unsigned char> I(g_kCifar10ImageByteSize);
23
24 std::string fullpath = m_BinaryDirectory + std::string("test_batch.bin");
25
26 std::ifstream fileStream(fullpath, std::ios::binary);
27 if (!fileStream.is_open())
28 {
Derek Lamberti08446972019-11-26 16:38:31 +000029 ARMNN_LOG(fatal) << "Failed to load " << fullpath;
telsoa014fcda012018-03-09 14:13:49 +000030 return nullptr;
31 }
32
33 fileStream.seekg(testCaseId * g_kCifar10ImageByteSize, std::ios_base::beg);
34 fileStream.read(reinterpret_cast<char*>(&I[0]), g_kCifar10ImageByteSize);
35
36 if (!fileStream.good())
37 {
Derek Lamberti08446972019-11-26 16:38:31 +000038 ARMNN_LOG(fatal) << "Failed to read " << fullpath;
telsoa014fcda012018-03-09 14:13:49 +000039 return nullptr;
40 }
41
42
43 std::vector<float> inputImageData;
44 inputImageData.resize(g_kCifar10ImageByteSize - 1);
45
46 unsigned int step;
47 unsigned int countR_o;
48 unsigned int countG_o;
49 unsigned int countB_o;
50 unsigned int countR = 1;
51 unsigned int countG = 1 + 32 * 32;
52 unsigned int countB = 1 + 2 * 32 * 32;
53
54 if (m_RgbPack)
55 {
56 countR_o = 0;
57 countG_o = 1;
58 countB_o = 2;
59 step = 3;
60 }
61 else
62 {
63 countR_o = 0;
64 countG_o = 32 * 32;
65 countB_o = 2 * 32 * 32;
66 step = 1;
67 }
68
69 for (unsigned int h = 0; h < 32; h++)
70 {
71 for (unsigned int w = 0; w < 32; w++)
72 {
Matthew Sloyan80c6b142020-09-08 12:00:32 +010073 // Static_cast of unsigned char is safe with float
74 inputImageData[countR_o] = static_cast<float>(I[countR++]);
75 inputImageData[countG_o] = static_cast<float>(I[countG++]);
76 inputImageData[countB_o] = static_cast<float>(I[countB++]);
telsoa014fcda012018-03-09 14:13:49 +000077
78 countR_o += step;
79 countG_o += step;
80 countB_o += step;
81 }
82 }
83
Matthew Sloyan80c6b142020-09-08 12:00:32 +010084 const unsigned int label = armnn::numeric_cast<unsigned int>(I[0]);
telsoa014fcda012018-03-09 14:13:49 +000085 return std::make_unique<TTestCaseData>(label, std::move(inputImageData));
86}