Grazie ai recenti miglioramenti nell'ottimizzazione dei modelli di Machine Learning e all'emergere di framework creati appositamente per eseguire l'inferenza sui microcontrollori, è diventato possibile dare più intelligenza a questi minuscoli dispositivi. Ora possiamo distribuire reti neurali su microcontrollori per il riconoscimento di scenari audio, rilevamento di parole chiave o anche per semplici compiti di riconoscimento delle immagini. I dispositivi con microcontrollori possono essere utilizzati per dare nuova vita e significato ai vecchi sensori, come l'utilizzo di un accelerometro installato su un meccanismo per il rilevamento di anomalie e la manutenzione predittiva. In questo articolo vedremo l'implementazione di modelli di Machine Learning sul core ARM Cortex M4F presente nella scheda di sviluppo Wio Terminal realizzata da Seeed Studio.
Introduzione
Gli aspetti che più attraggono verso il TinyML sono dati dal fatto che gli MCU sono onnipresenti, piccoli, consumano piccole quantità di energia e sono relativamente economici. I dispositivi embedded sono disponibili in tutte le forme e dimensioni, a partire da "embedded supercomputer” come Nvidia Jetson Xavier AGX fino ad arrivare al più piccolo dei microcontrollori, ad esempio l'ESP32 o Cortex M0. E i limiti? Il principale fattore limitante è la dimensione delle memorie RAM/FLASH degli MCU. Ad esempio, non si può implementare il riconoscimento vocale automatico su un microcontrollore, mentre il riconoscimento di poche parole chiave è possibile. Il riconoscimento vocale in dominio aperto è fuori dalla portata degli MCU. Almeno per adesso. In questo articolo descriveremo come addestrare e distribuire un modello di Machine Learning sul core ARM Cortex MF4 presente sulla scheda di sviluppo Wio Terminal.
Componenti e software
Wio Terminal, mostrato in Figura 1, è uno strumento perfetto per iniziare con l'IoT e il TinyML: è costruito attorno al chip ATSAMD51P19 con core ARM Cortex M4F funzionante a 120 MHz, che è molto ben supportato da vari framework per l'inferenza ML sui microcontrollori.
La scheda presenta anche:
- sensore di luce integrato
- microfono
- pulsanti programmabili
- display LCD da 2,4 pollici
- accelerometro
- 2 porte Grove per una facile connessione di oltre 300 diversi sensori dell'ecosistema Grove
Dal punto di vista software, utilizzeremo l'IDE Arduino per la programmazione del dispositivo e la piattaforma Edge Impulse per l'addestramento e l'inferenza del modello. L'utilizzo della piattaforma Edge Impulse semplifica la raccolta dei dati e l'addestramento del modello. Prima di intraprendere il nostro viaggio per esplorare le possibilità di TinyML, dovremo impostare l'ambiente di lavoro, ovvero l'IDE Arduino. Per compilare e caricare il codice per Wio Terminal occorre installare uno specifico strumento per Wio Terminal nell'IDE Arduino. Basterà seguire i seguenti passi:
- Aprire l'IDE Arduino, quindi "File" -> "Impostazioni"
- Copiare l'URL https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json nel campo "URL aggiuntive per il Gestore schede"
- Aprire "Strumenti" -> "Schede" -> "Gestore schede.." e cercare Wio Terminal nel gestore delle schede, quindi installare
- Selezionare Wio Terminal dal menu "Strumenti" -> "Schede"
Descrizione del progetto
Andremo ad addestrare e distribuire una semplice rete neurale per classificare i gesti delle mani che indicano Sasso, Carta e Forbici rilevati attraverso il sensore di luce presente sulla scheda Wio Terminal. Il principio di funzionamento di questo progetto è in realtà piuttosto banale: i diversi gesti eseguiti sopra il sensore di luce bloccheranno una certa quantità di luce per determinati periodi di tempo:
- per il Sasso avremo prima valori alti, poi valori bassi nell'intervallo di tempo nel quale il pugno chiuso passa sopra il sensore e poi di nuovo valori alti
- per la Carta invece i valori alto e basso si alterneranno, quando ciascuna delle dita della mano aperta passerà sopra il sensore
- per la Forbice si avranno solo due valori bassi relativi alle due dita
Nella Figura 2 vengono mostrati i valori di luminosità rilevati dal sensore al passaggio ripetuto dei tre gesti.
C'è un'elevata varianza nella velocità e nell'ampiezza dei valori del sensore, il che lo rende un ottimo caso per l'utilizzo di un modello di apprendimento automatico. Per addestrare il modello useremo la piattaforma Edge Impulse, già descritta in un articolo precedente. Invitiamo quindi il lettore ad accedere al link per approfondirne la conoscenza.
Raccolta dei dati
Grazie allo strumento denominato data forwarder è possibile inoltrare qualsiasi tipo di dati da un sensore alla piattaforma Edge Impulse. Il data forwarder viene utilizzato per trasmettere facilmente i dati da qualsiasi dispositivo a Edge Impulse tramite collegamento seriale. I dispositivi scrivono i valori dei sensori su una connessione seriale e il data forwarder raccoglie i dati e li invia al servizio di importazione. Il data forwarder è utile per abilitare rapidamente la raccolta dei dati da un'ampia varietà di schede di sviluppo senza dover trasferire il protocollo di gestione remota completo e il protocollo seriale, ma supporta solo la raccolta di dati a frequenze relativamente basse.
Il codice da caricare è il seguente:
#define FREQUENCY_HZ 40 #define INTERVAL_MS (1000 / (FREQUENCY_HZ)) void setup() { Serial.begin(115200); Serial.println("Started"); } void loop() { static unsigned long last_interval_ms = 0; float light; if (millis() > last_interval_ms + INTERVAL_MS) { last_interval_ms = millis(); light = analogRead(WIO_LIGHT); Serial.println(light); //Serial.print('\t'); } }
Dopo aver caricato il codice su Wio Terminal per mezzo dell'IDE Arduino, basterà eseguire il comando edge-impulse-data-forwarder nel prompt dei comandi e accedere con le proprie credenziali di Edge Impulse. Ora tutto è pronto per ricevere i dati nella "Dashboard" di Edge Impulse. Andando alla scheda "Data acquisition" di Edge Impulse si dovrebbe vedere il proprio dispositivo presente. Sempre nella scheda "Data acquisition" impostare la lunghezza del campione su 10000 ms o 10 secondi e creare 10 campioni per ogni gesto, agitando la mano in prossimità del Wio Terminal. In Figura 3 viene mostrato un esempio di addestramento.
Questo è un piccolo set di dati, ma abbiamo anche una minuscola rete neurale, quindi è più probabile che il modello soffra di underfitting piuttosto che overfitting in questo caso particolare. Quando si raccolgono campioni è importante fornire diversità affinché il modello possa generalizzare al meglio, ad esempio, con campioni con direzione, velocità e distanza dal sensore diverse. In generale, la rete può imparare solo dai dati presenti nel set, quindi se si campionano solo gesti con movimento da sinistra verso destra, il modello non dovrebbe essere in grado di riconoscere i gesti con movimento da destra verso sinistra.
Addestramento del modello
Una volta raccolti i dati, prima di darli in pasto alla rete neurale, essi devono essere pre-elaborati. A volte è sufficiente ridimensionare semplicemente i dati, per esempio trasformando i valori nell'intervallo da 0 a 1000 nell'intervallo da 0 a 1 (questo perché le reti neurali operano meglio con numeri piccoli). Le reti neurali utilizzate nel TinyML sono molto piccole in termini di dimensioni e del numero di parametri, così spesso vengono applicate anche tecniche di pre-elaborazione più sofisticate per estrarre le cosiddette features dai dati grezzi, in modo da accelerare il processo di addestramento. Dopo aver raccolto i campioni, è il momento di progettare un "impulso". Impulso è la parola che Edge Impulse utilizza per denotare la pipeline di elaborazione dati e addestramento. Premendo su "Create Impulse", basterà impostare la lunghezza della finestra a 1000 ms e l'incremento della finestra a 50 ms. Queste impostazioni significano che ogni volta che viene eseguita un'inferenza, il sensore eseguirà le sue misure in un intervallo di 1000 ms. Durante la raccolta dei dati è stata impostata la frequenza di campionamento su 40 Hz, o 40 volte al secondo. Quindi, per riassumere, il dispositivo raccoglierà 40 campioni all'interno di una finestra temporale di 1000 ms. Questi valori verranno pre-elaborati e inviati alla rete neurale per ottenere il risultato dell'inferenza. In fase di addestramento viene utilizzata la stessa dimensione della finestra. Per questo progetto proveremo tre diversi blocchi di pre-elaborazione con parametri predefiniti (tranne che per l'aggiunta del fattore di ridimensionamento).
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2242 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.