From 8b1b548ed23e4a5f455e79d014250ef0e50d2497 Mon Sep 17 00:00:00 2001 From: "Kwabena W. Agyeman" Date: Fri, 12 Jul 2024 15:30:48 -0700 Subject: [PATCH] scripts/examples: Add regression example. --- .../00-TensorFlow/tf_regression.py | 31 ++++++++++++++++++ src/lib/tflm/models/force_int_quant.tflite | Bin 0 -> 10600 bytes src/lib/tflm/models/index.txt | 1 + src/omv/boards/OPENMV_RT1060/imlib_config.h | 1 + 4 files changed, 33 insertions(+) create mode 100644 scripts/examples/03-Machine-Learning/00-TensorFlow/tf_regression.py create mode 100644 src/lib/tflm/models/force_int_quant.tflite diff --git a/scripts/examples/03-Machine-Learning/00-TensorFlow/tf_regression.py b/scripts/examples/03-Machine-Learning/00-TensorFlow/tf_regression.py new file mode 100644 index 000000000..70a92f41a --- /dev/null +++ b/scripts/examples/03-Machine-Learning/00-TensorFlow/tf_regression.py @@ -0,0 +1,31 @@ +# This work is licensed under the MIT license. +# Copyright (c) 2013-2024 OpenMV LLC. All rights reserved. +# https://github.com/openmv/openmv/blob/master/LICENSE +# +# TensorFlow Lite Regression Example +# +# This example shows off running a regression model on the OpenMV Cam. +# A regression model takes an input list of numbers and produces an +# output list of numbers. You may pass ndarrays arrays to predict() +# and you will get a list of the results back. +# +# Note: The input list of numbers must be the same size as the input +# tensor size of the model. + +import ml +from ulab import numpy as np + +# The model is built-in on the RT1062. On other OpenMV Cam's with limited flash space please grab +# the model from here: https://github.com/openmv/openmv/tree/master/src/lib/tflm/models and +# copy it to the OpenMV Cam's file system. E.g. model = ml.Model("force_int_quant.tflite") +model = ml.Model("force_int_quant") +print(model) + +i = np.array([-3, -1, -2, 5, -2, 10, -1, 9, 0, # noqa + 2, 0, 9, 1, 10, 2, -1, 3, 5, # noqa + 3, 9, 3, 9, 6, 2, 6, 7, 5, # noqa + 10, 6, -1, 7, 4, 7, 8, 5, 7], # noqa + dtype=np.int8).reshape(model.input_shape[0]) # noqa + +print(model.predict([i])[0]) +# Should print 53.78332 diff --git a/src/lib/tflm/models/force_int_quant.tflite b/src/lib/tflm/models/force_int_quant.tflite new file mode 100644 index 0000000000000000000000000000000000000000..cdf258d9a4c6a8964a4a14f67453f2041ee83001 GIT binary patch literal 10600 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 LS@!JB{Ad3^Wer3U literal 0 HcmV?d00001 diff --git a/src/lib/tflm/models/index.txt b/src/lib/tflm/models/index.txt index 3b4ee2601..866f53c0e 100644 --- a/src/lib/tflm/models/index.txt +++ b/src/lib/tflm/models/index.txt @@ -5,3 +5,4 @@ fomo_face_detection.tflite micro_speech.tflite person_detect.tflite person_detect_vela.tflite +force_int_quant.tflite diff --git a/src/omv/boards/OPENMV_RT1060/imlib_config.h b/src/omv/boards/OPENMV_RT1060/imlib_config.h index eb36be078..367621d77 100644 --- a/src/omv/boards/OPENMV_RT1060/imlib_config.h +++ b/src/omv/boards/OPENMV_RT1060/imlib_config.h @@ -118,6 +118,7 @@ #define IMLIB_ENABLE_TFLM #define IMLIB_ENABLE_TFLM_BUILTIN_FOMO_FACE_DETECTION #define IMLIB_ENABLE_TFLM_BUILTIN_PERSON_DETECT +#define IMLIB_ENABLE_TFLM_BUILTIN_FORCE_INT_QUANT #endif // Enable FAST (20+ KBs).