Vad är TensorFlow Lite?
TensorFlow Lite är en lättviktsversion av TensorFlow, designad för mobila och inbäddade enheter som ESP32, vilket gör det möjligt för maskininlärningsmodeller att köras på hårdvara med begränsade resurser.
Steg för att distribuera på ESP32
Så här får du en maskininlärningsmodell att köra på din ESP32:
Träna en modell
Träna ett enkelt neuralt nätverk, som att förutsäga sinusvärden, med Python och Keras på din dator. Installera TensorFlow med:
-
Kommando: pip install tensorflow
-
Exempel på kod:
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')
✔ Kopierat!
Konvertera till TensorFlow Lite
Konvertera den tränade modellen till .tflite-format:
-
Installera verktyg: pip install tflite
-
Konvertera: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Ställ in ESP32
Använd Arduino IDE för ESP32-utveckling. Installera ESP32-stöd:
-
Lägg till URL: http://dl.espressif.com/dl/package_esp32_index.json i Inställningar.
-
Installera via Board Manager.
-
Lägg till tflite-micro-biblioteket från GitHub-förråd till Arduino-biblioteken.
Integrera och kör
Konvertera .tflite till C-array: xxd -i sine_model.tflite > sine_model.h. Använd denna Arduino-sketch:
-
Kod:
#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 angle = 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); }
✔ Kopierat!
-
Ladda upp till ESP32, öppna Serial Monitor för att se resultat.
Oväntad detalj
Du kanske inte förväntar dig att funktionen för slumpmässigt flyttal använder en enkel skalning av random(0, 10000), vilket kanske inte är det mest precisa för ML, men fungerar för detta exempel.
Distribuera TensorFlow Lite på ESP32
Denna omfattande analys utforskar att distribuera TensorFlow Lite på ESP32-mikrokontrollern, och beskriver processen från modellträning till körning, baserat på forskning och praktisk implementering. Fokus ligger på att tillhandahålla en grundlig guide för utvecklare, som säkerställer att alla steg är tydliga och genomförbara, med hänsyn till minnesbegränsningar och bibliotekintegration.
Bakgrund och kontext
TensorFlow Lite, en lättviktsversion av TensorFlow, är designad för att köra maskininlärningsmodeller på resursbegränsade enheter, såsom mobiltelefoner, inbäddade system och mikrokontroller. ESP32, utvecklad av Espressif, är en populär mikrokontroller med Wi-Fi och Bluetooth-funktioner, vilket gör den idealisk för IoT-applikationer. Att köra maskininlärningsmodeller lokalt på ESP32 förbättrar integriteten, minskar latens och sänker kostnader genom att undvika molnberoende.
Processen innebär att träna en modell på en PC, konvertera den till TensorFlow Lite-format, ställa in ESP32-utvecklingsmiljön, integrera modellen och köra den för att observera resultat. Denna analys täcker varje steg, tar upp potentiella utmaningar och ger detaljerade kodexempel.
Detaljerade steg för distribution
Steg 1: Träna en maskininlärningsmodell
Det första steget är att träna en maskininlärningsmodell med en stationär dator eller server med tillräcklig beräkningskapacitet. För detta exempel tränar vi ett enkelt neuralt nätverk för att förutsäga sinusvärdet för en given vinkel, med Python och Keras API.
-
Installation: Installera TensorFlow med kommandot pip install tensorflow.
-
Träningskod: Följande kod genererar ett dataset och tränar modellen:
import numpy as np import tensorflow as tf from tensorflow import keras # Generera dataset angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1)) sines = np.sin(angles) # Skapa en enkel neuralt nätverksmodell model = keras.Sequential([ keras.layers.Dense(1, input_shape=(1,)) ]) # Kompilera modellen model.compile(optimizer='adam', loss='mean_squared_error') # Träna modellen model.fit(angles, sines, epochs=100, verbose=0) # Spara modellen model.save('sine_model.h5')
✔ Kopierat!
-
Noteringar: Denna modell är enkel, med ett dense-lager, lämplig för ESP32:s begränsade resurser. Datasetet består av 1000 slumpmässiga vinklar och deras sinusvärden, tränade i 100 epoker med Adam-optimeraren och medelkvadratfel som förlustfunktion.
Steg 2: Konvertera modellen till TensorFlow Lite-format
Efter träning, konvertera modellen till TensorFlow Lite-format (.tflite) för distribution på resursbegränsade enheter.
-
Installation: Installera konverteringsverktyget med pip install tflite.
-
Konverteringskommando: Använd följande för att konvertera:
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
✔ Kopierat!
-
Detaljer: .tflite-filen är optimerad för storlek och prestanda, vilket är avgörande för mikrokontroller som ESP32 med begränsat flashminne och RAM.
Steg 3: Ställa in ESP32-utvecklingsmiljön
Använd Arduino IDE för ESP32-utveckling, se till att kortstöd och nödvändiga bibliotek är installerade.
-
ESP32-kortstöd:Öppna Arduino IDE, gå till Arkiv > Inställningar och lägg till http://dl.espressif.com/dl/package_esp32_index.json till Ytterligare URL:er för Korthanteraren.Gå till Verktyg > Kort > Korthanterare, sök efter "esp32" och installera den senaste versionen.
-
TensorFlow Lite Micro-bibliotek:Ladda ner från GitHub-förråd och lägg till i Arduino-bibliotekskatalogen, eller använd Library Manager om det finns.Säkerställ kompatibilitet med ESP32, eftersom Espressif tillhandahåller specifikt stöd för tflite-micro.
Steg 4: Integrera modellen i ESP32-koden
Integrera modellen genom att konvertera .tflite-filen till en C-array och skriva en Arduino-sketch för att ladda och köra den.
-
Konvertera till C-array: Använd xxd -i sine_model.tflite > sine_model.h för att generera en headerfil som innehåller modelldata som en C-array, vanligtvis:
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);
Arduino-sketch: Följande kod laddar och kör 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 angle = 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); }
✔ Kopierat!
-
Noteringar: Funktionen randomFloat genererar slumpmässiga vinklar för testning, med en enkel skalningsmetod. Tensorarenans storlek (2000 byte) kan behöva justeras för större modeller, med tanke på ESP32:s 520 KB SRAM.
Steg 5: Ladda upp och kör koden
Kompilera och ladda upp skissen med Arduino IDE, öppna sedan Serial Monitor för att observera resultat, såsom vinklar och förutspådda sinusvärden.
-
Procedur: Säkerställ att kortet är korrekt valt (t.ex. ESP32 Dev Module), kompilera och ladda upp. Öppna Serial Monitor på 115200 baud för att se utskrifter.
Överväganden och potentiella utmaningar
-
Minnesbegränsningar: ESP32 har 520 KB SRAM och begränsat flashminne, så se till att modellen och tensorarenan får plats inom dessa gränser. Optimera genom att minska modellens komplexitet eller öka tensorarenans storlek vid behov.
-
Bibliotekskompatibilitet: Säkerställ att tflite-micro-bibliotekets version matchar ESP32-kraven, eftersom Espressif tillhandahåller specifikt stöd.
-
Slumpgenerering: Funktionen randomFloat använder en enkel skalningsmetod, vilket kanske inte är exakt för alla tillämpningar. Överväg att använda en mer robust slumpgenerator för produktion.
Steg | Beskrivning | Kommando-/kodexempel |
Installera TensorFlow | Installera TensorFlow för modellträning | pip install tensorflow |
Träna modell | Träna en sinusprediktionsmodell med Keras | Se Python-koden ovan |
Konvertera modell | Konvertera till TensorFlow Lite-format | tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite |
Konvertera till C-array | Generera C-header för modelldata | xxd -i sine_model.tflite > sine_model.h |
Ställ in ESP32 | Installera ESP32-stöd och tflite-micro-biblioteket | Lägg till URL http://dl.espressif.com/dl/package_esp32_index.json, installera via Board Manager |
Kör på ESP32 | Arduino-sketch för att ladda och köra modellen | Se C++-koden ovan |
Oväntad observation
Du kanske inte förväntar dig att funktionen för slumpmässigt flyttal använder en enkel skalning av random(0, 10000), vilket kanske inte är det mest precisa för maskininlärning, men fungerar för detta exempel och belyser kompromisserna i inbäddade system.
Slutsats
Denna guide ger en omfattande process för att distribuera TensorFlow Lite på ESP32, från att träna en enkel sinusförutsägelsemodell till att köra den lokalt. Den öppnar möjligheter för intelligenta IoT-enheter, med hänsyn till minne och bibliotekintegration för att säkerställa praktisk implementering.
Viktiga referenser
1 kommentar
Ankita
Can’t find the supported library of tensorflow lite for ESP32 board. Which one should I install