TensorFlow Lite sur ESP32

Qu'est-ce que TensorFlow Lite ?

TensorFlow Lite est une version allégée de TensorFlow, conçue pour les appareils mobiles et embarqués comme l'ESP32, permettant aux modèles d'apprentissage automatique de fonctionner sur du matériel aux ressources limitées.

Étapes pour déployer sur ESP32

Voici comment faire fonctionner un modèle d'apprentissage automatique sur votre ESP32 :

Former un modèle

Entraînez un réseau de neurones simple, comme la prédiction des valeurs de sinus, en utilisant Python et Keras sur votre PC. Installez TensorFlow avec :
  • Commande : pip install tensorflow
  • Exemple de code :
    importer numpy en tant que np
    import tensorflow as tf
    de 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='erreur quadratique moyenne')
    model.fit(angles, sines, epochs=100, verbose=0)
    model.save('sine_model.h5')
        
      
    ✔ Copié !

Convertir en TensorFlow Lite

Convertir le modèle entraîné au format .tflite :
  • Installer l'outil : pip install tflite
  • Convertir : tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite

Configurer ESP32

Utilisez l'IDE Arduino pour le développement ESP32. Installez le support ESP32 :

Intégrer et exécuter

Convertir .tflite en tableau C : xxd -i sine_model.tflite > sine_model.h. Utilisez ce sketch Arduino :
  • 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 taille_modèle = sine_model_len;
    const tflite::Model* model = tflite::GetModel(model_data);
    tflite::AllOpsResolver résolveur;
    constexpr int kTensorArenaSize = 2000;
    uint8_t tensor_arena[kTensorArenaSize];
    tflite::MicroInterpreter interprète (modèle, résolveur, tensor_arène, kTensorArenaSize, rapporteur_d'erreurs);
    
    float randomFloat(float min, float max) {
        return min + (max - min) * (float)random(0, 10000) / 10000.0;
    }
    
    void setup() {
        Serial.begin(115200);
        interpreter.AllocateTensors();
    }
    
    boucle vide() {
        float angle = randomFloat(-3.1416, 3.1416);
        TfLiteTensor* input = interpreter.input(0);
        input->data.f[0] = angle;
        si (interpreter.Invoke() != kTfLiteOk) {
            error_reporter->Report("Échec de l'invocation du modèle");
            retour;
        }
        TfLiteTensor* output = interpreter.output(0);
        float prediction = output->data.f[0];
        Serial.print("Angle : ");
        Serial.print(angle);
        Serial.print(", Sinus prédit : ");
        Serial.println(prédiction);
        délai(1000);
    }
        
      
    ✔ Copié !
  • Téléchargez sur ESP32, ouvrez le Moniteur Série pour voir les résultats.

Détail inattendu

Vous ne vous attendriez peut-être pas à ce que la fonction de flottant aléatoire utilise une simple mise à l'échelle de random(0, 10000), ce qui peut ne pas être le plus précis pour l'apprentissage automatique, mais fonctionne pour cet exemple.

Déploiement de TensorFlow Lite sur ESP32

Cette analyse complète explore le déploiement de TensorFlow Lite sur le microcontrôleur ESP32, détaillant le processus depuis l'entraînement du modèle jusqu'à son exécution, basée sur la recherche et la mise en œuvre pratique. L'accent est mis sur la fourniture d'un guide approfondi pour les développeurs, garantissant que toutes les étapes sont claires et réalisables, avec des considérations pour les contraintes de mémoire et l'intégration des bibliothèques.

Contexte et arrière-plan

TensorFlow Lite, une version allégée de TensorFlow, est conçue pour exécuter des modèles d'apprentissage automatique sur des appareils aux ressources limitées, tels que les téléphones mobiles, les systèmes embarqués et les microcontrôleurs. L'ESP32, développé par Espressif, est un microcontrôleur populaire doté de capacités Wi-Fi et Bluetooth, ce qui le rend idéal pour les applications IoT. Exécuter des modèles d'apprentissage automatique localement sur l'ESP32 améliore la confidentialité, réduit la latence et diminue les coûts en évitant la dépendance au cloud.
Le processus implique l'entraînement d'un modèle sur un PC, sa conversion au format TensorFlow Lite, la configuration de l'environnement de développement ESP32, l'intégration du modèle, et son exécution pour observer les résultats. Cette analyse couvre chaque étape, en abordant les défis potentiels et en fournissant des exemples de code détaillés.

Étapes détaillées pour le déploiement

Étape 1 : Entraînement d'un modèle d'apprentissage automatique

La première étape consiste à entraîner un modèle d'apprentissage automatique en utilisant un ordinateur de bureau ou un serveur disposant d'une puissance de calcul suffisante. Pour cet exemple, nous entraînons un réseau neuronal simple pour prédire le sinus d'un angle donné, en utilisant Python et l'API Keras.
  • Installation : Installez TensorFlow avec la commande pip install tensorflow.
  • Code d'entraînement : Le code suivant génère un jeu de données et entraîne le modèle :
    importer numpy en tant que np
    import tensorflow as tf
    de tensorflow import keras
    
    # Générer un ensemble de données
    angles = np.random.uniform(low=-np.pi, high=np.pi, size=(1000, 1))
    sines = np.sin(angles)
    
    # Créer un modèle de réseau neuronal simple
    modèle = keras.Sequential([
        keras.layers.Dense(1, input_shape=(1,))
    ])
    
    # Compiler le modèle
    model.compile(optimizer='adam', loss='erreur quadratique moyenne')
    
    # Entraîner le modèle
    model.fit(angles, sines, epochs=100, verbose=0)
    
    # Enregistrer le modèle
    model.save('sine_model.h5')
        
      
    ✔ Copié !
  • Notes : Ce modèle est simple, avec une couche dense, adapté aux ressources limitées de l'ESP32. Le jeu de données se compose de 1000 angles aléatoires et de leurs valeurs de sinus, entraîné pendant 100 époques avec l'optimiseur Adam et la perte d'erreur quadratique moyenne.

Étape 2 : Conversion du modèle au format TensorFlow Lite

Après l'entraînement, convertissez le modèle au format TensorFlow Lite (.tflite) pour le déploiement sur des appareils aux ressources limitées.
  • Installation : Installez l'outil de conversion avec pip install tflite.
  • Commande de conversion : Utilisez ce qui suit pour convertir :
tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
  
✔ Copié !
  • Détails : Le fichier .tflite est optimisé pour la taille et la performance, ce qui est crucial pour les microcontrôleurs comme l'ESP32 avec une mémoire flash et RAM limitées.

Étape 3 : Configuration de l'environnement de développement ESP32

Utilisez l'IDE Arduino pour le développement ESP32, en vous assurant que le support de la carte et les bibliothèques nécessaires sont installés.
  • Support de la carte ESP32 :
      Ouvrez l'IDE Arduino, allez dans Fichier > Préférences, et ajoutez http://dl.espressif.com/dl/package_esp32_index.json vers des URL supplémentaires du gestionnaire de cartes.
      Allez dans Outils > Carte > Gestionnaire de cartes, recherchez "esp32" et installez la dernière version.
  • Bibliothèque TensorFlow Lite Micro :
      Téléchargez depuis le dépôt GitHub et ajoutez-le au répertoire des bibliothèques Arduino, ou utilisez le gestionnaire de bibliothèques si disponible.
      Assurez la compatibilité avec ESP32, car Espressif offre un support spécifique pour tflite-micro.

Étape 4 : Intégration du modèle dans le code ESP32

Intégrez le modèle en convertissant le fichier .tflite en un tableau C et en écrivant un sketch Arduino pour le charger et l'exécuter.
  • Convertir en tableau C : Utilisez xxd -i sine_model.tflite > sine_model.h pour générer un fichier d'en-tête contenant les données du modèle sous forme de tableau C, généralement :
unsigned char sine_model[] = { 0x00, 0x00, 0x00, 0x00, ... }; unsigned int sine_model_len = sizeof(sine_model);

Sketch Arduino : Le code suivant charge et exécute le modèle :
#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 taille_modèle = sine_model_len;
const tflite::Model* model = tflite::GetModel(model_data);
tflite::AllOpsResolver résolveur;
constexpr int kTensorArenaSize = 2000;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroInterpreter interprète (modèle, résolveur, tensor_arène, kTensorArenaSize, rapporteur_d'erreurs);

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

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

boucle vide() {
    float angle = randomFloat(-3.1416, 3.1416);
    TfLiteTensor* input = interpreter.input(0);
    input->data.f[0] = angle;
    si (interpreter.Invoke() != kTfLiteOk) {
        error_reporter->Report("Échec de l'invocation du modèle");
        retour;
    }
    TfLiteTensor* output = interpreter.output(0);
    float prediction = output->data.f[0];
    Serial.print("Angle : ");
    Serial.print(angle);
    Serial.print(", Sinus prédit : ");
    Serial.println(prédiction);
    délai(1000);
}
  
✔ Copié !

 

  • Notes : La fonction randomFloat génère des angles aléatoires pour les tests, en utilisant une méthode de mise à l'échelle simple. La taille de l'arène tensorielle (2000 octets) peut nécessiter un ajustement pour des modèles plus grands, compte tenu des 520 Ko de SRAM de l'ESP32.

Étape 5 : Télécharger et exécuter le code

Compilez et téléversez le croquis en utilisant l'IDE Arduino, puis ouvrez le Moniteur Série pour observer les résultats, tels que les angles et les valeurs sinusoïdales prédites.
  • Procédure : Assurez-vous que la carte est correctement sélectionnée (par exemple, ESP32 Dev Module), compilez et téléversez. Ouvrez le Moniteur Série à 115200 bauds pour voir les sorties.

Considérations et défis potentiels

  • Contraintes de mémoire : l'ESP32 dispose de 520 Ko de SRAM et d'une mémoire flash limitée, assurez-vous donc que le modèle et l'arène de tenseurs tiennent dans ces limites. Optimisez en réduisant la complexité du modèle ou en augmentant la taille de l'arène de tenseurs si nécessaire.
  • Compatibilité de la bibliothèque : Assurez-vous que la version de la bibliothèque tflite-micro correspond aux exigences de l'ESP32, car Espressif fournit un support spécifique.
  • Génération de nombres aléatoires : La fonction randomFloat utilise une méthode de mise à l'échelle simple, qui peut ne pas être précise pour toutes les applications. Envisagez d'utiliser un générateur de nombres aléatoires plus robuste pour la production.
Étape Description Exemple de commande/code
Installer TensorFlow Installer TensorFlow pour l'entraînement du modèle pip installer tensorflow
Modèle de train Entraîner un modèle de prédiction sinusoïdale avec Keras Voir le code Python ci-dessus
Convertir le modèle Convertir au format TensorFlow Lite tflite_convert --keras_model_file sine_model.h5 --output_file sine_model.tflite
Convertir en tableau C Générer l'en-tête C pour les données du modèle xxd -i sine_model.tflite > sine_model.h
Configurer ESP32 Installer le support de carte ESP32 et la bibliothèque tflite-micro Ajouter une URL http://dl.espressif.com/dl/package_esp32_index.json, installer via le Gestionnaire de Cartes
Fonctionne sur ESP32 Croquis Arduino pour charger et exécuter un modèle Voir le code C++ ci-dessus

 

Observation inattendue

Vous ne vous attendriez peut-être pas à ce que la fonction de flottant aléatoire utilise une simple mise à l'échelle de random(0, 10000), ce qui peut ne pas être le plus précis pour l'apprentissage automatique, mais fonctionne pour cet exemple, mettant en évidence les compromis dans les systèmes embarqués.

 

Conclusion

Ce guide fournit un processus complet pour déployer TensorFlow Lite sur ESP32, depuis l'entraînement d'un modèle simple de prédiction sinusoïdale jusqu'à son exécution locale. Il ouvre des possibilités pour des dispositifs IoT intelligents, avec des considérations pour la mémoire et l'intégration des bibliothèques garantissant une mise en œuvre pratique.

Citations clés

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués d'un *

Inscrivez-vous à notre newsletter

Recevez les dernières informations sur nos produits et offres spéciales.