TensorFlow Lite su ESP32
25 Feb 2025
0 Commenti
Che 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
Allena una semplice rete neurale, come la previsione dei valori del seno, utilizzando 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 angoli = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1)) sines = np.sin(angoli) modello = keras.Sequential([keras.layers.Dense(1, input_shape=(1,))]) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(angles, sines, epochs=100, verbose=0) model.save('sine_model.h5')
✔ Copiato!
Converti in TensorFlow Lite
Converti il modello addestrato nel formato .tflite:
-
Installa strumento: pip install tflite
-
Converti: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Imposta ESP32
Usa l'IDE Arduino per lo sviluppo ESP32. Installa il supporto ESP32:
-
Aggiungi URL: http://dl.espressif.com/dl/package_esp32_index.json nelle Preferenze.
-
Installa tramite il Gestore schede.
-
Aggiungi la libreria tflite-micro dal repository GitHub alle librerie di Arduino.
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(model, risolutore, tensor_arena, kTensorArenaSize, error_reporter); float randomFloat(float min, float max) { ritorna min + (max - min) * (float)random(0, 10000) / 10000.0; } impostazione nulla() { Inizio seriale(115200); interpreter.AllocateTensors(); } ciclo vuoto() { float angolo = randomFloat(-3.1416, 3.1416); TfLiteTensor* input = interpreter.input(0); input->data.f[0] = angolo; if (interpreter.Invoke() != kTfLiteOk) { error_reporter->Report("Impossibile invocare il modello"); ritorno; } TfLiteTensor* output = interpreter.output(0); float previsione = 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 scalatura di random(0, 10000), che potrebbe non essere la più precisa per il ML, ma funziona per questo esempio.
Distribuire TensorFlow Lite su ESP32
Questa analisi completa esplora il deployment di TensorFlow Lite sul microcontrollore ESP32, dettagliando il processo dalla formazione del modello all'esecuzione, basato 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 le limitazioni di memoria e l'integrazione delle librerie.
Contesto e Sfondo
TensorFlow Lite, una versione leggera di TensorFlow, è progettato per eseguire modelli di machine learning 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, rendendolo ideale per applicazioni IoT. Eseguire modelli di machine learning 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 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 passaggio, affrontando le potenziali sfide e fornendo esempi di codice dettagliati.
Passaggi Dettagliati per il Deployment
Passo 1: Addestrare un Modello di Apprendimento Automatico
Il primo passo è addestrare un modello di machine learning utilizzando un desktop o un server con sufficiente potenza di calcolo. Per questo esempio, addestriamo una semplice rete neurale per prevedere il seno di un angolo dato, utilizzando Python e l'API Keras.
-
Installazione: Installa TensorFlow con il comando pip install tensorflow.
-
Codice di Addestramento: Il seguente codice genera un dataset e addestra il modello:
importa numpy come np importa tensorflow come tf da tensorflow import keras # Genera set di dati angoli = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1)) sines = np.sin(angoli) # Crea un semplice modello di rete neurale modello = 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(angles, sines, epochs=100, verbose=0) # Salva il modello model.save('sine_model.h5')
✔ Copiato!
-
Note: Questo modello è semplice, con un unico 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 nel 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:
battere
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 l'ESP32 con memoria flash e RAM limitate.
Passo 3: Configurazione dell'ambiente di sviluppo ESP32
Utilizza l'IDE Arduino per lo sviluppo ESP32, assicurandoti che il supporto per la scheda e le librerie necessarie siano installati.
-
Supporto per la scheda ESP32:Apri l'IDE di Arduino, 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 utilizza il Gestore delle librerie se disponibile.Assicurati della compatibilità con ESP32, poiché Espressif fornisce supporto specifico per tflite-micro.
Passo 4: Integrazione del 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 di intestazione 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);
Arduino Sketch: Il seguente codice 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(model, risolutore, tensor_arena, kTensorArenaSize, error_reporter); float randomFloat(float min, float max) { ritorna min + (max - min) * (float)random(0, 10000) / 10000.0; } impostazione nulla() { Inizio seriale(115200); interpreter.AllocateTensors(); } ciclo vuoto() { float angolo = randomFloat(-3.1416, 3.1416); TfLiteTensor* input = interpreter.input(0); input->data.f[0] = angolo; if (interpreter.Invoke() != kTfLiteOk) { error_reporter->Report("Impossibile invocare il modello"); ritorno; } TfLiteTensor* output = interpreter.output(0); float previsione = 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 semplice metodo di scaling. La dimensione dell'arena del tensore (2000 byte) potrebbe necessitare di un aggiustamento per modelli più grandi, dato che l'ESP32 ha 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 angoli e valori di seno previsti.
-
Procedura: Assicurati che la scheda sia selezionata correttamente (ad es., ESP32 Dev Module), compila e carica. Apri il Monitor Seriale a 115200 baud per vedere le uscite.
Considerazioni e Potenziali Sfide
-
Vincoli di Memoria: ESP32 ha 520 KB di SRAM e flash limitata, quindi assicurati che il modello e l'area dei tensori rientrino in questi limiti. Ottimizza riducendo la complessità del modello o aumentando la dimensione dell'area dei tensori se necessario.
-
Compatibilità della libreria: Assicurati che la versione della libreria tflite-micro corrisponda ai requisiti dell'ESP32, poiché Espressif fornisce supporto specifico.
-
Generazione di Numeri Casuali: La funzione randomFloat utilizza un semplice metodo di scaling, che potrebbe non essere preciso per tutte le applicazioni. Considera di utilizzare 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 utilizzando 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 intestazione C per i dati del modello | xxd -i sine_model.tflite > sine_model.h |
Imposta 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 Gestore schede |
Esegui su ESP32 | Sketch Arduino per caricare ed eseguire il modello | Vedere il codice C++ sopra |
Osservazione Inaspettata
Potresti non aspettarti che la funzione float casuale utilizzi una semplice scalatura 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 il deployment di 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 per l'integrazione della memoria e delle librerie che garantiscono un'implementazione pratica.
Citazioni chiave
Lascia un commento
Tutti i commenti del blog vengono controllati prima della pubblicazione