TensorFlow Lite su ESP32

Cos'è TensorFlow Lite?

TensorFlow Lite è una versione leggera di TensorFlow, progettata per dispositivi mobili e embedded come ESP32, che consente ai modelli di machine learning di funzionare su hardware con risorse limitate.

Passaggi per il deployment su ESP32

Ecco come far funzionare un modello di machine learning sul tuo ESP32:

Addestrare un modello

Addestra una rete neurale semplice, come prevedere i valori del seno, usando Python e Keras sul tuo PC. Installa TensorFlow con:
  • Comando: pip install tensorflow
  • Codice di esempio:
    importa numpy come np
    importa tensorflow come tf
    da tensorflow import keras
    
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angoli)
    model = keras.Sequential([keras.layers.Dense(1, input_shape=(1,))])
    model.compile(optimizer='adam', loss='mean_squared_error')
    model.fit(angoli, seni, epochs=100, verbose=0)
    model.save('sine_model.h5')
        
      
    ✔ Copiato!

Converti in TensorFlow Lite

Converti il modello addestrato in formato .tflite:
  • Installa lo strumento: pip install tflite
  • Converti: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite

Configurare ESP32

Usa Arduino IDE per lo sviluppo ESP32. Installa il supporto ESP32:

Integrare ed eseguire

Converti .tflite in array C: xxd -i sine_model.tflite > sine_model.h. Usa questo sketch Arduino:
  • Codice:
    #include 
    #include "tflite-micro.h"
    #include "sine_model.h"
    
    tflite::MicroErrorReporter micro_error_reporter;
    tflite::ErrorReporter* error_reporter = µ_error_reporter;
    const unsigned char* model_data = sine_model;
    const size_t model_size = sine_model_len;
    const tflite::Model* model = tflite::GetModel(model_data);
    tflite::AllOpsResolver risolutore;
    constexpr int kTensorArenaSize = 2000;
    uint8_t tensor_arena[kTensorArenaSize];
    tflite::MicroInterpreter interprete(modello, risolutore, tensor_arena, kTensorArenaSize, error_reporter);
    
    float randomFloat(float min, float max) {
        return min + (max - min) * (float)random(0, 10000) / 10000.0;
    }
    
    impostazione nulla() {
        Serial.begin(115200);
        interpreter.AllocateTensors();
    }
    
    ciclo vuoto() {
        float angolo = randomFloat(-3.1416, 3.1416);
        TfLiteTensor* input = interpreter.input(0);
        input->data.f[0] = angolo;
        se (interpreter.Invoke() != kTfLiteOk) {
            error_reporter->Report("Impossibile invocare il modello");
            ritorno;
        }
        TfLiteTensor* output = interpreter.output(0);
        float prediction = output->data.f[0];
        Serial.print("Angolo: ");
        Serial.print(angle);
        Serial.print(", Seno previsto: ");
        Serial.println(prediction);
        ritardo(1000);
    }
        
      
    ✔ Copiato!
  • Carica su ESP32, apri il Monitor Seriale per vedere i risultati.

Dettaglio inaspettato

Potresti non aspettarti che la funzione float casuale utilizzi una semplice scala di random(0, 10000), che potrebbe non essere la più precisa per il ML, ma funziona per questo esempio.

Distribuzione di TensorFlow Lite su ESP32

Questa analisi completa esplora l'implementazione di TensorFlow Lite sul microcontrollore ESP32, dettagliando il processo dalla formazione del modello all'esecuzione, basandosi su ricerca e implementazione pratica. L'obiettivo è fornire una guida approfondita per gli sviluppatori, assicurando che tutti i passaggi siano chiari e attuabili, con considerazioni per i vincoli di memoria e l'integrazione delle librerie.

Contesto e Background

TensorFlow Lite, una versione leggera di TensorFlow, è progettata per eseguire modelli di apprendimento automatico su dispositivi con risorse limitate, come telefoni cellulari, sistemi embedded e microcontrollori. L'ESP32, sviluppato da Espressif, è un microcontrollore popolare con capacità Wi-Fi e Bluetooth, che lo rende ideale per applicazioni IoT. Eseguire modelli di apprendimento automatico localmente su ESP32 migliora la privacy, riduce la latenza e abbassa i costi evitando la dipendenza dal cloud.
Il processo prevede l'addestramento di un modello su un PC, la sua conversione in formato TensorFlow Lite, la configurazione dell'ambiente di sviluppo ESP32, l'integrazione del modello e l'esecuzione per osservare i risultati. Questa analisi copre ogni fase, affrontando le potenziali sfide e fornendo esempi di codice dettagliati.

Passaggi dettagliati per il deployment

Passo 1: Addestramento di un Modello di Apprendimento Automatico

Il primo passo è addestrare un modello di machine learning utilizzando un desktop o un server con sufficiente potenza computazionale. Per questo esempio, addestriamo una semplice rete neurale per prevedere il seno di un angolo dato, usando Python e l'API Keras.
  • Installazione: installa TensorFlow con il comando pip install tensorflow.
  • Codice di addestramento: Il codice seguente genera un set di dati e addestra il modello:
    importa numpy come np
    importa tensorflow come tf
    da tensorflow import keras
    
    # Genera set di dati
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angoli)
    
    # Crea un modello di rete neurale semplice
    model = keras.Sequential([
        keras.layers.Dense(1, input_shape=(1,))
    ])
    
    # Compila il modello
    model.compile(optimizer='adam', loss='mean_squared_error')
    
    # Addestrare il modello
    model.fit(angoli, seni, epochs=100, verbose=0)
    
    # Salva il modello
    model.save('sine_model.h5')
        
      
    ✔ Copiato!
  • Note: questo modello è semplice, con un solo strato denso, adatto alle risorse limitate dell'ESP32. Il dataset consiste in 1000 angoli casuali e i loro valori di seno, addestrato per 100 epoche con l'ottimizzatore Adam e la perdita di errore quadratico medio.

Passo 2: Conversione del modello in formato TensorFlow Lite

Dopo l'addestramento, converti il modello nel formato TensorFlow Lite (.tflite) per il deployment su dispositivi con risorse limitate.
  • Installazione: installa lo strumento di conversione con pip install tflite.
  • Comando di Conversione: Usa il seguente per convertire:
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
  
✔ Copiato!
  • Dettagli: Il file .tflite è ottimizzato per dimensioni e prestazioni, fondamentale per microcontrollori come ESP32 con memoria flash e RAM limitate.

Passo 3: Configurazione dell'ambiente di sviluppo ESP32

Usa l'IDE Arduino per lo sviluppo ESP32, assicurandoti che il supporto per la scheda e le librerie necessarie siano installati.
  • Supporto scheda ESP32:
      Apri Arduino IDE, vai su File > Preferenze, e aggiungi http://dl.espressif.com/dl/package_esp32_index.json a URL aggiuntivi del Board Manager.
      Vai su Strumenti > Scheda > Gestore Schede, cerca "esp32" e installa l'ultima versione.
  • Libreria TensorFlow Lite Micro:
      Scarica da repository GitHub e aggiungi alla directory delle librerie di Arduino, oppure usa il Library Manager se disponibile.
      Garantire la compatibilità con ESP32, poiché Espressif fornisce supporto specifico per tflite-micro.

Passo 4: Integrare il Modello nel Codice ESP32

Integra il modello convertendo il file .tflite in un array C e scrivendo uno sketch Arduino per caricarlo ed eseguirlo.
  • Converti in array C: usa xxd -i sine_model.tflite > sine_model.h per generare un file header contenente i dati del modello come un array C, tipicamente:
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);

Sketch Arduino: Il codice seguente carica ed esegue il modello:
#include 
#include "tflite-micro.h"
#include "sine_model.h"

tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = µ_error_reporter;
const unsigned char* model_data = sine_model;
const size_t model_size = sine_model_len;
const tflite::Model* model = tflite::GetModel(model_data);
tflite::AllOpsResolver risolutore;
constexpr int kTensorArenaSize = 2000;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroInterpreter interprete(modello, risolutore, tensor_arena, kTensorArenaSize, error_reporter);

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

impostazione nulla() {
    Serial.begin(115200);
    interpreter.AllocateTensors();
}

ciclo vuoto() {
    float angolo = randomFloat(-3.1416, 3.1416);
    TfLiteTensor* input = interpreter.input(0);
    input->data.f[0] = angolo;
    se (interpreter.Invoke() != kTfLiteOk) {
        error_reporter->Report("Impossibile invocare il modello");
        ritorno;
    }
    TfLiteTensor* output = interpreter.output(0);
    float prediction = output->data.f[0];
    Serial.print("Angolo: ");
    Serial.print(angle);
    Serial.print(", Seno previsto: ");
    Serial.println(prediction);
    ritardo(1000);
}
  
✔ Copiato!

 

  • Note: la funzione randomFloat genera angoli casuali per i test, utilizzando un metodo di scala semplice. La dimensione dell'arena tensoriale (2000 byte) potrebbe necessitare di aggiustamenti per modelli più grandi, dato che l'ESP32 dispone di 520 KB di SRAM.

Passo 5: Carica ed Esegui il Codice

Compila e carica lo sketch utilizzando l'Arduino IDE, quindi apri il Monitor Seriale per osservare i risultati, come gli angoli e i valori del seno previsti.
  • Procedura: Assicurarsi che la scheda sia selezionata correttamente (ad esempio, ESP32 Dev Module), compilare e caricare. Aprire il Monitor Seriale a 115200 baud per vedere le uscite.

Considerazioni e potenziali sfide

  • Vincoli di memoria: ESP32 dispone di 520 KB di SRAM e di una memoria flash limitata, quindi assicurati che il modello e l'arena dei tensori rientrino in questi limiti. Ottimizza riducendo la complessità del modello o aumentando la dimensione dell'arena dei tensori se necessario.
  • Compatibilità della libreria: assicurarsi che la versione della libreria tflite-micro corrisponda ai requisiti di ESP32, poiché Espressif fornisce un supporto specifico.
  • Generazione di Numeri Casuali: La funzione randomFloat utilizza un metodo di scala semplice, che potrebbe non essere preciso per tutte le applicazioni. Considera l'uso di un generatore di numeri casuali più robusto per la produzione.
Fare un passo Descrizione Esempio di Comando/Codice
Installa TensorFlow Installa TensorFlow per l'addestramento del modello pip install tensorflow
Modello di treno Addestra un modello di previsione del seno usando Keras Vedi il codice Python sopra
Converti modello Converti in formato TensorFlow Lite tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Converti in array C Genera header C per i dati del modello xxd -i sine_model.tflite > sine_model.h
Configurare ESP32 Installa il supporto per la scheda ESP32 e la libreria tflite-micro Aggiungi URL http://dl.espressif.com/dl/package_esp32_index.json, installa tramite Board Manager
Eseguito su ESP32 Sketch Arduino per caricare ed eseguire il modello Vedi il codice C++ sopra

 

Osservazione Inaspettata

Potresti non aspettarti che la funzione float casuale utilizzi una semplice scala di random(0, 10000), che potrebbe non essere la più precisa per il machine learning, ma funziona per questo esempio, evidenziando i compromessi nei sistemi embedded.

 

Conclusione

Questa guida fornisce un processo completo per distribuire TensorFlow Lite su ESP32, dalla formazione di un semplice modello di previsione del seno all'esecuzione locale. Apre possibilità per dispositivi IoT intelligenti, con considerazioni sulla memoria e l'integrazione delle librerie che garantiscono un'implementazione pratica.

Citazioni chiave

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati con *

Iscriviti alla nostra newsletter

Ricevi le ultime informazioni sui nostri prodotti e offerte speciali.