From 26f3307d87a08f9d01b62be041db3a1112f1af24 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Fri, 20 Dec 2019 15:11:26 +0100 Subject: [PATCH] tests/pkg_tensorflow-lite: add mnist_mlp complete example --- tests/pkg_tensorflow-lite/Makefile | 16 ++- tests/pkg_tensorflow-lite/mnist/.gitignore | 1 + tests/pkg_tensorflow-lite/mnist/Makefile | 16 +++ tests/pkg_tensorflow-lite/mnist/digit | Bin 0 -> 784 bytes .../mnist/generate_digit.py | 40 ++++++ .../mnist/main_functions.cc | 127 ++++++++++++++++++ tests/pkg_tensorflow-lite/mnist/mnist_mlp.py | 117 ++++++++++++++++ tests/pkg_tensorflow-lite/mnist/model.tflite | Bin 0 -> 52920 bytes tests/pkg_tensorflow-lite/tests/01-run.py | 4 +- 9 files changed, 318 insertions(+), 3 deletions(-) create mode 100644 tests/pkg_tensorflow-lite/mnist/.gitignore create mode 100644 tests/pkg_tensorflow-lite/mnist/Makefile create mode 100644 tests/pkg_tensorflow-lite/mnist/digit create mode 100755 tests/pkg_tensorflow-lite/mnist/generate_digit.py create mode 100644 tests/pkg_tensorflow-lite/mnist/main_functions.cc create mode 100755 tests/pkg_tensorflow-lite/mnist/mnist_mlp.py create mode 100644 tests/pkg_tensorflow-lite/mnist/model.tflite diff --git a/tests/pkg_tensorflow-lite/Makefile b/tests/pkg_tensorflow-lite/Makefile index 41e7d7b884..698b61a04f 100644 --- a/tests/pkg_tensorflow-lite/Makefile +++ b/tests/pkg_tensorflow-lite/Makefile @@ -3,9 +3,21 @@ DEVELHELP ?= 0 include ../Makefile.tests_common -EXAMPLE ?= hello_world +# Other available example: hello_world +EXAMPLE ?= mnist USEPKG += tensorflow-lite -USEMODULE += tensorflow-lite-$(EXAMPLE) + +# internal mnist example is available as an external module +ifeq (mnist,$(EXAMPLE)) + # TensorFlow-Lite crashes on M4/M7 CPUs when FPU is enabled, so disable it by + # default for now + DISABLE_MODULE += cortexm_fpu + USEMODULE += $(EXAMPLE) + EXTERNAL_MODULE_DIRS += $(CURDIR)/$(EXAMPLE) +else + # Use upstream example + USEMODULE += tensorflow-lite-$(EXAMPLE) +endif include $(RIOTBASE)/Makefile.include diff --git a/tests/pkg_tensorflow-lite/mnist/.gitignore b/tests/pkg_tensorflow-lite/mnist/.gitignore new file mode 100644 index 0000000000..bfb32af0dc --- /dev/null +++ b/tests/pkg_tensorflow-lite/mnist/.gitignore @@ -0,0 +1 @@ +model_basic.tflite diff --git a/tests/pkg_tensorflow-lite/mnist/Makefile b/tests/pkg_tensorflow-lite/mnist/Makefile new file mode 100644 index 0000000000..9636b37541 --- /dev/null +++ b/tests/pkg_tensorflow-lite/mnist/Makefile @@ -0,0 +1,16 @@ +MODULE = mnist + +SRCXXEXT = cc + +CXXEXFLAGS += -Wno-unused-parameter +CXXEXFLAGS += -Wno-type-limits + +CFLAGS += -Wno-pedantic + +# Add the tensorflow lite quantized model as a blob +BLOBS += model.tflite + +# Add the input digit image as blob +BLOBS += digit + +include $(RIOTBASE)/Makefile.base diff --git a/tests/pkg_tensorflow-lite/mnist/digit b/tests/pkg_tensorflow-lite/mnist/digit new file mode 100644 index 0000000000000000000000000000000000000000..6e67157fcf0d51926673c7ea31a4b5050fd5d0e0 GIT binary patch literal 784 zcmZQz7%m`W=ltn5D%gEUUKGM1C-(AxFb*k(#((d0aL8Hz{AY(lilO!2ZdM#}oM(Sn;gDje z`?n33l=trsmN?{u@BUkcLyGzIzuU?< + */ + +#include +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/kernels/micro_ops.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/schema/schema_generated.h" +#include "tensorflow/lite/version.h" + +#include "blob/digit.h" +#include "blob/model.tflite.h" + +#define THRESHOLD (0.5) + +// Globals, used for compatibility with Arduino-style sketches. +namespace { + tflite::ErrorReporter* error_reporter = nullptr; + const tflite::Model* model = nullptr; + tflite::MicroInterpreter* interpreter = nullptr; + TfLiteTensor* input = nullptr; + TfLiteTensor* output = nullptr; + + // Create an area of memory to use for input, output, and intermediate arrays. + // Finding the minimum value for your model may require some trial and error. + constexpr int kTensorArenaSize = 6 * 1024; + uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + static tflite::MicroErrorReporter micro_error_reporter; + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(model_tflite); + if (model->version() != TFLITE_SCHEMA_VERSION) { + printf("Model provided is schema version %d not equal " + "to supported version %d.", + static_cast(model->version()), TFLITE_SCHEMA_VERSION); + return; + } + + // Explicitly load required operators + static tflite::MicroMutableOpResolver micro_mutable_op_resolver; + micro_mutable_op_resolver.AddBuiltin( + tflite::BuiltinOperator_FULLY_CONNECTED, + tflite::ops::micro::Register_FULLY_CONNECTED(), 1, 4); + micro_mutable_op_resolver.AddBuiltin( + tflite::BuiltinOperator_SOFTMAX, + tflite::ops::micro::Register_SOFTMAX(), 1, 2); + micro_mutable_op_resolver.AddBuiltin( + tflite::BuiltinOperator_QUANTIZE, + tflite::ops::micro::Register_QUANTIZE()); + micro_mutable_op_resolver.AddBuiltin( + tflite::BuiltinOperator_DEQUANTIZE, + tflite::ops::micro::Register_DEQUANTIZE(), 1, 2); + + // Build an interpreter to run the model with. + static tflite::MicroInterpreter static_interpreter( + model, micro_mutable_op_resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + puts("AllocateTensors() failed"); + return; + } + + // Obtain pointers to the model's input and output tensors. + input = interpreter->input(0); + output = interpreter->output(0); + + // Copy digit array in input tensor + for (unsigned i = 0; i < digit_len; ++i) { + input->data.f[i] = static_cast(digit[i]) / 255.0; + } + + // Run inference, and report any error + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + puts("Invoke failed"); + return; + } + + // Get the best match from the output tensor + float val = 0; + uint8_t digit = 0; + for (unsigned i = 0; i < 10; ++i) { + float current = output->data.f[i]; + if (current > THRESHOLD && current > val) { + val = current; + digit = i; + } + } + + // Output the prediction, if there's one + if (val > 0) { + printf("Digit prediction: %d\n", digit); + } + else { + puts("No match found"); + } +} + +// The name of this function is important for Arduino compatibility. +void loop() {} diff --git a/tests/pkg_tensorflow-lite/mnist/mnist_mlp.py b/tests/pkg_tensorflow-lite/mnist/mnist_mlp.py new file mode 100755 index 0000000000..d2c66e2408 --- /dev/null +++ b/tests/pkg_tensorflow-lite/mnist/mnist_mlp.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 + +import os + +# imports for array-handling +import numpy as np + +import tensorflow as tf + +# keras imports for the dataset and building our neural network +from tensorflow.keras.datasets import mnist +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense, Dropout + + +# let's keep our keras backend tensorflow quiet +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + +# load mnist dataset +(X_train, y_train), (X_test, y_test) = mnist.load_data() + +# building the input vector from the 28x28 pixels +X_train = X_train.reshape(60000, 784) +X_test = X_test.reshape(10000, 784) +X_train = X_train.astype('float32') +X_test = X_test.astype('float32') + +# Split the train set in a train + validation set +X_valid = X_train[50000:] +y_valid = y_train[50000:] +X_train = X_train[:50000] +y_train = y_train[:50000] + +# Normalize the data +X_train = X_train / 255.0 +X_test = X_test / 255.0 +X_valid = X_valid / 255.0 + +# building a very simple linear stack of layers using a sequential model +model = Sequential([ + Dense(64, activation='relu', input_shape=(784,)), + Dropout(0.2), + Dense(10, activation='softmax') +]) + +# compiling the sequential model +model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'], + optimizer='adam') + +batch_size = 32 +epochs = 30 + +# training the model and saving metrics in history +history = model.fit(X_train, y_train, + batch_size=batch_size, epochs=epochs, + verbose=2, + validation_data=(X_valid, y_valid)) + +# saving the model +# Convert the model to the TensorFlow Lite format without quantization +converter = tf.lite.TFLiteConverter.from_keras_model(model) +tflite_model = converter.convert() + +# Save the basic model to disk +open("model_basic.tflite", "wb").write(tflite_model) + +# Convert the model to the TensorFlow Lite format with quantization +converter = tf.lite.TFLiteConverter.from_keras_model(model) + +(mnist_train, _), (_, _) = mnist.load_data() +mnist_train = mnist_train.reshape(60000, 784) +mnist_train = mnist_train.astype('float32') +mnist_train = mnist_train / 255.0 +mnist_ds = tf.data.Dataset.from_tensor_slices((mnist_train)).batch(1) + + +def representative_data_gen(): + for input_value in mnist_ds.take(100): + yield [input_value] + + +converter.representative_dataset = representative_data_gen +converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE] +tflite_model = converter.convert() + +# # Save the quantized model to disk +open("model.tflite", "wb").write(tflite_model) + +basic_model_size = os.path.getsize("model_basic.tflite") +print("Basic model is %d bytes" % basic_model_size) +quantized_model_size = os.path.getsize("model.tflite") +print("Quantized model is %d bytes" % quantized_model_size) +difference = basic_model_size - quantized_model_size +print("Difference is %d bytes" % difference) + +# Now let's verify the model on a few input digits +# Instantiate an interpreter for the model +model_quantized_reloaded = tf.lite.Interpreter('model.tflite') + +# Allocate memory for each model +model_quantized_reloaded.allocate_tensors() + +# Get the input and output tensors so we can feed in values and get the results +model_quantized_input = model_quantized_reloaded.get_input_details()[0]["index"] +model_quantized_output = model_quantized_reloaded.get_output_details()[0]["index"] + +# Create arrays to store the results +model_quantized_predictions = np.empty(X_test.size) + +for i in range(10): + # Invoke the interpreter + model_quantized_reloaded.set_tensor(model_quantized_input, X_test[i:i+1, :]) + model_quantized_reloaded.invoke() + model_quantized_prediction = model_quantized_reloaded.get_tensor(model_quantized_output) + + print("Digit: {} - Prediction:\n{}".format(y_test[i], model_quantized_prediction)) + print("") diff --git a/tests/pkg_tensorflow-lite/mnist/model.tflite b/tests/pkg_tensorflow-lite/mnist/model.tflite new file mode 100644 index 0000000000000000000000000000000000000000..aee2b30c8ec6668ccc77262c32d048e0ce4f0f62 GIT binary patch literal 52920 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