From 50311ba96912125a6f6d649d0451f6fab5c1011a Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Tue, 18 Feb 2020 13:25:23 +0000 Subject: COMPMID-3062: Add ExecuteNetwork option to explicitly dequantize output Signed-off-by: Georgios Pinitas Change-Id: Ic7abe5dad700fbdc1b7cbab6936b52554f0a0360 --- tests/ExecuteNetwork/ExecuteNetwork.cpp | 9 +++-- .../NetworkExecutionUtils.hpp | 40 +++++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/tests/ExecuteNetwork/ExecuteNetwork.cpp b/tests/ExecuteNetwork/ExecuteNetwork.cpp index 55864c8e02..3c0301010d 100644 --- a/tests/ExecuteNetwork/ExecuteNetwork.cpp +++ b/tests/ExecuteNetwork/ExecuteNetwork.cpp @@ -83,6 +83,10 @@ int main(int argc, const char* argv[]) "The type of the output tensors in the network separated by comma. " "If unset, defaults to \"float\" for all defined outputs. " "Accepted values (float, int or qasymm8).") + ("dequantize-output,l",po::bool_switch()->default_value(false), + "If this option is enabled, all quantized outputs will be dequantized to float. " + "If unset, default to not get dequantized. " + "Accepted values (true or false)") ("output-name,o", po::value(&outputNames), "Identifier of the output tensors in the network separated by comma.") ("write-outputs-to-file,w", po::value(&outputTensorFiles), @@ -153,6 +157,7 @@ int main(int argc, const char* argv[]) bool enableLayerDetails = vm["visualize-optimized-model"].as(); bool enableFp16TurboMode = vm["fp16-turbo-mode"].as(); bool quantizeInput = vm["quantize-input"].as(); + bool dequantizeOutput = vm["dequantize-output"].as(); bool printIntermediate = vm["print-intermediate-layers"].as(); bool enableExternalProfiling = vm["enable-external-profiling"].as(); bool fileOnlyExternalProfiling = vm["file-only-external-profiling"].as(); @@ -270,7 +275,7 @@ int main(int argc, const char* argv[]) return RunTest(modelFormat, inputTensorShapes, computeDevices, dynamicBackendsPath, modelPath, inputNames, inputTensorDataFilePaths, inputTypes, quantizeInput, outputTypes, outputNames, - outputTensorFiles, enableProfiling, enableFp16TurboMode, thresholdTime, printIntermediate, - subgraphId, enableLayerDetails, parseUnsupported, runtime); + outputTensorFiles, dequantizeOutput, enableProfiling, enableFp16TurboMode, thresholdTime, + printIntermediate, subgraphId, enableLayerDetails, parseUnsupported, runtime); } } diff --git a/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp b/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp index 97cf7c2b52..d7e9275916 100644 --- a/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp +++ b/tests/NetworkExecutionUtils/NetworkExecutionUtils.hpp @@ -198,11 +198,15 @@ void RemoveDuplicateDevices(std::vector& computeDevices) struct TensorPrinter : public boost::static_visitor<> { - TensorPrinter(const std::string& binding, const armnn::TensorInfo& info, const std::string& outputTensorFile) + TensorPrinter(const std::string& binding, + const armnn::TensorInfo& info, + const std::string& outputTensorFile, + bool dequantizeOutput) : m_OutputBinding(binding) , m_Scale(info.GetQuantizationScale()) , m_Offset(info.GetQuantizationOffset()) , m_OutputTensorFile(outputTensorFile) + , m_DequantizeOutput(dequantizeOutput) {} void operator()(const std::vector& values) @@ -216,16 +220,24 @@ struct TensorPrinter : public boost::static_visitor<> void operator()(const std::vector& values) { - auto& scale = m_Scale; - auto& offset = m_Offset; - std::vector dequantizedValues; - ForEachValue(values, [&scale, &offset, &dequantizedValues](uint8_t value) + if(m_DequantizeOutput) + { + auto& scale = m_Scale; + auto& offset = m_Offset; + std::vector dequantizedValues; + ForEachValue(values, [&scale, &offset, &dequantizedValues](uint8_t value) { auto dequantizedValue = armnn::Dequantize(value, scale, offset); printf("%f ", dequantizedValue); dequantizedValues.push_back(dequantizedValue); }); - WriteToFile(dequantizedValues); + WriteToFile(dequantizedValues); + } + else + { + const std::vector intValues(values.begin(), values.end()); + operator()(intValues); + } } void operator()(const std::vector& values) @@ -273,6 +285,7 @@ private: float m_Scale=0.0f; int m_Offset=0; std::string m_OutputTensorFile; + bool m_DequantizeOutput = false; }; @@ -363,6 +376,7 @@ struct ExecuteNetworkParams std::vector m_OutputTypes; std::vector m_OutputNames; std::vector m_OutputTensorFiles; + bool m_DequantizeOutput; bool m_EnableProfiling; bool m_EnableFp16TurboMode; double m_ThresholdTime; @@ -484,7 +498,10 @@ int MainImpl(const ExecuteNetworkParams& params, const armnn::TensorInfo& infoOut = infosOut[i].second; auto outputTensorFile = params.m_OutputTensorFiles.empty() ? "" : params.m_OutputTensorFiles[i]; - TensorPrinter printer(inferenceModelParams.m_OutputBindings[i], infoOut, outputTensorFile); + TensorPrinter printer(inferenceModelParams.m_OutputBindings[i], + infoOut, + outputTensorFile, + params.m_DequantizeOutput); boost::apply_visitor(printer, outputDataContainers[i]); } @@ -529,6 +546,7 @@ int RunTest(const std::string& format, const std::string& outputTypes, const std::string& outputNames, const std::string& outputTensorFiles, + bool dequantizeOuput, bool enableProfiling, bool enableFp16TurboMode, const double& thresholdTime, @@ -652,6 +670,7 @@ int RunTest(const std::string& format, params.m_OutputTypes = outputTypesVector; params.m_OutputNames = outputNamesVector; params.m_OutputTensorFiles = outputTensorFilesVector; + params.m_DequantizeOutput = dequantizeOuput; params.m_EnableProfiling = enableProfiling; params.m_EnableFp16TurboMode = enableFp16TurboMode; params.m_ThresholdTime = thresholdTime; @@ -787,6 +806,10 @@ int RunCsvTest(const armnnUtils::CsvRow &csvRow, const std::shared_ptrdefault_value(false), + "If this option is enabled, all quantized outputs will be dequantized to float. " + "If unset, default to not get dequantized. " + "Accepted values (true or false)") ("write-outputs-to-file,w", po::value(&outputTensorFiles), "Comma-separated list of output file paths keyed with the binding-id of the output slot. " "If left empty (the default), the output tensors will not be written to a file."); @@ -826,6 +849,7 @@ int RunCsvTest(const armnnUtils::CsvRow &csvRow, const std::shared_ptr(); + bool dequantizeOutput = vm["dequantize-output"].as(); // Get the preferred order of compute devices. std::vector computeDevices = vm["compute"].as>(); @@ -844,6 +868,6 @@ int RunCsvTest(const armnnUtils::CsvRow &csvRow, const std::shared_ptr