TensorFlow Lite en ESP32

¿Qué es TensorFlow Lite?

TensorFlow Lite es una versión ligera de TensorFlow, diseñada para dispositivos móviles e integrados como ESP32, que permite que los modelos de aprendizaje automático se ejecuten en hardware con recursos limitados.

Pasos para desplegar en ESP32

Aquí se explica cómo poner en funcionamiento un modelo de aprendizaje automático en tu ESP32:

Entrenar un modelo

Entrena una red neuronal simple, como predecir valores de seno, usando Python y Keras en tu PC. Instala TensorFlow con:
  • Comando: pip install tensorflow
  • Código de ejemplo:
    importar numpy como np
    importar tensorflow como tf
    de tensorflow importar keras
    
    ángulos = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(ángulos)
    modelo = keras.Sequential([keras.layers.Dense(1, input_shape=(1,))])
    model.compile(optimizer='adam', loss='error_cuadrático_medio')
    model.fit(ángulos, senos, epochs=100, verbose=0)
    model.save('sine_model.h5')
        
      
    ✔ ¡Copiado!

Convertir a TensorFlow Lite

Convertir el modelo entrenado al formato .tflite:
  • Instalar herramienta: pip install tflite
  • Convertir: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite

Configurar ESP32

Utilice Arduino IDE para el desarrollo de ESP32. Instale el soporte para ESP32:

Integrar y ejecutar

Convertir .tflite a matriz C: xxd -i sine_model.tflite > sine_model.h. Usa este sketch de Arduino:
  • Código:
    #include 
    #include "tflite-micro.h"
    #include "sine_model.h"
    
    tflite::MicroErrorReporter micro_error_reporter;
    tflite::ErrorReporter* error_reporter = µ_error_reporter;
    const unsigned char* datos_modelo = sine_model;
    const size_t model_size = sine_model_len;
    const tflite::Model* modelo = tflite::GetModel(model_data);
    tflite::AllOpsResolver resolvedor;
    constexpr int kTensorArenaSize = 2000;
    uint8_t tensor_arena[kTensorArenaSize];
    tflite::MicroInterpreter intérprete(modelo, resolvedor, tensor_arena, kTensorArenaSize, reportero_de_errores);
    
    float randomFloat(float min, float max) {
        return min + (max - min) * (float)random(0, 10000) / 10000.0;
    }
    
    configuración vacía() {
        Serial.begin(115200);
        interpreter.AllocateTensors();
    }
    
    bucle vacío() {
        float angle = randomFloat(-3.1416, 3.1416);
        TfLiteTensor* entrada = interpreter.input(0);
        input->data.f[0] = ángulo;
        if (interpreter.Invoke() != kTfLiteOk) {
            error_reporter->Report("Error al invocar el modelo");
            devolver;
        }
        TfLiteTensor* salida = interpreter.output(0);
        float prediction = output->data.f[0];
        Serial.print("Ángulo: ");
        Serial.print(ángulo);
        Serial.print(", Seno predicho: ");
        Serial.println(predicción);
        retraso(1000);
    }
        
      
    ✔ ¡Copiado!
  • Sube al ESP32, abre el Monitor Serial para ver los resultados.

Detalle inesperado

Podrías no esperar que la función de número flotante aleatorio use una simple escala de random(0, 10000), lo cual puede no ser lo más preciso para ML, pero funciona para este ejemplo.

Desplegando TensorFlow Lite en ESP32

Este análisis exhaustivo explora el despliegue de TensorFlow Lite en el microcontrolador ESP32, detallando el proceso desde el entrenamiento del modelo hasta la ejecución, basado en la investigación y la implementación práctica. El enfoque está en proporcionar una guía completa para desarrolladores, asegurando que todos los pasos sean claros y accionables, con consideraciones para las limitaciones de memoria y la integración de bibliotecas.

Antecedentes y Contexto

TensorFlow Lite, una versión ligera de TensorFlow, está diseñado para ejecutar modelos de aprendizaje automático en dispositivos con recursos limitados, como teléfonos móviles, sistemas embebidos y microcontroladores. El ESP32, desarrollado por Espressif, es un microcontrolador popular con capacidades de Wi-Fi y Bluetooth, lo que lo hace ideal para aplicaciones de IoT. Ejecutar modelos de aprendizaje automático localmente en ESP32 mejora la privacidad, reduce la latencia y disminuye los costos al evitar la dependencia de la nube.
El proceso implica entrenar un modelo en una PC, convertirlo al formato TensorFlow Lite, configurar el entorno de desarrollo ESP32, integrar el modelo y ejecutarlo para observar los resultados. Este análisis cubre cada paso, abordando posibles desafíos y proporcionando ejemplos de código detallados.

Pasos detallados para el despliegue

Paso 1: Entrenamiento de un Modelo de Aprendizaje Automático

El primer paso es entrenar un modelo de aprendizaje automático utilizando un escritorio o servidor con suficiente potencia computacional. Para este ejemplo, entrenamos una red neuronal simple para predecir el seno de un ángulo dado, usando Python y la API de Keras.
  • Instalación: Instale TensorFlow con el comando pip install tensorflow.
  • Código de Entrenamiento: El siguiente código genera un conjunto de datos y entrena el modelo:
    importar numpy como np
    importar tensorflow como tf
    de tensorflow importar keras
    
    # Generar conjunto de datos
    ángulos = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(ángulos)
    
    # Crear un modelo de red neuronal simple
    modelo = keras.Sequential([
        keras.layers.Dense(1, input_shape=(1,))
    ])
    
    # Compilar el modelo
    model.compile(optimizer='adam', loss='error_cuadrático_medio')
    
    # Entrenar el modelo
    model.fit(ángulos, senos, epochs=100, verbose=0)
    
    # Guardar el modelo
    model.save('sine_model.h5')
        
      
    ✔ ¡Copiado!
  • Notas: Este modelo es simple, con una capa densa, adecuado para los recursos limitados del ESP32. El conjunto de datos consta de 1000 ángulos aleatorios y sus valores de seno, entrenado durante 100 épocas con el optimizador Adam y la pérdida de error cuadrático medio.

Paso 2: Convertir el modelo al formato TensorFlow Lite

Después del entrenamiento, convierte el modelo al formato TensorFlow Lite (.tflite) para su implementación en dispositivos con recursos limitados.
  • Instalación: Instale la herramienta de conversión con pip install tflite.
  • Comando de conversión: Utilice lo siguiente para convertir:
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
  
✔ ¡Copiado!
  • Detalles: El archivo .tflite está optimizado para tamaño y rendimiento, crucial para microcontroladores como ESP32 con memoria flash y RAM limitadas.

Paso 3: Configuración del entorno de desarrollo ESP32

Utilice el IDE de Arduino para el desarrollo de ESP32, asegurándose de que el soporte de la placa y las bibliotecas necesarias estén instalados.
  • Soporte para placa ESP32:
      Abre Arduino IDE, ve a Archivo > Preferencias, y añade http://dl.espressif.com/dl/package_esp32_index.json a URLs adicionales del Administrador de placas.
      Ve a Herramientas > Placa > Gestor de placas, busca "esp32" e instala la última versión.
  • Biblioteca TensorFlow Lite Micro:
      Descarga desde el repositorio de GitHub y añade al directorio de bibliotecas de Arduino, o usa el Gestor de Bibliotecas si está disponible.
      Asegure la compatibilidad con ESP32, ya que Espressif proporciona soporte específico para tflite-micro.

Paso 4: Integrando el Modelo en el Código ESP32

Integra el modelo convirtiendo el archivo .tflite en un arreglo C y escribiendo un sketch de Arduino para cargarlo y ejecutarlo.
  • Convertir a matriz C: Use xxd -i sine_model.tflite > sine_model.h para generar un archivo de encabezado que contenga los datos del modelo como una matriz C, típicamente:
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);

Sketch de Arduino: El siguiente código carga y ejecuta el modelo:
#include 
#include "tflite-micro.h"
#include "sine_model.h"

tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = µ_error_reporter;
const unsigned char* datos_modelo = sine_model;
const size_t model_size = sine_model_len;
const tflite::Model* modelo = tflite::GetModel(model_data);
tflite::AllOpsResolver resolvedor;
constexpr int kTensorArenaSize = 2000;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroInterpreter intérprete(modelo, resolvedor, tensor_arena, kTensorArenaSize, reportero_de_errores);

float randomFloat(float min, float max) {
    return min + (max - min) * (float)random(0, 10000) / 10000.0;
}

configuración vacía() {
    Serial.begin(115200);
    interpreter.AllocateTensors();
}

bucle vacío() {
    float angle = randomFloat(-3.1416, 3.1416);
    TfLiteTensor* entrada = interpreter.input(0);
    input->data.f[0] = ángulo;
    if (interpreter.Invoke() != kTfLiteOk) {
        error_reporter->Report("Error al invocar el modelo");
        devolver;
    }
    TfLiteTensor* salida = interpreter.output(0);
    float prediction = output->data.f[0];
    Serial.print("Ángulo: ");
    Serial.print(ángulo);
    Serial.print(", Seno predicho: ");
    Serial.println(predicción);
    retraso(1000);
}
  
✔ ¡Copiado!

 

  • Notas: La función randomFloat genera ángulos aleatorios para pruebas, utilizando un método de escalado simple. El tamaño del área de tensores (2000 bytes) puede necesitar ajuste para modelos más grandes, dado que el ESP32 tiene 520 KB de SRAM.

Paso 5: Subir y Ejecutar el Código

Compila y sube el sketch usando Arduino IDE, luego abre el Monitor Serial para observar los resultados, como ángulos y valores de seno predichos.
  • Procedimiento: Asegúrese de que la placa esté seleccionada correctamente (por ejemplo, ESP32 Dev Module), compile y cargue. Abra el Monitor Serial a 115200 baudios para ver las salidas.

Consideraciones y Desafíos Potenciales

  • Restricciones de memoria: ESP32 tiene 520 KB de SRAM y flash limitado, así que asegúrate de que el modelo y el área de tensores quepan dentro de estos límites. Optimiza reduciendo la complejidad del modelo o aumentando el tamaño del área de tensores si es necesario.
  • Compatibilidad de la biblioteca: Asegúrese de que la versión de la biblioteca tflite-micro coincida con los requisitos de ESP32, ya que Espressif proporciona soporte específico.
  • Generación de Números Aleatorios: La función randomFloat utiliza un método de escalado simple, que puede no ser preciso para todas las aplicaciones. Considere usar un generador de números aleatorios más robusto para producción.
Paso Descripción Ejemplo de Comando/Código
Instalar TensorFlow Instalar TensorFlow para el entrenamiento del modelo pip install tensorflow
Modelo de tren Entrenar un modelo de predicción de seno usando Keras Ver código Python arriba
Convertir modelo Convertir a formato TensorFlow Lite tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Convertir a matriz C Generar encabezado C para datos del modelo xxd -i sine_model.tflite > sine_model.h
Configurar ESP32 Instalar soporte para placa ESP32 y la biblioteca tflite-micro Agregar URL http://dl.espressif.com/dl/package_esp32_index.json, instalar a través del Gestor de Tarjetas
Ejecutar en ESP32 Sketch de Arduino para cargar y ejecutar el modelo Vea el código C++ arriba

 

Observación Inesperada

Podrías no esperar que la función de flotante aleatorio use una simple escala de random(0, 10000), lo cual puede no ser lo más preciso para el aprendizaje automático, pero funciona para este ejemplo, destacando las compensaciones en sistemas embebidos.

 

Conclusión

Esta guía proporciona un proceso integral para desplegar TensorFlow Lite en ESP32, desde entrenar un modelo simple de predicción de seno hasta ejecutarlo localmente. Abre posibilidades para dispositivos IoT inteligentes, con consideraciones para la memoria y la integración de bibliotecas que aseguran una implementación práctica.

Citas clave

 

Dejar un comentario

Tu dirección de correo electrónico no se publicará. Los campos requeridos están marcados con *

Regístrese para nuestro boletín

Reciba la información más reciente sobre nuestros productos y ofertas especiales.