Path: blob/master/site/es-419/lite/microcontrollers/get_started_low_level.md
25118 views
Introducción a los microcontroladores
Este documento explica cómo entrenar un modelo y ejecutar la inferencia usando un microcontrolador.
El ejemplo de Hello World
El ejemplo Hello World está diseñado para demostrar los fundamentos absolutos del uso de TensorFlow Lite para microcontroladores. Entrenamos y ejecutamos un modelo que reproduce una función seno, es decir, toma un único número como entrada y emite el valor seno del número. Cuando se implementa en el microcontrolador, sus predicciones se usan para hacer parpadear los LED o controlar una animación.
El flujo de trabajo de punta a punta implica los siguientes pasos:
Entrenar un modelo (en Python): Un archivo python a fin de entrenar, convertir y optimizar un modelo para usarlo en el dispositivo.
Ejecutar inferencia (en C++ 17): Una prueba de unidad de extremo a extremo que ejecuta la inferencia sobre el modelo usando la librería C++.
Conseguir un dispositivo compatible
La aplicación de ejemplo que vamos a usar ha sido probada en los siguientes dispositivos:
Arduino Nano 33 BLE Sense (usando Arduino IDE)
SparkFun Edge (construyendo directamente desde la fuente)
Kit Discovery STM32F746 (usando Mbed)
Adafruit EdgeBadge (usando Arduino IDE)
Adafruit TensorFlow Lite para Kit de Microcontroladores (usando Arduino IDE)
Adafruit Circuit Playground Bluefruit (usando Arduino IDE)
Espressif ESP32-DevKitC (usando ESP IDF)
Espressif ESP-EYE (usando ESP IDF)
Aprenda más sobre las plataformas compatibles en TensorFlow Lite para microcontroladores.
Entrenar un modelo
Nota: Puede saltarse esta sección y usar el modelo entrenado incluido en el código de ejemplo.
Usar train.py para el entrenamiento del modelo hello world para el reconocimiento de ondas sinusoidales
Ejecutar: bazel build tensorflow/lite/micro/examples/hello_world:train
bazel-bin/tensorflow/lite/micro/examples/hello_world/train --save_tf_model --save_dir=/tmp/model_created/
Ejecutar inferencia
Para ejecutar el modelo en su dispositivo, seguiremos las instrucciones del archivo README.md
:
Las siguientes secciones le guiarán a través del ejemplo evaluate_test.cc
, una prueba de unidad que demuestra cómo ejecutar la inferencia usando TensorFlow Lite para microcontroladores. Carga el modelo y ejecuta la inferencia varias veces.
1. Incluya las cabeceras de la librería
Para usar la librería TensorFlow Lite para microcontroladores, debemos incluir los siguientes archivos de cabecera:
micro_mutable_op_resolver.h
aporta las operaciones que utiliza el intérprete para ejecutar el modelo.micro_error_reporter.h
emite información de depuración.micro_interpreter.h
contiene código para cargar y ejecutar modelos.schema_generated.h
contiene el esquema para el formato de archivo del modelo TensorFlow LiteFlatBuffer
.version.h
facilita información sobre versiones para el esquema de TensorFlow Lite.
2. Incluya la cabecera del modelo
El intérprete de TensorFlow Lite para microcontroladores espera que el modelo se facilite como un arreglo de C++. El modelo se define en los archivos model.h
y model.cc
. La cabecera se incluye con la siguiente línea:
3. Incluya la cabecera del marco de pruebas de unidad
Para crear una prueba de unidad, incluimos el marco de pruebas de unidad de TensorFlow Lite para microcontroladores con la siguiente línea:
La prueba se define usando las siguientes macros:
A continuación analizamos el código incluido en la macro anterior.
4. Configure el registro
Para configurar el registro, se crea un puntero tflite::ErrorReporter
utilizando un puntero a una instancia tflite::MicroErrorReporter
:
Esta variable se pasará al intérprete, lo que le permitirá escribir logs. Dado que los microcontroladores suelen tener una gran variedad de mecanismos para registrar logs, la implementación de tflite::MicroErrorReporter
está diseñada para ser personalizada para su dispositivo en particular.
5. Cargue un modelo
En el código siguiente, el modelo se instancia usando datos de un arreglo char
, g_model
, que se declara en model.h
. A continuación, revisamos el modelo para asegurarnos de que su versión del esquema es compatible con la versión que estamos usando:
6. Instancie el resolver de operaciones
Se declara una instancia MicroMutableOpResolver
. El intérprete la usará para registrar y acceder a las operaciones que utiliza el modelo:
El MicroMutableOpResolver
requiere un parámetro de plantilla que indique el número de ops que se registrarán. La función RegisterOps
registra las ops con el resolver.
7. Asigne memoria
Necesitamos preasignar una cierta cantidad de memoria para los arreglos de entrada, salida e intermedios. Esto se facilita como un arreglo uint8_t
de tamaño tensor_arena_size
:
El tamaño necesario dependerá del modelo que esté usando y puede que tenga que determinarlo experimentando.
8. Instancie el intérprete
Creamos una instancia de tflite::MicroInterpreter
, pasándole las variables creadas anteriormente:
9. Asigne tensores
Le decimos al intérprete que asigne memoria del tensor_arena
para los tensores del modelo:
10. Valide la forma de entrada
La instancia MicroInterpreter
puede darnos un puntero al tensor de entrada del modelo llamando a .input(0)
, donde 0
representa el primer (y único) tensor de entrada:
Luego inspeccionamos este tensor para confirmar que su forma y tipo son los que esperamos:
El valor enum kTfLiteFloat32
es una referencia a uno de los tipos de datos de TensorFlow Lite, y está definido en common.h
.
11. Dar un valor de entrada
Para dar entrada al modelo, fijamos el contenido del tensor de entrada, como sigue:
En este caso, se introduce un valor de punto flotante que representa 0
.
12. Ejecute el modelo
Para ejecutar el modelo, podemos llamar a Invoke()
en nuestra instancia tflite::MicroInterpreter
:
Podemos revisar el valor de retorno, un TfLiteStatus
, para determinar si la ejecución se ha realizado correctamente. Los posibles valores de TfLiteStatus
, definidos en common.h
, son kTfLiteOk
y kTfLiteError
.
El código siguiente afirma que el valor es kTfLiteOk
, lo que significa que la inferencia se ha ejecutado correctamente.
13. Obtenga la salida
El tensor de salida del modelo puede obtenerse llamando a output(0)
en el tflite::MicroInterpreter
, donde 0
representa el primer (y único) tensor de salida.
En el ejemplo, la salida del modelo es un único valor de punto flotante contenido en un tensor 2D:
Podemos leer el valor directamente del tensor de salida y afirmar que es lo que esperamos:
14. Ejecutar la inferencia de nuevo
El resto del código ejecuta la inferencia varias veces más. En cada ocasión, asignamos un valor al tensor de entrada, invocamos al intérprete y leemos el resultado del tensor de salida: