aboutsummaryrefslogtreecommitdiff
path: root/src/armnnQuantizer
diff options
context:
space:
mode:
authorKevin May <kevin.may@arm.com>2021-04-22 16:51:18 +0100
committerKevin May <kevin.may@arm.com>2021-04-27 15:02:45 +0000
commit4a621c43174b6bdd9dc0bff839b245bc2139d6a6 (patch)
tree88b2bbc803284e7c5051c8812a468e5f3c834b9c /src/armnnQuantizer
parent65542e4f250a66fd0aba0c1b509e11cb518ee2d5 (diff)
downloadarmnn-4a621c43174b6bdd9dc0bff839b245bc2139d6a6.tar.gz
IVGCVSW-5719 Remove Quantizer
Signed-off-by: Kevin May <kevin.may@arm.com> Change-Id: I8a29df03afdd6f1cc8413b219e179272cd2d51cf
Diffstat (limited to 'src/armnnQuantizer')
-rw-r--r--src/armnnQuantizer/ArmNNQuantizerMain.cpp99
-rw-r--r--src/armnnQuantizer/CommandLineProcessor.cpp186
-rw-r--r--src/armnnQuantizer/CommandLineProcessor.hpp52
-rw-r--r--src/armnnQuantizer/QuantizationDataSet.cpp203
-rw-r--r--src/armnnQuantizer/QuantizationDataSet.hpp71
-rw-r--r--src/armnnQuantizer/QuantizationInput.cpp103
-rw-r--r--src/armnnQuantizer/QuantizationInput.hpp54
-rw-r--r--src/armnnQuantizer/README.md19
-rw-r--r--src/armnnQuantizer/test/QuantizationDataSetTests.cpp140
9 files changed, 0 insertions, 927 deletions
diff --git a/src/armnnQuantizer/ArmNNQuantizerMain.cpp b/src/armnnQuantizer/ArmNNQuantizerMain.cpp
deleted file mode 100644
index 49652efe25..0000000000
--- a/src/armnnQuantizer/ArmNNQuantizerMain.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#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>
-
-int main(int argc, char* argv[])
-{
- armnnQuantizer::CommandLineProcessor cmdline;
- if (!cmdline.ProcessCommandLine(argc, argv))
- {
- return -1;
- }
- armnnDeserializer::IDeserializerPtr parser = armnnDeserializer::IDeserializer::Create();
- std::ifstream inputFileStream(cmdline.GetInputFileName(), std::ios::binary);
- std::vector<std::uint8_t> binaryContent;
- while (inputFileStream)
- {
- char c;
- inputFileStream.get(c);
- if (inputFileStream)
- {
- binaryContent.push_back(static_cast<std::uint8_t>(c));
- }
- }
- inputFileStream.close();
-
- armnn::QuantizerOptions quantizerOptions;
-
- if (cmdline.GetQuantizationScheme() == "QAsymmS8")
- {
- quantizerOptions.m_ActivationFormat = armnn::DataType::QAsymmS8;
- }
- else if (cmdline.GetQuantizationScheme() == "QSymmS16")
- {
- quantizerOptions.m_ActivationFormat = armnn::DataType::QSymmS16;
- }
- else
- {
- quantizerOptions.m_ActivationFormat = armnn::DataType::QAsymmU8;
- }
-
- quantizerOptions.m_PreserveType = cmdline.HasPreservedDataType();
-
- armnn::INetworkPtr network = parser->CreateNetworkFromBinary(binaryContent);
- armnn::INetworkQuantizerPtr quantizer = armnn::INetworkQuantizer::Create(network.get(), quantizerOptions);
-
- if (cmdline.HasQuantizationData())
- {
- armnnQuantizer::QuantizationDataSet dataSet = cmdline.GetQuantizationDataSet();
- if (!dataSet.IsEmpty())
- {
- // Get the Input Tensor Infos
- armnnQuantizer::InputLayerStrategy inputLayerStrategy;
- network->ExecuteStrategy(inputLayerStrategy);
-
- for (armnnQuantizer::QuantizationInput quantizationInput : dataSet)
- {
- armnn::InputTensors inputTensors;
- std::vector<std::vector<float>> inputData(quantizationInput.GetNumberOfInputs());
- std::vector<armnn::LayerBindingId> layerBindingIds = quantizationInput.GetLayerBindingIds();
- unsigned int count = 0;
- for (armnn::LayerBindingId layerBindingId : quantizationInput.GetLayerBindingIds())
- {
- armnn::TensorInfo tensorInfo = inputLayerStrategy.GetTensorInfo(layerBindingId);
- inputData[count] = quantizationInput.GetDataForEntry(layerBindingId);
- armnn::ConstTensor inputTensor(tensorInfo, inputData[count].data());
- inputTensors.push_back(std::make_pair(layerBindingId, inputTensor));
- count++;
- }
- quantizer->Refine(inputTensors);
- }
- }
- }
-
- armnn::INetworkPtr quantizedNetwork = quantizer->ExportNetwork();
- armnnSerializer::ISerializerPtr serializer = armnnSerializer::ISerializer::Create();
- serializer->Serialize(*quantizedNetwork);
-
- std::string output(cmdline.GetOutputDirectoryName());
- output.append(cmdline.GetOutputFileName());
- std::ofstream outputFileStream;
- outputFileStream.open(output);
- serializer->SaveSerializedToStream(outputFileStream);
- outputFileStream.flush();
- outputFileStream.close();
-
- return 0;
-} \ No newline at end of file
diff --git a/src/armnnQuantizer/CommandLineProcessor.cpp b/src/armnnQuantizer/CommandLineProcessor.cpp
deleted file mode 100644
index 74ad5e7dbc..0000000000
--- a/src/armnnQuantizer/CommandLineProcessor.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "CommandLineProcessor.hpp"
-#include <Filesystem.hpp>
-
-#include <cxxopts/cxxopts.hpp>
-
-namespace armnnQuantizer
-{
-
-bool ValidateOutputDirectory(std::string& dir)
-{
- if (dir.empty())
- {
- std::cerr << "No output directory specified" << std::endl;
- return false;
- }
-
- if (dir[dir.length() - 1] != '/')
- {
- dir += "/";
- }
-
- if (!fs::exists(dir))
- {
- std::cerr << "Output directory [" << dir << "] does not exist" << std::endl;
- return false;
- }
-
- if (!fs::is_directory(dir))
- {
- std::cerr << "Given output directory [" << dir << "] is not a directory" << std::endl;
- return false;
- }
-
- return true;
-}
-
-bool ValidateProvidedFile(const std::string& inputFileName)
-{
- if (!fs::exists(inputFileName))
- {
- std::cerr << "Provided file [" << inputFileName << "] does not exist" << std::endl;
- return false;
- }
-
- if (fs::is_directory(inputFileName))
- {
- std::cerr << "Given file [" << inputFileName << "] is a directory" << std::endl;
- return false;
- }
-
- return true;
-}
-
-bool ValidateQuantizationScheme(const std::string& scheme)
-{
- if (scheme.empty())
- {
- std::cerr << "No Quantization Scheme specified" << std::endl;
- return false;
- }
-
- std::vector<std::string> supportedSchemes =
- {
- "QAsymmS8",
- "QAsymmU8",
- "QSymm16"
- };
-
- auto iterator = std::find(supportedSchemes.begin(), supportedSchemes.end(), scheme);
- if (iterator == supportedSchemes.end())
- {
- std::cerr << "Quantization Scheme [" << scheme << "] is not supported" << std::endl;
- return false;
- }
-
- return true;
-}
-
-bool CommandLineProcessor::ProcessCommandLine(int argc, char* argv[])
-{
- try
- {
- cxxopts::Options options("ArmnnQuantizer","Convert a Fp32 ArmNN model to a quantized ArmNN model.");
-
- options.add_options()
- ("h,help", "Display help messages")
- ("f,infile",
- "Input file containing float 32 ArmNN Input Graph",
- cxxopts::value<std::string>(m_InputFileName))
- ("s,scheme",
- "Quantization scheme,"
- " \"QAsymmU8\" or \"QAsymmS8\" or \"QSymm16\","
- " default value QAsymmU8",
- cxxopts::value<std::string>(m_QuantizationScheme)->default_value("QAsymmU8"))
- ("c,csvfile",
- "CSV file containing paths for RAW input tensors",
- cxxopts::value<std::string>(m_CsvFileName)->default_value(""))
- ("p,preserve-data-type",
- "Preserve the input and output data types",
- cxxopts::value<bool>(m_PreserveDataType)->default_value("false"))
- ("d,outdir",
- "Directory that output file will be written to",
- cxxopts::value<std::string>(m_OutputDirectory))
- ("o,outfile",
- "ArmNN output file name",
- cxxopts::value<std::string>(m_OutputFileName));
-
- auto result = options.parse(argc, argv);
-
- if (result.count("help") > 0 || argc <= 1)
- {
- std::cout << options.help() << std::endl;
- return false;
- }
-
- // Check for mandatory single options.
- std::string mandatorySingleParameters[] = { "infile", "outdir", "outfile" };
- for (auto param : mandatorySingleParameters)
- {
- if (result.count(param) != 1)
- {
- std::cerr << "Parameter \'--" << param << "\' is required but missing." << std::endl;
- return false;
- }
- }
- }
- catch (const cxxopts::OptionException& e)
- {
- std::cerr << e.what() << std::endl << std::endl;
- return false;
- }
- catch (const std::exception& e)
- {
- std::cerr << "Fatal internal error: [" << e.what() << "]" << std::endl;
- return false;
- }
-
- if (!armnnQuantizer::ValidateProvidedFile(m_InputFileName))
- {
- return false;
- }
-
- if (!ValidateQuantizationScheme(m_QuantizationScheme))
- {
- return false;
- }
-
- if (m_CsvFileName != "")
- {
- if (!armnnQuantizer::ValidateProvidedFile(m_CsvFileName))
- {
- return false;
- }
- else
- {
- fs::path csvFilePath(m_CsvFileName);
- m_CsvFileDirectory = csvFilePath.parent_path().c_str();
- }
-
- // If CSV file is defined, create a QuantizationDataSet for specified CSV file.
- m_QuantizationDataSet = QuantizationDataSet(m_CsvFileName);
- }
-
- if (!armnnQuantizer::ValidateOutputDirectory(m_OutputDirectory))
- {
- return false;
- }
-
- std::string output(m_OutputDirectory);
- output.append(m_OutputFileName);
-
- if (fs::exists(output))
- {
- std::cerr << "Output file [" << output << "] already exists" << std::endl;
- return false;
- }
-
- return true;
-}
-
-} // namespace armnnQuantizer \ No newline at end of file
diff --git a/src/armnnQuantizer/CommandLineProcessor.hpp b/src/armnnQuantizer/CommandLineProcessor.hpp
deleted file mode 100644
index 9de03fb327..0000000000
--- a/src/armnnQuantizer/CommandLineProcessor.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <string>
-#include <iostream>
-#include <vector>
-#include "QuantizationDataSet.hpp"
-
-namespace armnnQuantizer
-{
-
-// parses the command line to extract
-// * the input file -f containing the serialized fp32 ArmNN input graph (must exist...and be a input graph file)
-// * the csv file -c <optional> detailing the paths for RAW input tensors to use for refinement
-// * the directory -d to place the output file into (must already exist and be writable)
-// * the name of the file -o the quantized ArmNN input graph will be written to (must not already exist)
-// * LATER: the min and max overrides to be applied to the inputs
-// specified as -i <int> (input id) -n <float> (minimum) -x <float> (maximum)
-// multiple sets of -i, -n, -x can appear on the command line but they must match
-// in number i.e. a -n and -x for each -i and the id of the input must correspond
-// to an input layer in the fp32 graph when it is loaded.
-class CommandLineProcessor
-{
-public:
- bool ProcessCommandLine(int argc, char* argv[]);
-
- std::string GetInputFileName() {return m_InputFileName;}
- std::string GetCsvFileName() {return m_CsvFileName;}
- std::string GetCsvFileDirectory() {return m_CsvFileDirectory;}
- std::string GetOutputDirectoryName() {return m_OutputDirectory;}
- std::string GetOutputFileName() {return m_OutputFileName;}
- std::string GetQuantizationScheme() {return m_QuantizationScheme;}
- QuantizationDataSet GetQuantizationDataSet() {return m_QuantizationDataSet;}
- bool HasPreservedDataType() {return m_PreserveDataType;}
- bool HasQuantizationData() {return !m_QuantizationDataSet.IsEmpty();}
-
-protected:
- std::string m_InputFileName;
- std::string m_CsvFileName;
- std::string m_CsvFileDirectory;
- std::string m_OutputDirectory;
- std::string m_OutputFileName;
- std::string m_QuantizationScheme;
- QuantizationDataSet m_QuantizationDataSet;
- bool m_PreserveDataType;
-};
-
-} // namespace armnnQuantizer
-
diff --git a/src/armnnQuantizer/QuantizationDataSet.cpp b/src/armnnQuantizer/QuantizationDataSet.cpp
deleted file mode 100644
index 99fc021a51..0000000000
--- a/src/armnnQuantizer/QuantizationDataSet.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "QuantizationDataSet.hpp"
-
-#include <fmt/format.h>
-
-#include <armnn/utility/StringUtils.hpp>
-#include <armnn/utility/IgnoreUnused.hpp>
-#include <Filesystem.hpp>
-
-namespace armnnQuantizer
-{
-
-QuantizationDataSet::QuantizationDataSet()
-{
-}
-
-QuantizationDataSet::QuantizationDataSet(const std::string csvFilePath):
- m_QuantizationInputs(),
- m_CsvFilePath(csvFilePath)
-{
- ParseCsvFile();
-}
-
-void AddInputData(unsigned int passId,
- armnn::LayerBindingId bindingId,
- const std::string& inputFilePath,
- std::map<unsigned int, QuantizationInput>& passIdToQuantizationInput)
-{
- auto iterator = passIdToQuantizationInput.find(passId);
- if (iterator == passIdToQuantizationInput.end())
- {
- QuantizationInput input(passId, bindingId, inputFilePath);
- passIdToQuantizationInput.emplace(passId, input);
- }
- else
- {
- auto existingQuantizationInput = iterator->second;
- existingQuantizationInput.AddEntry(bindingId, inputFilePath);
- }
-}
-
-QuantizationDataSet::~QuantizationDataSet()
-{
-}
-
-
-/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine.
-
-void InputLayerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
- const armnn::BaseDescriptor& descriptor,
- const std::vector<armnn::ConstTensor>& constants,
- const char* name,
- const armnn::LayerBindingId id)
-{
- armnn::IgnoreUnused(name, descriptor, constants);
-
- m_TensorInfos.emplace(id, layer->GetOutputSlot(0).GetTensorInfo());
-}
-
-
-
-
-armnn::TensorInfo InputLayerStrategy::GetTensorInfo(armnn::LayerBindingId layerBindingId)
-{
- auto iterator = m_TensorInfos.find(layerBindingId);
- if (iterator != m_TensorInfos.end())
- {
- return m_TensorInfos.at(layerBindingId);
- }
- else
- {
- throw armnn::Exception("Could not retrieve tensor info for binding ID " + std::to_string(layerBindingId));
- }
-}
-
-void InputLayerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer,
- armnn::LayerBindingId id,
- const char* name)
-{
- armnn::IgnoreUnused(name);
- m_TensorInfos.emplace(id, layer->GetOutputSlot(0).GetTensorInfo());
-}
-
-armnn::TensorInfo InputLayerVisitor::GetTensorInfo(armnn::LayerBindingId layerBindingId)
-{
- auto iterator = m_TensorInfos.find(layerBindingId);
- if (iterator != m_TensorInfos.end())
- {
- return m_TensorInfos.at(layerBindingId);
- }
- else
- {
- throw armnn::Exception("Could not retrieve tensor info for binding ID " + std::to_string(layerBindingId));
- }
-}
-
-
-unsigned int GetPassIdFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex)
-{
- unsigned int passId;
- try
- {
- passId = static_cast<unsigned int>(std::stoi(tokens[0]));
- }
- catch (const std::invalid_argument&)
- {
- throw armnn::ParseException(fmt::format("Pass ID [{}] is not correct format on CSV row {}",
- tokens[0], lineIndex));
- }
- return passId;
-}
-
-armnn::LayerBindingId GetBindingIdFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex)
-{
- armnn::LayerBindingId bindingId;
- try
- {
- bindingId = std::stoi(tokens[1]);
- }
- catch (const std::invalid_argument&)
- {
- throw armnn::ParseException(fmt::format("Binding ID [{}] is not correct format on CSV row {}",
- tokens[1], lineIndex));
- }
- return bindingId;
-}
-
-std::string GetFileNameFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex)
-{
- std::string fileName = armnn::stringUtils::StringTrim(tokens[2]);
-
- if (!fs::exists(fileName))
- {
- throw armnn::ParseException(fmt::format("File [{}] provided on CSV row {} does not exist.",
- fileName, lineIndex));
- }
-
- if (fileName.empty())
- {
- throw armnn::ParseException(fmt::format("Filename cannot be empty on CSV row {} ", lineIndex));
- }
- return fileName;
-}
-
-
-void QuantizationDataSet::ParseCsvFile()
-{
- std::map<unsigned int, QuantizationInput> passIdToQuantizationInput;
-
- if (m_CsvFilePath == "")
- {
- throw armnn::Exception("CSV file not specified.");
- }
-
- std::ifstream inf (m_CsvFilePath.c_str());
- std::string line;
- std::vector<std::string> tokens;
- unsigned int lineIndex = 0;
-
- if (!inf)
- {
- throw armnn::Exception(fmt::format("CSV file {} not found.", m_CsvFilePath));
- }
-
- while (getline(inf, line))
- {
- tokens = armnn::stringUtils::StringTokenizer(line, ",");
-
- if (tokens.size() != 3)
- {
- throw armnn::Exception(fmt::format("CSV file [{}] does not have correct number of entries" \
- "on line {}. Expected 3 entries but was {}.",
- m_CsvFilePath, lineIndex, tokens.size()));
-
- }
-
- unsigned int passId = GetPassIdFromCsvRow(tokens, lineIndex);
- armnn::LayerBindingId bindingId = GetBindingIdFromCsvRow(tokens, lineIndex);
- std::string rawFileName = GetFileNameFromCsvRow(tokens, lineIndex);
-
- AddInputData(passId, bindingId, rawFileName, passIdToQuantizationInput);
-
- ++lineIndex;
- }
-
- if (passIdToQuantizationInput.empty())
- {
- throw armnn::Exception("Could not parse CSV file.");
- }
-
- // Once all entries in CSV file are parsed successfully and QuantizationInput map is populated, populate
- // QuantizationInputs iterator for easier access and clear the map
- for (auto itr = passIdToQuantizationInput.begin(); itr != passIdToQuantizationInput.end(); ++itr)
- {
- m_QuantizationInputs.emplace_back(itr->second);
- }
-}
-
-}
diff --git a/src/armnnQuantizer/QuantizationDataSet.hpp b/src/armnnQuantizer/QuantizationDataSet.hpp
deleted file mode 100644
index 47b893a7f7..0000000000
--- a/src/armnnQuantizer/QuantizationDataSet.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <map>
-#include "QuantizationInput.hpp"
-#include "armnn/LayerVisitorBase.hpp"
-#include "armnn/Tensor.hpp"
-
-namespace armnnQuantizer
-{
-
-/// QuantizationDataSet is a structure which is created after parsing a quantization CSV file.
-/// It contains records of filenames which contain refinement data per pass ID for binding ID.
-class QuantizationDataSet
-{
- using QuantizationInputs = std::vector<armnnQuantizer::QuantizationInput>;
-public:
-
- using iterator = QuantizationInputs::iterator;
- using const_iterator = QuantizationInputs::const_iterator;
-
- QuantizationDataSet();
- QuantizationDataSet(std::string csvFilePath);
- ~QuantizationDataSet();
- bool IsEmpty() const {return m_QuantizationInputs.empty();}
-
- iterator begin() { return m_QuantizationInputs.begin(); }
- iterator end() { return m_QuantizationInputs.end(); }
- const_iterator begin() const { return m_QuantizationInputs.begin(); }
- const_iterator end() const { return m_QuantizationInputs.end(); }
- const_iterator cbegin() const { return m_QuantizationInputs.cbegin(); }
- const_iterator cend() const { return m_QuantizationInputs.cend(); }
-
-private:
- void ParseCsvFile();
-
- QuantizationInputs m_QuantizationInputs;
- std::string m_CsvFilePath;
-};
-
-/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine.
-class InputLayerStrategy : public armnn::IStrategy
-{
-public:
- virtual void ExecuteStrategy(const armnn::IConnectableLayer* layer,
- const armnn::BaseDescriptor& descriptor,
- const std::vector<armnn::ConstTensor>& constants,
- const char* name,
- const armnn::LayerBindingId id = 0) override;
-
- armnn::TensorInfo GetTensorInfo(armnn::LayerBindingId);
-private:
- std::map<armnn::LayerBindingId, armnn::TensorInfo> m_TensorInfos;
-};
-
-
-/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine.
-class InputLayerVisitor : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy>
-{
-public:
- void VisitInputLayer(const armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const char* name);
- armnn::TensorInfo GetTensorInfo(armnn::LayerBindingId);
-private:
- std::map<armnn::LayerBindingId, armnn::TensorInfo> m_TensorInfos;
-};
-
-} // namespace armnnQuantizer \ No newline at end of file
diff --git a/src/armnnQuantizer/QuantizationInput.cpp b/src/armnnQuantizer/QuantizationInput.cpp
deleted file mode 100644
index bb7aff1c2c..0000000000
--- a/src/armnnQuantizer/QuantizationInput.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "QuantizationInput.hpp"
-
-#include <iostream>
-#include <fstream>
-#include <cstring>
-#include "armnn/Exceptions.hpp"
-
-namespace armnnQuantizer
-{
-
-QuantizationInput::QuantizationInput(const unsigned int passId,
- const armnn::LayerBindingId bindingId,
- const std::string fileName):
- m_PassId(passId)
-{
- m_LayerBindingIdToFileName.emplace(bindingId, fileName);
-}
-
-QuantizationInput::QuantizationInput(const QuantizationInput& other)
-{
- m_PassId = other.GetPassId();
- m_LayerBindingIdToFileName.clear();
- for (armnn::LayerBindingId bindingId : other.GetLayerBindingIds())
- {
- std::string filename = other.GetFileName(bindingId);
- AddEntry(bindingId, filename);
- }
-}
-
-void QuantizationInput::AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName)
-{
- m_LayerBindingIdToFileName.emplace(bindingId, fileName);
-}
-
-std::vector<float> QuantizationInput::GetDataForEntry(const armnn::LayerBindingId bindingId) const
-{
- if (m_LayerBindingIdToFileName.at(bindingId).empty())
- {
- throw armnn::Exception("Layer binding ID not found");
- }
-
- std::string fileName = m_LayerBindingIdToFileName.at(bindingId);
- std::ifstream in(fileName.c_str(), std::ifstream::binary);
- if (!in.is_open())
- {
- throw armnn::Exception("Failed to open input tensor file " + fileName);
- }
-
- std::string line;
- std::vector<float> values;
- char* pEnd;
-
- while (std::getline(in, line, ' '))
- {
- values.emplace_back(std::strtof(line.c_str(), &pEnd));
- }
- return values;
-}
-
-std::vector<armnn::LayerBindingId> QuantizationInput::GetLayerBindingIds() const
-{
- std::vector<armnn::LayerBindingId> layerBindingIDs;
-
- for (auto iterator = m_LayerBindingIdToFileName.begin(); iterator != m_LayerBindingIdToFileName.end(); ++iterator)
- {
- layerBindingIDs.emplace_back(iterator->first);
- }
- return layerBindingIDs;
-}
-
-unsigned long QuantizationInput::GetNumberOfInputs() const
-{
- return m_LayerBindingIdToFileName.size();
-}
-
-unsigned int QuantizationInput::GetPassId() const
-{
- return m_PassId;
-}
-
-std::string QuantizationInput::GetFileName(const armnn::LayerBindingId bindingId) const
-{
- auto iterator = m_LayerBindingIdToFileName.find(bindingId);
- if (iterator != m_LayerBindingIdToFileName.end())
- {
- return m_LayerBindingIdToFileName.at(bindingId);
- }
- else
- {
- throw armnn::Exception("Could not retrieve filename for binding ID " + std::to_string(bindingId));
- }
-}
-
-QuantizationInput::~QuantizationInput() noexcept
-{
-}
-
-} \ No newline at end of file
diff --git a/src/armnnQuantizer/QuantizationInput.hpp b/src/armnnQuantizer/QuantizationInput.hpp
deleted file mode 100644
index 1bfe84bc19..0000000000
--- a/src/armnnQuantizer/QuantizationInput.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <map>
-#include <armnn/Types.hpp>
-#include <armnnQuantizer/INetworkQuantizer.hpp>
-
-namespace armnnQuantizer
-{
-
-/// QuantizationInput for specific pass ID, can list a corresponding raw data file for each LayerBindingId.
-class QuantizationInput
-{
-public:
-
- /// Constructor for QuantizationInput
- QuantizationInput(const unsigned int passId,
- const armnn::LayerBindingId bindingId,
- const std::string fileName);
-
- QuantizationInput(const QuantizationInput& other);
-
- // Add binding ID to image tensor filepath entry
- void AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName);
-
- // Retrieve tensor data for entry with provided binding ID
- std::vector<float> GetDataForEntry(const armnn::LayerBindingId bindingId) const;
-
- /// Retrieve Layer Binding IDs for this QuantizationInput.
- std::vector<armnn::LayerBindingId> GetLayerBindingIds() const;
-
- /// Get number of inputs for this QuantizationInput.
- unsigned long GetNumberOfInputs() const;
-
- /// Retrieve Pass ID for this QuantizationInput.
- unsigned int GetPassId() const;
-
- /// Retrieve filename path for specified Layer Binding ID.
- std::string GetFileName(const armnn::LayerBindingId bindingId) const;
-
- /// Destructor
- ~QuantizationInput() noexcept;
-
-private:
- unsigned int m_PassId;
- std::map<armnn::LayerBindingId, std::string> m_LayerBindingIdToFileName;
-
-};
-
-} \ No newline at end of file
diff --git a/src/armnnQuantizer/README.md b/src/armnnQuantizer/README.md
deleted file mode 100644
index 6100372818..0000000000
--- a/src/armnnQuantizer/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# The ArmnnQuantizer
-
-The `ArmnnQuantizer` is a program for loading a 32-bit float network into ArmNN and converting it into a quantized asymmetric 8-bit or quantized symmetric 16-bit network.
-It supports static quantization by default, dynamic quantization is enabled if CSV file of raw input tensors is provided. Run the program with no arguments to see command-line help.
-
-**NOTE**: The ArmnnQuantizer is deprecated in Arm NN 21.02 and will be removed in 21.05.
-
-|Cmd:|||
-| ---|---|---|
-| -h | --help | Display help messages |
-| -f | --infile | Input file containing float 32 ArmNN Input Graph |
-| -s | --scheme | Quantization scheme, "QAsymm8" or "QSymm16". Default value: QAsymm8 |
-| -c | --csvfile | CSV file containing paths for raw input tensors for dynamic quantization. If unset, static quantization is used |
-| -p | --preserve-data-type | Preserve the input and output data types. If unset, input and output data types are not preserved |
-| -d | --outdir | Directory that output file will be written to |
-| -o | --outfile | ArmNN output file name |
-
-Example usage: <br>
-<code>./ArmnnQuantizer -f /path/to/armnn/input/graph/ -s "QSymm16" -c /path/to/csv/file -p 1 -d /path/to/output -o outputFileName</code>
diff --git a/src/armnnQuantizer/test/QuantizationDataSetTests.cpp b/src/armnnQuantizer/test/QuantizationDataSetTests.cpp
deleted file mode 100644
index 9e71f68e53..0000000000
--- a/src/armnnQuantizer/test/QuantizationDataSetTests.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include <boost/test/unit_test.hpp>
-
-#include "../QuantizationDataSet.hpp"
-
-#include <armnn/Optional.hpp>
-#include <Filesystem.hpp>
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <map>
-
-
-using namespace armnnQuantizer;
-
-struct CsvTestHelper {
-
- CsvTestHelper()
- {
- BOOST_TEST_MESSAGE("setup fixture");
- }
-
- ~CsvTestHelper()
- {
- BOOST_TEST_MESSAGE("teardown fixture");
- TearDown();
- }
-
- std::string CreateTempCsvFile(std::map<int, std::vector<float>> csvData)
- {
- fs::path fileDir = fs::temp_directory_path();
- fs::path p = armnnUtils::Filesystem::NamedTempFile("Armnn-QuantizationCreateTempCsvFileTest-TempFile.csv");
-
- fs::path tensorInput1{fileDir / "input_0_0.raw"};
- fs::path tensorInput2{fileDir / "input_1_0.raw"};
- fs::path tensorInput3{fileDir / "input_2_0.raw"};
-
- try
- {
- std::ofstream ofs{p};
-
- std::ofstream ofs1{tensorInput1};
- std::ofstream ofs2{tensorInput2};
- std::ofstream ofs3{tensorInput3};
-
-
- for(auto entry : csvData.at(0))
- {
- ofs1 << entry << " ";
- }
- for(auto entry : csvData.at(1))
- {
- ofs2 << entry << " ";
- }
- for(auto entry : csvData.at(2))
- {
- ofs3 << entry << " ";
- }
-
- ofs << "0, 0, " << tensorInput1.c_str() << std::endl;
- ofs << "2, 0, " << tensorInput3.c_str() << std::endl;
- ofs << "1, 0, " << tensorInput2.c_str() << std::endl;
-
- ofs.close();
- ofs1.close();
- ofs2.close();
- ofs3.close();
- }
- catch (std::exception &e)
- {
- std::cerr << "Unable to write to file at location [" << p.c_str() << "] : " << e.what() << std::endl;
- BOOST_TEST(false);
- }
-
- m_CsvFile = p;
- return p.string();
- }
-
- void TearDown()
- {
- RemoveCsvFile();
- }
-
- void RemoveCsvFile()
- {
- if (m_CsvFile)
- {
- try
- {
- fs::remove(m_CsvFile.value());
- }
- catch (std::exception &e)
- {
- std::cerr << "Unable to delete file [" << m_CsvFile.value() << "] : " << e.what() << std::endl;
- BOOST_TEST(false);
- }
- }
- }
-
- armnn::Optional<fs::path> m_CsvFile;
-};
-
-
-BOOST_AUTO_TEST_SUITE(QuantizationDataSetTests)
-
-BOOST_FIXTURE_TEST_CASE(CheckDataSet, CsvTestHelper)
-{
-
- std::map<int, std::vector<float>> csvData;
- csvData.insert(std::pair<int, std::vector<float>>(0, { 0.111111f, 0.222222f, 0.333333f }));
- csvData.insert(std::pair<int, std::vector<float>>(1, { 0.444444f, 0.555555f, 0.666666f }));
- csvData.insert(std::pair<int, std::vector<float>>(2, { 0.777777f, 0.888888f, 0.999999f }));
-
- std::string myCsvFile = CsvTestHelper::CreateTempCsvFile(csvData);
- QuantizationDataSet dataSet(myCsvFile);
- BOOST_TEST(!dataSet.IsEmpty());
-
- int csvRow = 0;
- for(armnnQuantizer::QuantizationInput input : dataSet)
- {
- BOOST_TEST(input.GetPassId() == csvRow);
-
- BOOST_TEST(input.GetLayerBindingIds().size() == 1);
- BOOST_TEST(input.GetLayerBindingIds()[0] == 0);
- BOOST_TEST(input.GetDataForEntry(0).size() == 3);
-
- // Check that QuantizationInput data for binding ID 0 corresponds to float values
- // used for populating the CSV file using by QuantizationDataSet
- BOOST_TEST(input.GetDataForEntry(0).at(0) == csvData.at(csvRow).at(0));
- BOOST_TEST(input.GetDataForEntry(0).at(1) == csvData.at(csvRow).at(1));
- BOOST_TEST(input.GetDataForEntry(0).at(2) == csvData.at(csvRow).at(2));
- ++csvRow;
- }
-}
-
-BOOST_AUTO_TEST_SUITE_END(); \ No newline at end of file