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

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.
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.
Tech Stack
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é.
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.
TFLite → Autoencoder (64→32→16→8→16→32→64)
Détection → MSE > 1.151 ? ANOMALIE : NORMALBridger 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.
// 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.
Inférence #10 | Error: 0.023456 | Anomalies: 1/10 | Temps: 87ms (Moy: 89.3ms)
ANOMALIE DÉTECTÉE!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
- →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.