ArmNN
 21.08
ImageTensorGenerator.hpp File Reference
#include "../InferenceTestImage.hpp"
#include <armnn/TypesUtils.hpp>
#include <armnnUtils/Permute.hpp>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <string>

Go to the source code of this file.

Classes

struct  NormalizationParameters
 

Enumerations

enum  SupportedFrontend { TFLite = 0 }
 

Functions

NormalizationParameters GetNormalizationParameters (const SupportedFrontend &modelFormat, const armnn::DataType &outputType)
 Get normalization parameters. More...
 
template<typename ElemType >
std::vector< ElemType > PrepareImageTensor (const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize=1, const armnn::DataLayout &outputLayout=armnn::DataLayout::NHWC)
 Prepare raw image tensor data by loading the image from imagePath and preprocessing it. More...
 
template<>
std::vector< float > PrepareImageTensor< float > (const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)
 
template<>
std::vector< int > PrepareImageTensor< int > (const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)
 
template<>
std::vector< uint8_t > PrepareImageTensor< uint8_t > (const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)
 
template<>
std::vector< int8_t > PrepareImageTensor< int8_t > (const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)
 
template<typename ElemType >
void WriteImageTensorImpl (const std::vector< ElemType > &imageData, std::ofstream &imageTensorFile)
 Write image tensor to ofstream. More...
 
template<>
void WriteImageTensorImpl< uint8_t > (const std::vector< uint8_t > &imageData, std::ofstream &imageTensorFile)
 
template<>
void WriteImageTensorImpl< int8_t > (const std::vector< int8_t > &imageData, std::ofstream &imageTensorFile)
 

Enumeration Type Documentation

◆ SupportedFrontend

enum SupportedFrontend
strong
Enumerator
TFLite 

Definition at line 25 of file ImageTensorGenerator.hpp.

26 {
27  TFLite = 0,
28 };

Function Documentation

◆ GetNormalizationParameters()

NormalizationParameters GetNormalizationParameters ( const SupportedFrontend modelFormat,
const armnn::DataType outputType 
)

Get normalization parameters.

Note that different flavours of models and different model data types have different normalization methods. This tool currently only supports TF and TFLite models

Parameters
[in]modelFormatOne of the supported frontends
[in]outputTypeOutput type of the image tensor, also the type of the intended model

Definition at line 37 of file ImageTensorGenerator.hpp.

References armnn::Float32, NormalizationParameters::mean, armnn::NHWC, PrepareImageTensor(), armnn::QAsymmS8, armnn::QAsymmU8, NormalizationParameters::scale, armnn::Signed32, NormalizationParameters::stddev, and TFLite.

Referenced by main().

39 {
40  NormalizationParameters normParams;
41  // Explicitly set default parameters
42  normParams.scale = 1.0;
43  normParams.mean = { 0.0, 0.0, 0.0 };
44  normParams.stddev = { 1.0, 1.0, 1.0 };
45  switch (modelFormat)
46  {
48  default:
49  switch (outputType)
50  {
52  normParams.scale = 127.5;
53  normParams.mean = { 1.0, 1.0, 1.0 };
54  break;
56  normParams.mean = { 128.0, 128.0, 128.0 };
57  break;
59  break;
61  normParams.mean = { 128.0, 128.0, 128.0 };
62  break;
63  default:
64  break;
65  }
66  break;
67  }
68  return normParams;
69 }
std::array< float, 3 > stddev
std::array< float, 3 > mean

◆ PrepareImageTensor()

std::vector<ElemType> PrepareImageTensor ( const std::string &  imagePath,
unsigned int  newWidth,
unsigned int  newHeight,
const NormalizationParameters normParams,
unsigned int  batchSize = 1,
const armnn::DataLayout outputLayout = armnn::DataLayout::NHWC 
)

Prepare raw image tensor data by loading the image from imagePath and preprocessing it.

Parameters
[in]imagePathPath to the image file
[in]newWidthThe new width of the output image tensor
[in]newHeightThe new height of the output image tensor
[in]normParamsNormalization parameters for the normalization of the image
[in]batchSizeBatch size
[in]outputLayoutData layout of the output image tensor

Referenced by GetNormalizationParameters().

◆ PrepareImageTensor< float >()

std::vector<float> PrepareImageTensor< float > ( const std::string &  imagePath,
unsigned int  newWidth,
unsigned int  newHeight,
const NormalizationParameters normParams,
unsigned int  batchSize,
const armnn::DataLayout outputLayout 
)

Definition at line 90 of file ImageTensorGenerator.hpp.

References InferenceTestImage::BilinearAndNormalized, CHECK_LOCATION, InferenceTestImage::GetWidth(), NormalizationParameters::mean, armnn::NCHW, armnnUtils::NHWCToArmNN, armnnUtils::Permute(), NormalizationParameters::scale, and NormalizationParameters::stddev.

Referenced by main(), PrepareImageTensor< int >(), PrepareImageTensor< int8_t >(), and PrepareImageTensor< uint8_t >().

96 {
97  // Generate image tensor
98  std::vector<float> imageData;
99  InferenceTestImage testImage(imagePath.c_str());
100  if (newWidth == 0)
101  {
102  newWidth = testImage.GetWidth();
103  }
104  if (newHeight == 0)
105  {
106  newHeight = testImage.GetHeight();
107  }
108  // Resize the image to new width and height or keep at original dimensions if the new width and height are specified
109  // as 0 Centre/Normalise the image.
110  imageData = testImage.Resize(newWidth, newHeight, CHECK_LOCATION(),
112  normParams.stddev, normParams.scale);
113  if (outputLayout == armnn::DataLayout::NCHW)
114  {
115  // Convert to NCHW format
116  const armnn::PermutationVector NHWCToArmNN = { 0, 2, 3, 1 };
117  armnn::TensorShape dstShape({ batchSize, 3, newHeight, newWidth });
118  std::vector<float> tempImage(imageData.size());
119  armnnUtils::Permute(dstShape, NHWCToArmNN, imageData.data(), tempImage.data(), sizeof(float));
120  imageData.swap(tempImage);
121  }
122  return imageData;
123 }
std::array< float, 3 > stddev
const armnn::PermutationVector NHWCToArmNN
void Permute(const armnn::TensorShape &dstShape, const armnn::PermutationVector &mappings, const void *src, void *dst, size_t dataTypeSize)
Definition: Permute.cpp:131
unsigned int GetWidth() const
#define CHECK_LOCATION()
Definition: Exceptions.hpp:197
std::array< float, 3 > mean

◆ PrepareImageTensor< int >()

std::vector<int> PrepareImageTensor< int > ( const std::string &  imagePath,
unsigned int  newWidth,
unsigned int  newHeight,
const NormalizationParameters normParams,
unsigned int  batchSize,
const armnn::DataLayout outputLayout 
)

Definition at line 127 of file ImageTensorGenerator.hpp.

References PrepareImageTensor< float >().

Referenced by main().

133 {
134  // Get float32 image tensor
135  std::vector<float> imageDataFloat =
136  PrepareImageTensor<float>(imagePath, newWidth, newHeight, normParams, batchSize, outputLayout);
137  // Convert to int32 image tensor with static cast
138  std::vector<int> imageDataInt;
139  imageDataInt.reserve(imageDataFloat.size());
140  std::transform(imageDataFloat.begin(), imageDataFloat.end(), std::back_inserter(imageDataInt),
141  [](float val) { return static_cast<int>(val); });
142  return imageDataInt;
143 }
std::vector< float > PrepareImageTensor< float >(const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)

◆ PrepareImageTensor< int8_t >()

std::vector<int8_t> PrepareImageTensor< int8_t > ( const std::string &  imagePath,
unsigned int  newWidth,
unsigned int  newHeight,
const NormalizationParameters normParams,
unsigned int  batchSize,
const armnn::DataLayout outputLayout 
)

Definition at line 167 of file ImageTensorGenerator.hpp.

References PrepareImageTensor< float >().

Referenced by main().

173 {
174  // Get float32 image tensor
175  std::vector<float> imageDataFloat =
176  PrepareImageTensor<float>(imagePath, newWidth, newHeight, normParams, batchSize, outputLayout);
177  std::vector<int8_t> imageDataQasymms8;
178  imageDataQasymms8.reserve(imageDataFloat.size());
179  // Convert to uint8 image tensor with static cast
180  std::transform(imageDataFloat.begin(), imageDataFloat.end(), std::back_inserter(imageDataQasymms8),
181  [](float val) { return static_cast<uint8_t>(val); });
182  return imageDataQasymms8;
183 }
std::vector< float > PrepareImageTensor< float >(const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)

◆ PrepareImageTensor< uint8_t >()

std::vector<uint8_t> PrepareImageTensor< uint8_t > ( const std::string &  imagePath,
unsigned int  newWidth,
unsigned int  newHeight,
const NormalizationParameters normParams,
unsigned int  batchSize,
const armnn::DataLayout outputLayout 
)

Definition at line 147 of file ImageTensorGenerator.hpp.

References PrepareImageTensor< float >().

Referenced by main().

153 {
154  // Get float32 image tensor
155  std::vector<float> imageDataFloat =
156  PrepareImageTensor<float>(imagePath, newWidth, newHeight, normParams, batchSize, outputLayout);
157  std::vector<uint8_t> imageDataQasymm8;
158  imageDataQasymm8.reserve(imageDataFloat.size());
159  // Convert to uint8 image tensor with static cast
160  std::transform(imageDataFloat.begin(), imageDataFloat.end(), std::back_inserter(imageDataQasymm8),
161  [](float val) { return static_cast<uint8_t>(val); });
162  return imageDataQasymm8;
163 }
std::vector< float > PrepareImageTensor< float >(const std::string &imagePath, unsigned int newWidth, unsigned int newHeight, const NormalizationParameters &normParams, unsigned int batchSize, const armnn::DataLayout &outputLayout)

◆ WriteImageTensorImpl()

void WriteImageTensorImpl ( const std::vector< ElemType > &  imageData,
std::ofstream &  imageTensorFile 
)

Write image tensor to ofstream.

Parameters
[in]imageDataImage tensor data
[in]imageTensorFileOutput filestream (ofstream) to which the image tensor data is written

Definition at line 191 of file ImageTensorGenerator.hpp.

Referenced by main().

192 {
193  std::copy(imageData.begin(), imageData.end(), std::ostream_iterator<ElemType>(imageTensorFile, " "));
194 }

◆ WriteImageTensorImpl< int8_t >()

void WriteImageTensorImpl< int8_t > ( const std::vector< int8_t > &  imageData,
std::ofstream &  imageTensorFile 
)

Definition at line 207 of file ImageTensorGenerator.hpp.

208 {
209  std::copy(imageData.begin(), imageData.end(), std::ostream_iterator<int>(imageTensorFile, " "));
210 }

◆ WriteImageTensorImpl< uint8_t >()

void WriteImageTensorImpl< uint8_t > ( const std::vector< uint8_t > &  imageData,
std::ofstream &  imageTensorFile 
)

Definition at line 199 of file ImageTensorGenerator.hpp.

200 {
201  std::copy(imageData.begin(), imageData.end(), std::ostream_iterator<int>(imageTensorFile, " "));
202 }