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 #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include "ClassifierTestCaseData.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <array> 10*89c4ff92SAndroid Build Coastguard Worker #include <string> 11*89c4ff92SAndroid Build Coastguard Worker #include <vector> 12*89c4ff92SAndroid Build Coastguard Worker #include <memory> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker ///Tf requires RGB images, normalized in range [0, 1] and resized using Bilinear algorithm 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker using ImageSet = std::pair<const std::string, unsigned int>; 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker template <typename TDataType> 20*89c4ff92SAndroid Build Coastguard Worker class ImagePreprocessor 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker public: 23*89c4ff92SAndroid Build Coastguard Worker using DataType = TDataType; 24*89c4ff92SAndroid Build Coastguard Worker using TTestCaseData = ClassifierTestCaseData<DataType>; 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker enum DataFormat 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker NHWC, 29*89c4ff92SAndroid Build Coastguard Worker NCHW 30*89c4ff92SAndroid Build Coastguard Worker }; 31*89c4ff92SAndroid Build Coastguard Worker ImagePreprocessor(const std::string & binaryFileDirectory,unsigned int width,unsigned int height,const std::vector<ImageSet> & imageSet,float scale=255.0f,const std::array<float,3> mean={{0, 0, 0}},const std::array<float,3> stddev={{1, 1, 1}},DataFormat dataFormat=DataFormat::NHWC,unsigned int batchSize=1)32*89c4ff92SAndroid Build Coastguard Worker explicit ImagePreprocessor(const std::string& binaryFileDirectory, 33*89c4ff92SAndroid Build Coastguard Worker unsigned int width, 34*89c4ff92SAndroid Build Coastguard Worker unsigned int height, 35*89c4ff92SAndroid Build Coastguard Worker const std::vector<ImageSet>& imageSet, 36*89c4ff92SAndroid Build Coastguard Worker float scale=255.0f, 37*89c4ff92SAndroid Build Coastguard Worker const std::array<float, 3> mean={{0, 0, 0}}, 38*89c4ff92SAndroid Build Coastguard Worker const std::array<float, 3> stddev={{1, 1, 1}}, 39*89c4ff92SAndroid Build Coastguard Worker DataFormat dataFormat=DataFormat::NHWC, 40*89c4ff92SAndroid Build Coastguard Worker unsigned int batchSize=1) 41*89c4ff92SAndroid Build Coastguard Worker : m_BinaryDirectory(binaryFileDirectory) 42*89c4ff92SAndroid Build Coastguard Worker , m_Height(height) 43*89c4ff92SAndroid Build Coastguard Worker , m_Width(width) 44*89c4ff92SAndroid Build Coastguard Worker , m_BatchSize(batchSize) 45*89c4ff92SAndroid Build Coastguard Worker , m_Scale(scale) 46*89c4ff92SAndroid Build Coastguard Worker , m_ImageSet(imageSet) 47*89c4ff92SAndroid Build Coastguard Worker , m_Mean(mean) 48*89c4ff92SAndroid Build Coastguard Worker , m_Stddev(stddev) 49*89c4ff92SAndroid Build Coastguard Worker , m_DataFormat(dataFormat) 50*89c4ff92SAndroid Build Coastguard Worker { 51*89c4ff92SAndroid Build Coastguard Worker } 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<TTestCaseData> GetTestCaseData(unsigned int testCaseId); 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker private: GetNumImageElements() const56*89c4ff92SAndroid Build Coastguard Worker unsigned int GetNumImageElements() const { return 3 * m_Width * m_Height; } GetNumImageBytes() const57*89c4ff92SAndroid Build Coastguard Worker unsigned int GetNumImageBytes() const { return sizeof(DataType) * GetNumImageElements(); } 58*89c4ff92SAndroid Build Coastguard Worker unsigned int GetLabelAndResizedImageAsFloat(unsigned int testCaseId, 59*89c4ff92SAndroid Build Coastguard Worker std::vector<float> & result); 60*89c4ff92SAndroid Build Coastguard Worker 61*89c4ff92SAndroid Build Coastguard Worker std::string m_BinaryDirectory; 62*89c4ff92SAndroid Build Coastguard Worker unsigned int m_Height; 63*89c4ff92SAndroid Build Coastguard Worker unsigned int m_Width; 64*89c4ff92SAndroid Build Coastguard Worker unsigned int m_BatchSize; 65*89c4ff92SAndroid Build Coastguard Worker // Quantization parameters 66*89c4ff92SAndroid Build Coastguard Worker float m_Scale; 67*89c4ff92SAndroid Build Coastguard Worker const std::vector<ImageSet> m_ImageSet; 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Worker const std::array<float, 3> m_Mean; 70*89c4ff92SAndroid Build Coastguard Worker const std::array<float, 3> m_Stddev; 71*89c4ff92SAndroid Build Coastguard Worker 72*89c4ff92SAndroid Build Coastguard Worker DataFormat m_DataFormat; 73*89c4ff92SAndroid Build Coastguard Worker }; 74