("input-type,y",po::value(&inputTypes), "The type of the input tensors in the network separated by comma. "
"If unset, defaults to \"float\" for all defined inputs. "
"Accepted values (float, int or qasymm8)")
+ ("quantize-input,q",po::bool_switch()->default_value(false),
+ "If this option is enabled, all float inputs will be quantized to qasymm8. "
+ "If unset, default to not quantized. "
+ "Accepted values (true or false)")
("output-type,z",po::value(&outputTypes),
"The type of the output tensors in the network separated by comma. "
"If unset, defaults to \"float\" for all defined outputs. "
bool concurrent = vm["concurrent"].as<bool>();
bool enableProfiling = vm["event-based-profiling"].as<bool>();
bool enableFp16TurboMode = vm["fp16-turbo-mode"].as<bool>();
+ bool quantizeInput = vm["quantize-input"].as<bool>();
// Check whether we have to load test cases from a file.
if (CheckOption(vm, "test-cases"))
}
return RunTest(modelFormat, inputTensorShapes, computeDevices, modelPath, inputNames,
- inputTensorDataFilePaths, inputTypes, outputTypes, outputNames,
+ inputTensorDataFilePaths, inputTypes, quantizeInput, outputTypes, outputNames,
enableProfiling, enableFp16TurboMode, thresholdTime, subgraphId);
}
}
}
template<>
+auto ParseDataArray<armnn::DataType::QuantisedAsymm8>(std::istream& stream)
+{
+ return ParseArrayImpl<uint8_t>(stream,
+ [](const std::string& s) { return boost::numeric_cast<uint8_t>(std::stoi(s)); });
+}
+
+template<>
auto ParseDataArray<armnn::DataType::QuantisedAsymm8>(std::istream& stream,
const float& quantizationScale,
const int32_t& quantizationOffset)
quantizationOffset));
});
}
-
std::vector<unsigned int> ParseArray(std::istream& stream)
{
return ParseArrayImpl<unsigned int>(stream,
const std::vector<std::unique_ptr<armnn::TensorShape>>& inputTensorShapes,
const std::vector<string>& inputTensorDataFilePaths,
const std::vector<string>& inputTypes,
+ bool quantizeInput,
const std::vector<string>& outputTypes,
const std::vector<string>& outputNames,
bool enableProfiling,
if (inputTypes[i].compare("float") == 0)
{
- inputDataContainers.push_back(
- ParseDataArray<armnn::DataType::Float32>(inputTensorFile));
+ if (quantizeInput)
+ {
+ auto inputBinding = model.GetInputBindingInfo();
+ inputDataContainers.push_back(
+ ParseDataArray<armnn::DataType::QuantisedAsymm8>(inputTensorFile,
+ inputBinding.second.GetQuantizationScale(),
+ inputBinding.second.GetQuantizationOffset()));
+ }
+ else
+ {
+ inputDataContainers.push_back(
+ ParseDataArray<armnn::DataType::Float32>(inputTensorFile));
+ }
}
else if (inputTypes[i].compare("int") == 0)
{
}
else if (inputTypes[i].compare("qasymm8") == 0)
{
- auto inputBinding = model.GetInputBindingInfo();
inputDataContainers.push_back(
- ParseDataArray<armnn::DataType::QuantisedAsymm8>(inputTensorFile,
- inputBinding.second.GetQuantizationScale(),
- inputBinding.second.GetQuantizationOffset()));
+ ParseDataArray<armnn::DataType::QuantisedAsymm8>(inputTensorFile));
}
else
{
const std::string& inputNames,
const std::string& inputTensorDataFilePaths,
const std::string& inputTypes,
+ bool quantizeInput,
const std::string& outputTypes,
const std::string& outputNames,
bool enableProfiling,
return MainImpl<armnnDeserializer::IDeserializer, float>(
modelPath.c_str(), isModelBinary, computeDevice,
inputNamesVector, inputTensorShapes,
- inputTensorDataFilePathsVector, inputTypesVector,
+ inputTensorDataFilePathsVector, inputTypesVector, quantizeInput,
outputTypesVector, outputNamesVector, enableProfiling,
enableFp16TurboMode, thresholdTime, subgraphId, runtime);
#else
return MainImpl<armnnCaffeParser::ICaffeParser, float>(modelPath.c_str(), isModelBinary, computeDevice,
inputNamesVector, inputTensorShapes,
inputTensorDataFilePathsVector, inputTypesVector,
- outputTypesVector, outputNamesVector, enableProfiling,
- enableFp16TurboMode, thresholdTime, subgraphId, runtime);
+ quantizeInput, outputTypesVector, outputNamesVector,
+ enableProfiling, enableFp16TurboMode, thresholdTime,
+ subgraphId, runtime);
#else
BOOST_LOG_TRIVIAL(fatal) << "Not built with Caffe parser support.";
return EXIT_FAILURE;
return MainImpl<armnnOnnxParser::IOnnxParser, float>(modelPath.c_str(), isModelBinary, computeDevice,
inputNamesVector, inputTensorShapes,
inputTensorDataFilePathsVector, inputTypesVector,
- outputTypesVector, outputNamesVector, enableProfiling,
- enableFp16TurboMode, thresholdTime, subgraphId, runtime);
+ quantizeInput, outputTypesVector, outputNamesVector,
+ enableProfiling, enableFp16TurboMode, thresholdTime,
+ subgraphId, runtime);
#else
BOOST_LOG_TRIVIAL(fatal) << "Not built with Onnx parser support.";
return EXIT_FAILURE;
return MainImpl<armnnTfParser::ITfParser, float>(modelPath.c_str(), isModelBinary, computeDevice,
inputNamesVector, inputTensorShapes,
inputTensorDataFilePathsVector, inputTypesVector,
- outputTypesVector, outputNamesVector, enableProfiling,
- enableFp16TurboMode, thresholdTime, subgraphId, runtime);
+ quantizeInput, outputTypesVector, outputNamesVector,
+ enableProfiling, enableFp16TurboMode, thresholdTime,
+ subgraphId, runtime);
#else
BOOST_LOG_TRIVIAL(fatal) << "Not built with Tensorflow parser support.";
return EXIT_FAILURE;
return MainImpl<armnnTfLiteParser::ITfLiteParser, float>(modelPath.c_str(), isModelBinary, computeDevice,
inputNamesVector, inputTensorShapes,
inputTensorDataFilePathsVector, inputTypesVector,
- outputTypesVector, outputNamesVector, enableProfiling,
- enableFp16TurboMode, thresholdTime, subgraphId,
- runtime);
+ quantizeInput, outputTypesVector, outputNamesVector,
+ enableProfiling, enableFp16TurboMode, thresholdTime,
+ subgraphId, runtime);
#else
BOOST_LOG_TRIVIAL(fatal) << "Unknown model format: '" << modelFormat <<
"'. Please include 'caffe', 'tensorflow', 'tflite' or 'onnx'";
("input-type,y",po::value(&inputTypes), "The type of the input tensors in the network separated by comma. "
"If unset, defaults to \"float\" for all defined inputs. "
"Accepted values (float, int or qasymm8).")
+ ("quantize-input,q",po::bool_switch()->default_value(false),
+ "If this option is enabled, all float inputs will be quantized to qasymm8. "
+ "If unset, default to not quantized. "
+ "Accepted values (true or false)")
("output-type,z",po::value(&outputTypes), "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).")
return EXIT_FAILURE;
}
+ // Get the value of the switch arguments.
+ bool quantizeInput = vm["quantize-input"].as<bool>();
+
// Get the preferred order of compute devices.
std::vector<armnn::BackendId> computeDevices = vm["compute"].as<std::vector<armnn::BackendId>>();
}
return RunTest(modelFormat, inputTensorShapes, computeDevices, modelPath, inputNames,
- inputTensorDataFilePaths, inputTypes, outputTypes, outputNames,
+ inputTensorDataFilePaths, inputTypes, quantizeInput, outputTypes, outputNames,
enableProfiling, enableFp16TurboMode, thresholdTime, subgraphId);
}
\ No newline at end of file