ArmNN  NotReleased
ArmNNQuantizerMain.cpp File Reference
#include "CommandLineProcessor.hpp"
#include <armnnDeserializer/IDeserializer.hpp>
#include <armnnQuantizer/INetworkQuantizer.hpp>
#include <armnnSerializer/ISerializer.hpp>
#include "QuantizationDataSet.hpp"
#include "QuantizationInput.hpp"
#include <algorithm>
#include <fstream>
#include <iostream>

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 17 of file ArmNNQuantizerMain.cpp.

References ISerializer::Create(), IDeserializer::Create(), INetworkQuantizer::Create(), CommandLineProcessor::GetInputFileName(), CommandLineProcessor::GetOutputDirectoryName(), CommandLineProcessor::GetOutputFileName(), CommandLineProcessor::GetQuantizationDataSet(), CommandLineProcessor::GetQuantizationScheme(), InputLayerVisitor::GetTensorInfo(), CommandLineProcessor::HasPreservedDataType(), CommandLineProcessor::HasQuantizationData(), QuantizationDataSet::IsEmpty(), QuantizerOptions::m_ActivationFormat, QuantizerOptions::m_PreserveType, CommandLineProcessor::ProcessCommandLine(), armnn::QAsymmU8, and armnn::QSymmS16.

18 {
20  if (!cmdline.ProcessCommandLine(argc, argv))
21  {
22  return -1;
23  }
25  std::ifstream inputFileStream(cmdline.GetInputFileName(), std::ios::binary);
26  std::vector<std::uint8_t> binaryContent;
27  while (inputFileStream)
28  {
29  char c;
30  inputFileStream.get(c);
31  if (inputFileStream)
32  {
33  binaryContent.push_back(static_cast<std::uint8_t>(c));
34  }
35  }
36  inputFileStream.close();
37 
38  armnn::QuantizerOptions quantizerOptions;
39  quantizerOptions.m_ActivationFormat = cmdline.GetQuantizationScheme() == "QSymm16"
42 
43  quantizerOptions.m_PreserveType = cmdline.HasPreservedDataType();
44 
45  armnn::INetworkPtr network = parser->CreateNetworkFromBinary(binaryContent);
46  armnn::INetworkQuantizerPtr quantizer = armnn::INetworkQuantizer::Create(network.get(), quantizerOptions);
47 
48  if (cmdline.HasQuantizationData())
49  {
51  if (!dataSet.IsEmpty())
52  {
53  // Get the Input Tensor Infos
54  armnnQuantizer::InputLayerVisitor inputLayerVisitor;
55  network->Accept(inputLayerVisitor);
56 
57  for (armnnQuantizer::QuantizationInput quantizationInput : dataSet)
58  {
59  armnn::InputTensors inputTensors;
60  std::vector<std::vector<float>> inputData(quantizationInput.GetNumberOfInputs());
61  std::vector<armnn::LayerBindingId> layerBindingIds = quantizationInput.GetLayerBindingIds();
62  unsigned int count = 0;
63  for (armnn::LayerBindingId layerBindingId : quantizationInput.GetLayerBindingIds())
64  {
65  armnn::TensorInfo tensorInfo = inputLayerVisitor.GetTensorInfo(layerBindingId);
66  inputData[count] = quantizationInput.GetDataForEntry(layerBindingId);
67  armnn::ConstTensor inputTensor(tensorInfo, inputData[count].data());
68  inputTensors.push_back(std::make_pair(layerBindingId, inputTensor));
69  count++;
70  }
71  quantizer->Refine(inputTensors);
72  }
73  }
74  }
75 
76  armnn::INetworkPtr quantizedNetwork = quantizer->ExportNetwork();
78  serializer->Serialize(*quantizedNetwork);
79 
80  std::string output(cmdline.GetOutputDirectoryName());
81  output.append(cmdline.GetOutputFileName());
82  std::ofstream outputFileStream;
83  outputFileStream.open(output);
84  serializer->SaveSerializedToStream(outputFileStream);
85  outputFileStream.flush();
86  outputFileStream.close();
87 
88  return 0;
89 }
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
bool ProcessCommandLine(int argc, char *argv[])
armnn::TensorInfo GetTensorInfo(armnn::LayerBindingId)
QuantizationInput for specific pass ID, can list a corresponding raw data file for each LayerBindingI...
std::unique_ptr< ISerializer, void(*)(ISerializer *serializer)> ISerializerPtr
Definition: ISerializer.hpp:15
std::unique_ptr< class INetworkQuantizer, void(*)(INetworkQuantizer *quantizer)> INetworkQuantizerPtr
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Definition: Tensor.hpp:225
static ISerializerPtr Create()
std::unique_ptr< IDeserializer, void(*)(IDeserializer *parser)> IDeserializerPtr
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:85
Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor ...
static IDeserializerPtr Create()
static INetworkQuantizerPtr Create(INetwork *inputNetwork, const QuantizerOptions &options=QuantizerOptions())
Create Quantizer object wrapped in unique_ptr.
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:168