AI & IoT

Maintenance Prédictive Embarquée

Détection d'anomalies TinyML tenant en 25KB et fonctionnant sur un ESP32 à 5$ — sans cloud, sans serveur.

TinyMLESP32TensorFlow LiteDétection d'anomaliesEdge AI
View on GitHub
Maintenance Prédictive Embarquée demo
Problème

Les équipements industriels rotatifs tombent en panne progressivement, et les signaux d'alerte précoce apparaissent comme des changements subtils dans les signatures de vibration. La maintenance prédictive traditionnelle soit envoie les données brutes des capteurs vers le cloud (coûteux, latence élevée, dépendant de la connectivité), soit nécessite des analyseurs de vibration industriels dédiés qui ne peuvent pas être déployés à grande échelle sur chaque machine.

Approche

Déplacer tout le pipeline de détection sur le nœud capteur lui-même. L'ESP32 acquiert les données de vibration, extrait les caractéristiques fréquentielles par FFT, exécute un autoencoder pour la détection d'anomalies, et déclenche une alerte locale — le tout en ~215ms et ~55KB de RAM. 100% edge computing, pas de cloud.

Architecture
Capteur @ 1kHz
Buffer 128 échantillons
FFT → 64 features
StandardScaler
TFLite Autoencoder
MSE > seuil?
LED alerte

Tech Stack

MatérielESP32 DevKit (240MHz, 520KB RAM)Device d'inférence edge + alerte LED
FirmwareC++ / Arduino + TFLite Micro + arduinoFFTAcquisition, FFT, inférence on-device
ModèleKeras Autoencoder (64→32→16→8→16→32→64)Détection d'anomalies par erreur de reconstruction
EntraînementPython + TensorFlow + scikit-learnEntraînement, calibration du seuil, génération C headers
DashboardStreamlit + Plotly + NumPyDashboard démo live (inférence sans TensorFlow)

Décisions clés

  • Autoencoder plutôt qu'un classifieur — non supervisé sur données normales uniquement, pas besoin de données de défauts labellisées pour chaque mode de défaillance.
  • FFT comme feature, pas le signal brut — les caractéristiques fréquentielles sont plus compactes et discriminantes pour les défauts de vibration, réduisant l'entrée du modèle de 128 à 64 dimensions.
  • Le bottleneck latent en 8 dimensions garde le réseau assez petit pour un modèle TFLite de 24.9KB.
  • Tout intégré dans les constantes du firmware — le modèle entraîné, le scaler et le seuil sont générés en code C headers, l'ESP32 n'a besoin d'aucune configuration runtime.
  • Démo sans TensorFlow — les poids extraits en JSON et la passe avant réimplémentée en NumPy pur, le dashboard Streamlit tourne sans TensorFlow installé.
Deep Dive

Détection d'anomalies par erreur de reconstruction

L'autoencoder est entraîné uniquement sur des spectres de vibration sains. Au runtime, l'ESP32 reconstruit chaque spectre entrant ; si l'erreur de reconstruction (MSE) dépasse un seuil, le signal est flagged comme anomalie. Le seuil est auto-dérivé du 95ème percentile de l'erreur de reconstruction sur données normales (1.151) — aucun réglage manuel par déploiement.

text
TFLite → Autoencoder (64→32→16→8→16→32→64)
Détection → MSE > 1.151 ? ANOMALIE : NORMAL

Bridger un modèle Keras PC vers un microcontrôleur

Un générateur de code personnalisé convertit le binaire TFLite en tableau hex alignas(8) dans un header C, avec un scaler_params.h séparé contenant le seuil et les tableaux mean/scale du scaler. Cela élimine tout parsing runtime ou dépendance fichier SD sur le device.

c
// model_data.h (généré, ~157KB)
alignas(8) const unsigned char model_data[] = {
  0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x03, ...
};

// scaler_params.h (généré)
#define ANOMALY_THRESHOLD 1.1510807
const float scaler_mean[64] = { ... };
const float scaler_scale[64] = { ... };

Boucle d'inférence on-device

Chaque cycle : acquisition 128 échantillons (128ms), FFT avec fenêtre de Hamming (15ms), normalisation (2ms), inférence TFLite (~85ms), comparaison MSE au seuil, allumage LED sur anomalie. Latence totale ~215ms — largement sous la cible de 500ms.

text
Inférence #10 | Error: 0.023456 | Anomalies: 1/10 | Temps: 87ms (Moy: 89.3ms)
ANOMALIE DÉTECTÉE!
Résultats
24.9 KB
Taille du modèle
~85 ms
Temps d'inférence
95%
Précision de détection
~55 KB
Utilisation RAM

Fonctionnalités démo

  • Le moniteur série ESP32 stream les stats d'inférence live avec compteur d'anomalies et timing
  • La LED intégrée s'allume immédiatement à la détection d'une anomalie
  • Fonctionne avec des signaux simulés out-of-the-box ou un vrai accéléromètre ADXL345 via un flag
  • Dashboard Streamlit avec waveform temps réel, spectre FFT, jauge d'erreur et historique roulant
  • Suite de validation complète assertant modèle < 100KB, précision > 80%, et intégrité des C headers
Leçons apprises
  • Faire tenir un réseau de neurones dans ~160KB de DRAM libre a nécessité un tensor arena fixe de 30KB et des buffers FFT soigneusement dimensionnés — le tuning mémoire est documenté.
  • Bridger un modèle Keras entraîné sur PC vers un microcontrôleur a requis un générateur de code émettant des headers C — aucun file I/O runtime sur le device.
  • Découpler la démo de TensorFlow en réimplémentant la passe avant en ~45 lignes de NumPy a rendu le dashboard cloud économique à héberger et rapide à cold-start.
  • Engineering de seuil sans labels pour chaque mode de défaut — l'approche du 95ème percentile s'auto-calibre et le README documente le tradeoff de sensibilité pour les opérateurs.