TinyML a la Indústria 4.0

Xarxes neuronals en microcontroladors amb la placa IoT-02

Curs: Internet of Things amb IA aplicada a la Indústria 4.0
Col·legi d'Enginyers de Catalunya


El tècnic d'experiència

Un tècnic amb 20 anys a peu de màquina no mira un sol valor per decidir si una instal·lació va bé. Combina temperatura, vibració, soroll i humitat de forma intuïtiva: ha après a reconèixer patrons que no es poden expressar com un simple if temperatura > 35°C → alarma.

TinyML és exactament això: emmagatzemar l'experiència del tècnic dins el microcontrolador. La decisió es pren a peu de màquina, en menys d'un mil·lisegon, sense connexió al núvol i sense dependre de cap servidor.

En termes tècnics: un model de xarxa neuronal de 3.1 KB s'executa directament a un ESP32 de 3€, classificant l'estat ambiental a partir de tres sensors en ~300 µs.


La demostració: classificador d'estat ambiental

La placa IoT-02 (ESP32) llegeix tres sensors simultàniament i classifica l'entorn en quatre estats:

Estat Temperatura Humitat Lluminositat Actuació
🟢 NORMAL 18–28 °C 30–65 % moderada LED verd
🔴 CALOR 30–45 °C 65–100 % qualsevol LED vermell + relé
🟣 FOSCOR qualsevol qualsevol molt baixa LED groc
🌕 MOLT LLUMINÓS qualsevol qualsevol molt alta LED blanc

La decisió no es basa en cap regla if/else. El model ha après les fronteres entre estats a partir de dades, i les aplica en temps real combinant les tres variables alhora.


El pipeline: de les dades al microcontrolador

Dades d'entrenament (Python / Google Colab)
         ↓
   Model Keras (entrenament)
         ↓
   Conversió a TFLite Micro (3.1 KB)
         ↓
   Exportació a fitxer .h (array de bytes C)
         ↓
   Compilació Arduino IDE → firmware .bin
         ↓
   Desplegament a l'ESP32 (o simulador IoT-02)

Cada pas té una eina concreta. El més important és el primer: si les dades no representen la realitat del hardware, tot el que ve després serà incorrecte.


La lliçó més important: les dades manen

Durant el desenvolupament d'aquesta demostració, el model va ser entrenat dues vegades.

Model v1: entrenat amb dades sintètiques on l'estat NORMAL tenia una lluminositat LDR de 0.30–0.90 (normalitzat sobre 4095). Accuracy en test: 99.7 %. Desplegat al simulador: classificava l'estat normal com a FOSCOR.

Per què? El simulador, quan ningú toca els controls, retorna LDR = 500. Normalitzat: 500/4095 = 0.12. La zona FOSCOR del model v1 anava de 0.00 a 0.15. El model tenia raó: havia après exactament el que li havíem ensenyat. El problema era que les dades d'entrenament no representaven el hardware real.

El tècnic havia après en una altra fàbrica. Les màquines eren iguals, però les condicions de treball eren diferents. El primer mes fallava en els diagnòstics.

Model v2: zones redefinides a partir dels valors reals mesurats al simulador. Accuracy: 99.2 %. Resultat: tots els estats es classifiquen correctament.

La lliçó

Accuracy alta ≠ model útil.

Un model és tan bo com les dades amb les que ha après. Si entrenes amb dades de laboratori, obtens un model de laboratori.

Això és el covariate shift: la distribució de les dades en producció difereix de la distribució d'entrenament. És el problema número u del ML en entorns industrials reals.


Per què TinyML i no enviar les dades al núvol?

Núvol TinyML (Edge)
Latència 50–500 ms (xarxa) < 1 ms
Connectivitat Necessària No necessària
Privacitat Dades surten de la instal·lació Dades no surten del dispositiu
Cost recurrent SaaS / API / servidor Zero
Mida del model Sense límit Kilobytes
Cas d'ús ideal Models complexos, dades massives Decisions simples i ràpides a peu de màquina

TinyML no substitueix el núvol: el complementa. Un detector d'anomalies al microcontrolador pot filtrar el 99 % dels events i enviar al núvol només el que requereix anàlisi profunda.


Detall tècnic (opcional)

Aquesta secció és per a qui vulgui entendre el funcionament intern del model.
No és necessària per aplicar TinyML a un projecte real.

L'arquitectura de la xarxa neuronal

Arquitectura de la xarxa neuronal: 3 entrades, capa Dense(12, ReLU), capa Dense(8, ReLU), capa de sortida Dense(4, Softmax)

Total: 188 paràmetres. Per comparar: GPT-4 té ~1.8 bilions de paràmetres. El nostre model és adequat per al problema perquè les quatre zones són raonablement separables en un espai tridimensional.

Com es compten els 188 paràmetres?

Cada connexió entre dues neurones té un pes (un nombre que el model ajusta durant l'entrenament). A més, cada neurona de les capes denses té un biaix addicional. La suma de tots és el nombre de paràmetres del model:

Capa Pesos Biaixos Total capa
Dense(12, ReLU) 3 × 12 = 36 12 48
Dense(8, ReLU) 12 × 8 = 96 8 104
Dense(4, Softmax) 8 × 4 = 32 4 36
∑ paràmetres 188

Què fan les capes ReLU?

La funció ReLU (Rectified Linear Unit) és la porta de cada neurona oculta: si el valor que rep és negatiu, retorna 0; si és positiu, el deixa passar sense modificar. Formalment: f(x) = max(0, x).

Aquesta simplesa té una conseqüència important: permet que la xarxa aprengui fronteres no lineals entre les zones (NORMAL, CALOR, FOSCOR, MOLT_LLUMINÓS) sense un cost computacional elevat. Sense ReLU —o una funció d'activació equivalent— la combinació de capes denses seria equivalent a una sola capa lineal, incapaç de separar zones que no siguin hiperplans.

Què fa la capa Softmax?

La capa Softmax garanteix que les quatre probabilitats de sortida sumin sempre 1.0. Si la temperatura és 40 °C i la humitat és 90 %, la sortida podria ser:

NORMAL:    0.0 %
CALOR:   100.0 %
FOSCOR:    0.0 %
MOLT_LLUM: 0.0 %

Softmax no és una decisió binària: en situacions ambigües (per exemple, temperatura moderada i humitat alta), les probabilitats es repartiran entre dos estats, i el sistema pot optar per activar una alerta suau en lloc d'una decisió categòrica.

Normalització de les entrades

Les xarxes neuronals aprenen millor quan totes les entrades estan en el mateix rang. Les tres variables es normalitzen a [0, 1]:

temp_norm = temperatura_celsius / 50.0
hum_norm  = humitat_percent     / 100.0
ldr_norm  = ldr_adc_raw         / 4095.0

Aquesta normalització ha de ser idèntica entre l'entrenament (Python) i l'execució (Arduino). Si canvien, el model farà prediccions incorrectes sense donar cap error.

TFLite Micro: de Python a C++

El model Keras es converteix a format FlatBuffer (TFLite), un format binari optimitzat per a dispositius amb recursos limitats. Després es representa com un array de bytes C que s'incrusta directament al firmware:

alignas(8) const unsigned char g_model[] = {
  0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33,
  // ... 3168 bytes en total
};

En executar el firmware, TFLite Micro llegeix aquest array de la memòria flash i fa la inferència directament, sense sistema operatiu ni intèrpret.


Recursos per aprofundir


Document elaborat per al curs IoT amb IA — Col·legi d'Enginyers de Catalunya