From 507f39d2bc6f1537faca86633bf756831f0c770d Mon Sep 17 00:00:00 2001 From: Pablo Tello Date: Mon, 15 Apr 2019 15:44:39 +0100 Subject: MLCE-103: MDK changes for running multiple inferences qasymm8 Change-Id: I34e8e0736e133ffb5f931ce3b5f5bfa4e2c975c2 Signed-off-by: Pablo Tello --- tests/InferenceModel.hpp | 4 + .../TfLiteMobilenetQuantized-Armnn.cpp | 103 +++++++++++++++------ 2 files changed, 79 insertions(+), 28 deletions(-) (limited to 'tests') diff --git a/tests/InferenceModel.hpp b/tests/InferenceModel.hpp index cb6daefa9e..72c5edac29 100644 --- a/tests/InferenceModel.hpp +++ b/tests/InferenceModel.hpp @@ -393,6 +393,7 @@ public: std::vector m_ComputeDevices; bool m_VisualizePostOptimizationModel; bool m_EnableFp16TurboMode; + std::string m_Labels; std::vector GetComputeDevicesAsBackendIds() { @@ -417,6 +418,9 @@ public: ("compute,c", po::value>(&options.m_ComputeDevices)-> default_value(defaultComputes, boost::algorithm::join(defaultComputes, ", "))-> multitoken(), backendsMessage.c_str()) + ("labels,l", po::value(&options.m_Labels), + "Text file containing one image filename - correct label pair per line, " + "used to test the accuracy of the network.") ("visualize-optimized-model,v", po::value(&options.m_VisualizePostOptimizationModel)->default_value(false), "Produce a dot file useful for visualizing the graph post optimization." diff --git a/tests/TfLiteMobilenetQuantized-Armnn/TfLiteMobilenetQuantized-Armnn.cpp b/tests/TfLiteMobilenetQuantized-Armnn/TfLiteMobilenetQuantized-Armnn.cpp index 36b1d14008..220964d061 100644 --- a/tests/TfLiteMobilenetQuantized-Armnn/TfLiteMobilenetQuantized-Armnn.cpp +++ b/tests/TfLiteMobilenetQuantized-Armnn/TfLiteMobilenetQuantized-Armnn.cpp @@ -6,41 +6,88 @@ #include "../ImagePreprocessor.hpp" #include "armnnTfLiteParser/ITfLiteParser.hpp" +#include "boost/program_options.hpp" +#include + using namespace armnnTfLiteParser; +std::vector ParseDataset(const std::string& filename) +{ + std::ifstream read(filename); + std::vector imageSet; + if (read.is_open()) + { + // Get the images and the correct corresponding label from the given file + for (std::string line; std::getline(read, line);) + { + stringstream ss(line); + std::string image_name; + std::string label; + getline(ss, image_name, ' '); + getline(ss, label, ' '); + imageSet.push_back(ImageSet(image_name, std::stoi(label))); + } + } + else + { + // Use the default images + imageSet.push_back(ImageSet("Dog.jpg", 209)); + // top five predictions in tensorflow: + // ----------------------------------- + // 209:Labrador retriever 0.949995 + // 160:Rhodesian ridgeback 0.0270182 + // 208:golden retriever 0.0192866 + // 853:tennis ball 0.000470382 + // 239:Greater Swiss Mountain dog 0.000464451 + imageSet.push_back(ImageSet("Cat.jpg", 283)); + // top five predictions in tensorflow: + // ----------------------------------- + // 283:tiger cat 0.579016 + // 286:Egyptian cat 0.319676 + // 282:tabby, tabby cat 0.0873346 + // 288:lynx, catamount 0.011163 + // 289:leopard, Panthera pardus 0.000856755 + imageSet.push_back(ImageSet("shark.jpg", 3)); + // top five predictions in tensorflow: + // ----------------------------------- + // 3:great white shark, white shark, ... 0.996926 + // 4:tiger shark, Galeocerdo cuvieri 0.00270528 + // 149:killer whale, killer, orca, ... 0.000121848 + // 395:sturgeon 7.78977e-05 + // 5:hammerhead, hammerhead shark 6.44127e-055 + }; + return imageSet; +} + +std::string GetLabelsFilenameFromOptions(int argc, char* argv[]) +{ + namespace po = boost::program_options; + po::options_description desc("Validation Options"); + std::string fn(""); + desc.add_options() + ("labels", po::value(&fn), "Filename of a text file where in each line contains an image " + "filename and the correct label the network should predict when fed that image"); + po::variables_map vm; + po::parsed_options parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); + po::store(parsed, vm); + if (vm.count("labels")) + { + fn = vm["labels"].as(); + } + return fn; +} + + int main(int argc, char* argv[]) { int retVal = EXIT_FAILURE; try { // Coverity fix: The following code may throw an exception of type std::length_error. - std::vector imageSet = - { - {"Dog.jpg", 209}, - // top five predictions in tensorflow: - // ----------------------------------- - // 209:Labrador retriever 0.949995 - // 160:Rhodesian ridgeback 0.0270182 - // 208:golden retriever 0.0192866 - // 853:tennis ball 0.000470382 - // 239:Greater Swiss Mountain dog 0.000464451 - {"Cat.jpg", 283}, - // top five predictions in tensorflow: - // ----------------------------------- - // 283:tiger cat 0.579016 - // 286:Egyptian cat 0.319676 - // 282:tabby, tabby cat 0.0873346 - // 288:lynx, catamount 0.011163 - // 289:leopard, Panthera pardus 0.000856755 - {"shark.jpg", 3}, - // top five predictions in tensorflow: - // ----------------------------------- - // 3:great white shark, white shark, ... 0.996926 - // 4:tiger shark, Galeocerdo cuvieri 0.00270528 - // 149:killer whale, killer, orca, ... 0.000121848 - // 395:sturgeon 7.78977e-05 - // 5:hammerhead, hammerhead shark 6.44127e-055 - }; + const std::string labels_file = GetLabelsFilenameFromOptions(argc,argv); + std::vector imageSet = ParseDataset(labels_file); + std::vector indices(imageSet.size()); + std::generate(indices.begin(), indices.end(), [n = 0] () mutable { return n++; }); armnn::TensorShape inputTensorShape({ 1, 224, 224, 3 }); @@ -57,7 +104,7 @@ int main(int argc, char* argv[]) true, // model is binary "input", // input tensor name "MobilenetV1/Predictions/Reshape_1", // output tensor name - { 0, 1, 2 }, // test images to test with as above + indices, // vector of indices to select which images to validate [&imageSet](const char* dataDir, const ModelType & model) { // we need to get the input quantization parameters from // the parsed model -- cgit v1.2.1