TensorFlow Lite på ESP32

Hvad er TensorFlow Lite?

TensorFlow Lite er en letvægtsversion af TensorFlow, designet til mobile og indlejrede enheder som ESP32, der gør det muligt for maskinlæringsmodeller at køre på hardware med begrænsede ressourcer.

Trin til implementering på ESP32

Sådan får du en maskinlæringsmodel til at køre på din ESP32:

Træn en model

Træn et simpelt neuralt netværk, som at forudsige sinusværdier, ved hjælp af Python og Keras på din PC. Installer TensorFlow med:
  • Kommando: pip install tensorflow
  • Eksempelkode:
    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angles)
    model = 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')
        
      
    ✔ Kopieret!

Konverter til TensorFlow Lite

Konverter den trænede model til .tflite-format:
  • Installer værktøj: pip install tflite
  • Konverter: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite

Opsæt ESP32

Brug Arduino IDE til ESP32-udvikling. Installer ESP32-support:

Integrer og kør

Konverter .tflite til C-array: xxd -i sine_model.tflite > sine_model.h. Brug dette Arduino-sketch:
  • Kode:
    #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 resolver;
    constexpr int kTensorArenaSize = 2000;
    uint8_t tensor_arena[kTensorArenaSize];
    tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kTensorArenaSize, error_reporter);
    
    float randomFloat(float min, float max) {
        return min + (max - min) * (float)random(0, 10000) / 10000.0;
    }
    
    void setup() {
        Serial.begin(115200);
        interpreter.AllocateTensors();
    }
    
    void loop() {
        float vinkel = randomFloat(-3.1416, 3.1416);
        TfLiteTensor* input = interpreter.input(0);
        input->data.f[0] = angle;
        if (interpreter.Invoke() != kTfLiteOk) {
            error_reporter->Report("Failed to invoke model");
            return;
        }
        TfLiteTensor* output = interpreter.output(0);
        float prediction = output->data.f[0];
        Serial.print("Angle: ");
        Serial.print(angle);
        Serial.print(", Predicted sine: ");
        Serial.println(prediction);
        delay(1000);
    }
        
      
    ✔ Kopieret!
  • Upload til ESP32, åbn Serial Monitor for at se resultater.

Uventet detalje

Du ville måske ikke forvente, at funktionen til tilfældige flydende tal bruger en simpel skalering af random(0, 10000), hvilket måske ikke er det mest præcise til ML, men det fungerer til dette eksempel.

Implementering af TensorFlow Lite på ESP32

Denne omfattende analyse udforsker implementering af TensorFlow Lite på ESP32-mikrokontrolleren, og beskriver processen fra modeltræning til eksekvering baseret på forskning og praktisk implementering. Fokus er på at give en grundig vejledning til udviklere, sikre at alle trin er klare og handlingsorienterede med hensyn til hukommelsesbegrænsninger og bibliotekintegration.

Baggrund og kontekst

TensorFlow Lite, en letvægtsversion af TensorFlow, er designet til at køre maskinlæringsmodeller på ressourcestærkt begrænsede enheder som mobiltelefoner, indlejrede systemer og mikrokontrollere. ESP32, udviklet af Espressif, er en populær mikrokontroller med Wi-Fi og Bluetooth-funktioner, hvilket gør den ideel til IoT-applikationer. At køre maskinlæringsmodeller lokalt på ESP32 forbedrer privatliv, reducerer latenstid og sænker omkostninger ved at undgå afhængighed af skyen.
Processen involverer træning af en model på en PC, konvertering til TensorFlow Lite-format, opsætning af ESP32-udviklingsmiljøet, integration af modellen og kørsel for at observere resultater. Denne analyse dækker hvert trin, adresserer potentielle udfordringer og giver detaljerede kodeeksempler.

Detaljerede trin for implementering

Trin 1: Træning af en maskinlæringsmodel

Det første skridt er at træne en maskinlæringsmodel ved hjælp af en desktop eller server med tilstrækkelig regnekraft. Til dette eksempel træner vi et simpelt neuralt netværk til at forudsige sinusværdien af en given vinkel ved brug af Python og Keras API'en.
  • Installation: Installer TensorFlow med kommandoen pip install tensorflow.
  • Træningskode: Følgende kode genererer et datasæt og træner modellen:
    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    
    # Generer datasæt
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angles)
    
    # Opret en simpel neuralt netværksmodel
    model = keras.Sequential([
        keras.layers.Dense(1, input_shape=(1,))
    ])
    
    # Kompiler modellen
    model.compile(optimizer='adam', loss='mean_squared_error')
    
    # Træn modellen
    model.fit(angles, sines, epochs=100, verbose=0)
    
    # Gem modellen
    model.save('sine_model.h5')
        
      
    ✔ Kopieret!
  • Bemærkninger: Denne model er simpel, med et enkelt dense lag, egnet til ESP32's begrænsede ressourcer. Datasættet består af 1000 tilfældige vinkler og deres sinusværdier, trænet i 100 epoker med Adam-optimering og middel kvadreret fejl som tab.

Trin 2: Konvertering af modellen til TensorFlow Lite-format

Efter træning skal modellen konverteres til TensorFlow Lite-format (.tflite) til implementering på ressourcestærkt begrænsede enheder.
  • Installation: Installer konverteringsværktøjet med pip install tflite.
  • Konverteringskommando: Brug følgende til at konvertere:
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
  
✔ Kopieret!
  • Detaljer: .tflite-filen er optimeret til størrelse og ydeevne, hvilket er afgørende for mikrokontrollere som ESP32 med begrænset flash og RAM.

Trin 3: Opsætning af ESP32-udviklingsmiljø

Brug Arduino IDE til ESP32-udvikling, og sørg for at board support og nødvendige biblioteker er installeret.
  • ESP32 Board Support:
      Åbn Arduino IDE, gå til Filer > Indstillinger, og tilføj http://dl.espressif.com/dl/package_esp32_index.json til Yderligere Board Manager-URL'er.
      Gå til Værktøjer > Board > Board Manager, søg efter "esp32", og installer den nyeste version.
  • TensorFlow Lite Micro-bibliotek:
      Download fra GitHub-repositoriet og tilføj til Arduino-biblioteksbiblioteket, eller brug Library Manager hvis tilgængelig.
      Sørg for kompatibilitet med ESP32, da Espressif tilbyder specifik support til tflite-micro.

Trin 4: Integrering af modellen i ESP32-kode

Integrer modellen ved at konvertere .tflite-filen til et C-array og skrive en Arduino-sketch til at indlæse og køre den.
  • Konverter til C-array: Brug xxd -i sine_model.tflite > sine_model.h for at generere en headerfil, der indeholder modeldata som et C-array, typisk:
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);

Arduino-sketch: Følgende kode indlæser og kører modellen:
#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 resolver;
constexpr int kTensorArenaSize = 2000;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kTensorArenaSize, error_reporter);

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

void setup() {
    Serial.begin(115200);
    interpreter.AllocateTensors();
}

void loop() {
    float vinkel = randomFloat(-3.1416, 3.1416);
    TfLiteTensor* input = interpreter.input(0);
    input->data.f[0] = angle;
    if (interpreter.Invoke() != kTfLiteOk) {
        error_reporter->Report("Failed to invoke model");
        return;
    }
    TfLiteTensor* output = interpreter.output(0);
    float prediction = output->data.f[0];
    Serial.print("Angle: ");
    Serial.print(angle);
    Serial.print(", Predicted sine: ");
    Serial.println(prediction);
    delay(1000);
}
  
✔ Kopieret!

 

  • Noter: Funktionen randomFloat genererer tilfældige vinkler til test ved hjælp af en simpel skalering. Tensor arenaens størrelse (2000 bytes) kan kræve justering for større modeller, givet ESP32's 520 KB SRAM.

Trin 5: Upload og kør koden

Kompiler og upload skitsen ved hjælp af Arduino IDE, og åbn derefter Serial Monitor for at observere resultater, såsom vinkler og forudsagte sinusværdier.
  • Fremgangsmåde: Sørg for, at boardet er valgt korrekt (f.eks. ESP32 Dev Module), kompiler og upload. Åbn Serial Monitor ved 115200 baud for at se output.

Overvejelser og potentielle udfordringer

  • Hukommelsesbegrænsninger: ESP32 har 520 KB SRAM og begrænset flash, så sørg for, at modellen og tensor arenaen passer inden for disse grænser. Optimer ved at reducere modelkompleksiteten eller øge tensor arenaens størrelse, hvis det er nødvendigt.
  • Bibliotekskompatibilitet: Sørg for, at tflite-micro bibliotekets version matcher ESP32-kravene, da Espressif leverer specifik support.
  • Tilfældig talgenerering: Funktionen randomFloat bruger en simpel skalering, som måske ikke er præcis til alle anvendelser. Overvej at bruge en mere robust tilfældig talgenerator til produktion.
Trin Beskrivelse Kommando-/kodeeksempel
Installer TensorFlow Installer TensorFlow til modeltræning pip install tensorflow
Træn model Træn en sinusforudsigelsesmodel med Keras Se Python-koden ovenfor
Konverter model Konverter til TensorFlow Lite-format tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Konverter til C-array Generer C-header til modeldata xxd -i sine_model.tflite > sine_model.h
Opsæt ESP32 Installer ESP32 board support og tflite-micro bibliotek Tilføj URL http://dl.espressif.com/dl/package_esp32_index.json, installer via Board Manager
Kør på ESP32 Arduino-sketch til at indlæse og køre model Se C++-koden ovenfor

 

Uventet observation

Du ville måske ikke forvente, at funktionen til tilfældige flydende tal bruger en simpel skalering af random(0, 10000), hvilket måske ikke er det mest præcise til maskinlæring, men det fungerer til dette eksempel og fremhæver kompromiserne i indlejrede systemer.

 

Konklusion

Denne vejledning giver en omfattende proces til at implementere TensorFlow Lite på ESP32, fra træning af en simpel sinusforudsigelsesmodel til at køre den lokalt. Den åbner muligheder for intelligente IoT-enheder, med overvejelser om hukommelse og bibliotekintegration, der sikrer praktisk implementering.

Vigtige henvisninger

 

1 kommentar

hdt-avatar
Ankita

Can’t find the supported library of tensorflow lite for ESP32 board. Which one should I install

July 17, 2025 at 11:13am

Efterlad en kommentar

Din e-mail-adresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

Tilmeld dig vores nyhedsbrev

Få de seneste oplysninger om vores produkter og særlige tilbud.