Skip to content

+49 1626571232

info@openelab.io

🚀 Free Shipping from 30€ in Germany, 50€ in the EU!

TensorFlow Lite On ESP32

25 Feb 2025 0 Comments

What is TensorFlow Lite?

TensorFlow Lite is a lightweight version of TensorFlow, designed for mobile and embedded devices like ESP32, allowing machine learning models to run on resource-limited hardware.

Steps to Deploy on ESP32

Here’s how to get a machine learning model running on your ESP32:

Train a Model

Train a simple neural network, like predicting sine values, using Python and Keras on your PC. Install TensorFlow with:
  • Command: pip install tensorflow
  • Example code:
    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')
    
    
    
    ✔ Copied!

Convert to TensorFlow Lite

Convert the trained model to .tflite format:
  • Install tool: pip install tflite
  • Convert: tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite

Set Up ESP32

Use Arduino IDE for ESP32 development. Install ESP32 support:

Integrate and Run

Convert .tflite to C array: xxd -i sine_model.tflite > sine_model.h. Use this Arduino sketch:
  • Code:
    #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);
    }
    
    
    
    ✔ Copied!
  • Upload to ESP32, open Serial Monitor to see results.

Unexpected Detail

You might not expect that the random float function uses a simple scaling of random(0, 10000), which may not be the most precise for ML, but works for this example.

Deploying TensorFlow Lite on ESP32

This comprehensive analysis explores deploying TensorFlow Lite on the ESP32 microcontroller, detailing the process from model training to execution, based on research and practical implementation. The focus is on providing a thorough guide for developers, ensuring all steps are clear and actionable, with considerations for memory constraints and library integration.

Background and Context

TensorFlow Lite, a lightweight version of TensorFlow, is designed for running machine learning models on resource-constrained devices, such as mobile phones, embedded systems, and microcontrollers. The ESP32, developed by Espressif, is a popular microcontroller with Wi-Fi and Bluetooth capabilities, making it ideal for IoT applications. Running machine learning models locally on ESP32 enhances privacy, reduces latency, and lowers costs by avoiding cloud dependency.
The process involves training a model on a PC, converting it to TensorFlow Lite format, setting up the ESP32 development environment, integrating the model, and running it to observe results. This analysis covers each step, addressing potential challenges and providing detailed code examples.

Detailed Steps for Deployment

Step 1: Training a Machine Learning Model

The first step is to train a machine learning model using a desktop or server with sufficient computational power. For this example, we train a simple neural network to predict the sine of a given angle, using Python and the Keras API.
  • Installation: Install TensorFlow with the command pip install tensorflow.
  • Training Code: The following code generates a dataset and trains the model:
    import numpy as np
    import tensorflow as tf
    from tensorflow import keras
    
    # Generate dataset
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angles)
    
    # Create a simple neural network model
    model = keras.Sequential([
        keras.layers.Dense(1, input_shape=(1,))
    ])
    
    # Compile the model
    model.compile(optimizer='adam', loss='mean_squared_error')
    
    # Train the model
    model.fit(angles, sines, epochs=100, verbose=0)
    
    # Save the model
    model.save('sine_model.h5')
    
    
    
    ✔ Copied!
  • Notes: This model is simple, with one dense layer, suitable for the ESP32's limited resources. The dataset consists of 1000 random angles and their sine values, trained for 100 epochs with the Adam optimizer and mean squared error loss.

Step 2: Converting the Model to TensorFlow Lite Format

After training, convert the model to TensorFlow Lite format (.tflite) for deployment on resource-constrained devices.
  • Installation: Install the conversion tool with pip install tflite.
  • Conversion Command: Use the following to convert:
bash
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite


✔ Copied!

 

  • Details: The .tflite file is optimized for size and performance, crucial for microcontrollers like ESP32 with limited flash and RAM.

Step 3: Setting Up the ESP32 Development Environment

Use the Arduino IDE for ESP32 development, ensuring board support and necessary libraries are installed.
  • ESP32 Board Support:
      Open Arduino IDE, go to File > Preferences, and add http://dl.espressif.com/dl/package_esp32_index.json to Additional Board Manager URLs.
      Go to Tools > Board > Board Manager, search for "esp32", and install the latest version.
  • TensorFlow Lite Micro Library:
      Download from GitHub repository and add to Arduino libraries directory, or use Library Manager if available.
      Ensure compatibility with ESP32, as Espressif provides specific support for tflite-micro.

Step 4: Integrating the Model into ESP32 Code

Integrate the model by converting the .tflite file to a C array and writing an Arduino sketch to load and run it.
  • Convert to C Array: Use xxd -i sine_model.tflite > sine_model.h to generate a header file containing the model data as a C array, typically:
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);

Arduino Sketch: The following code loads and runs the model:
#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);
}


✔ Copied!

 

  • Notes: The randomFloat function generates random angles for testing, using a simple scaling method. The tensor arena size (2000 bytes) may need adjustment for larger models, given ESP32's 520 KB SRAM.

Step 5: Upload and Run the Code

Compile and upload the sketch using Arduino IDE, then open the Serial Monitor to observe results, such as angles and predicted sine values.
  • Procedure: Ensure the board is selected correctly (e.g., ESP32 Dev Module), compile, and upload. Open Serial Monitor at 115200 baud to see outputs.

Considerations and Potential Challenges

  • Memory Constraints: ESP32 has 520 KB SRAM and limited flash, so ensure the model and tensor arena fit within these limits. Optimize by reducing model complexity or increasing tensor arena size if needed.
  • Library Compatibility: Ensure the tflite-micro library version matches ESP32 requirements, as Espressif provides specific support.
  • Random Number Generation: The randomFloat function uses a simple scaling method, which may not be precise for all applications. Consider using a more robust random number generator for production.
Step Description Command/Code Example
Install TensorFlow Install TensorFlow for model training pip install tensorflow
Train Model Train a sine prediction model using Keras See Python code above
Convert Model Convert to TensorFlow Lite format tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Convert to C Array Generate C header for model data xxd -i sine_model.tflite > sine_model.h
Set Up ESP32 Install ESP32 board support and tflite-micro library Add URL http://dl.espressif.com/dl/package_esp32_index.json, install via Board Manager
Run on ESP32 Arduino sketch to load and execute model See C++ code above

 

Unexpected Observation

You might not expect that the random float function uses a simple scaling of random(0, 10000), which may not be the most precise for machine learning, but works for this example, highlighting the trade-offs in embedded systems.

 

Conclusion

This guide provides a comprehensive process for deploying TensorFlow Lite on ESP32, from training a simple sine prediction model to running it locally. It opens possibilities for intelligent IoT devices, with considerations for memory and library integration ensuring practical implementation.

Key Citations

 

Prev Post
Next Post

Leave a comment

All blog comments are checked prior to publishing

Someone recently bought a

Thanks for subscribing!

This email has been registered!

Shop the look

Choose Options

Recently Viewed

Edit Option
Back In Stock Notification
this is just a warning
Login
Shopping Cart
0 items
RuffRuff App RuffRuff App by Tsun