Come eseguire un modello di apprendimento automatico "Hello World" su microcontroller STM32

Di Jacob Beningo

Contributo di Editori nordamericani di DigiKey

L'apprendimento automatico (ML) è di gran moda nelle applicazioni server e mobili da anni, ma ora è diventato fondamentale nei dispositivi edge. Dato che i dispositivi edge devono essere efficienti dal punto di vista energetico, gli sviluppatori devono imparare a implementare i modelli di ML nei sistemi basati su microcontroller. I modelli ML eseguiti su un microcontroller sono spesso chiamati tinyML. Purtroppo, la distribuzione di un modello su un microcontroller non è un compito banale. Sta comunque diventando più facile e gli sviluppatori che non hanno una formazione specifica scopriranno di poterlo fare in poco tempo.

Questo articolo analizza come gli sviluppatori embedded possono iniziare a lavorare con l'apprendimento automatico utilizzando i microcontroller STM32 di STMicroelectronics. A tal fine, mostra come creare un'applicazione "Hello World" convertendo un modello TensorFlow Lite for Microcontrollers per l'uso in STM32CubeIDE utilizzando X-CUBE-AI.

Casi d'uso di tinyML

tinyML è un campo in crescita che porta la potenza di ML su dispositivi con risorse e potenza limitate come i microcontroller, di solito utilizzando reti neurali profonde. Questi dispositivi a microcontroller possono quindi eseguire il modello di ML e svolgere un lavoro prezioso sull'edge. Ci sono diversi casi d'uso in cui tinyML è ora molto interessante.

Il primo caso d'uso, presente in molti dispositivi mobili e di domotica, è l'individuazione delle parole chiave. L'individuazione delle parole chiave consente al dispositivo embedded di utilizzare un microfono per catturare il parlato e rilevare le parole chiave pre-apprese. Il modello tinyML utilizza una serie temporale in ingresso che rappresenta il parlato e la converte in caratteristiche del parlato, di solito uno spettrogramma. Lo spettrogramma contiene informazioni sulla frequenza nel tempo. Lo spettrogramma viene quindi inserito in una rete neurale addestrata a rilevare parole specifiche e il risultato è la probabilità che una determinata parola venga rilevata. La Figura 1 mostra un esempio di come si presenta questo processo.

Immagine dell'individuazione delle parole chiave, un caso d'uso interessante per tinyML (fare clic per ingrandire)Figura 1: L'individuazione delle parole chiave è un caso d'uso interessante per tinyML. Il parlato in ingresso viene convertito in uno spettrogramma e poi inserito in una rete neurale addestrata per determinare se è presente una parola pre-addestrata. (Immagine per gentile concessione di ARM®)

Un altro caso d'uso di tinyML che interessa molti sviluppatori embedded è il riconoscimento delle immagini. Il microcontroller acquisisce le immagini da una telecamera, per poi inserirle in un modello pre-addestrato. Il modello è in grado di discernere ciò che contiene nell'immagine. Ad esempio, si potrebbe essere in grado di determinare se esiste un gatto, un cane, un pesce e così via. Un ottimo esempio di come il riconoscimento delle immagini venga utilizzato sull'edge è dato dai campanelli con video. Un campanello dotato di video è spesso in grado di rilevare la presenza di una persona alla porta o se è stato lasciato un pacco.

Un ultimo caso d'uso molto diffuso è l'utilizzo di tinyML per la manutenzione predittiva. La manutenzione predittiva utilizza ML per prevedere gli stati delle apparecchiature sulla base del rilevamento di anomalie, degli algoritmi di classificazione e dei modelli predittivi. Anche in questo caso, sono possibili numerose applicazioni, dai sistemi HVAC alle apparecchiature di fabbrica.

Sebbene i tre casi d'uso sopra descritti siano attualmente diffusi per tinyML, esistono indubbiamente molti altri casi d'uso potenziali. Ecco un rapido elenco:

  • Classificazione dei gesti
  • Rilevamento delle anomalie
  • Lettore contatore analogico
  • Guida e controllo (GNC)
  • Rilevamento di pacchi

Indipendentemente dal caso d'uso, il modo migliore per iniziare a familiarizzare con tinyML è con un'applicazione "Hello World", che aiuta gli sviluppatori a capire il processo di base che dovranno seguire per mettere in funzione un sistema semplice. Per eseguire un modello tinyML su un microcontroller STM32 sono necessari cinque passaggi:

  1. Acquisire i dati
  2. Etichettare i dati
  3. Addestrare la rete neurale
  4. Convertire il modello
  5. Eseguire il modello sul microcontroller

Acquisire, etichettare e addestrare un modello "Hello World".

In genere gli sviluppatori hanno a disposizione molte opzioni per l'acquisizione e l'etichettatura dei dati necessari all'addestramento del modello. In primo luogo, esistono molte banche dati di addestramento online. Gli sviluppatori possono cercare i dati che qualcuno ha raccolto ed etichettato. Ad esempio, per il rilevamento di immagini di base, ci sono CIFAR-10 o ImageNet. Anche per addestrare un modello a rilevare i sorrisi nelle foto esiste una raccolta di immagini. Gli archivi di dati online sono chiaramente un ottimo punto di partenza.

Se i dati richiesti non sono già stati resi pubblicamente disponibili su Internet, un'altra opzione è che gli sviluppatori generino i propri dati. Per generare i set di dati si può utilizzare Matlab o altri strumenti. Se la generazione automatica dei dati non è possibile, la si può effettuare manualmente. Infine, se tutto questo vi sembra troppo dispendioso in termini di tempo, ci sono alcuni set di dati disponibili per l'acquisto, anche su Internet. La raccolta dei dati è spesso l'opzione più eccitante e interessante, ma è anche la più impegnativa.

L'esempio di "Hello World" qui illustrato mostra come addestrare un modello per generare un'onda sinusoidale e distribuirlo su un STM32. L'esempio è stato realizzato da Pete Warden e Daniel Situnayake nell'ambito del loro lavoro presso Google su TensorFlow Lite per microcontroller. Questo rende il tutto più facile, perché hanno messo insieme un semplice tutorial pubblico sull'acquisizione, l'etichettatura e l'addestramento del modello. È disponibile su Github qui; una volta entrati, gli sviluppatori devono fare clic sul pulsante "Run in Google Colab". Google Colab, abbreviazione di Google Collaboratory, consente di scrivere ed eseguire Python nel proprio browser senza alcuna configurazione e fornisce accesso gratuito alle GPU di Google.

L'output dell'esempio di addestramento includerà due diversi file di modello: un modello TensorFlow model.tflite quantizzato per i microcontroller e un modello model_no_quant.tflite non quantizzato. La quantizzazione indica il modo in cui le attivazioni e i bias del modello vengono memorizzati numericamente. La versione quantizzata produce un modello più piccolo, più adatto a un microcontroller. Per i lettori più curiosi, i risultati del modello addestrato rispetto ai risultati effettivi dell'onda sinusoidale sono visibili nella Figura 2. L'output del modello è in rosso. L'uscita dell'onda sinusoidale non è perfetta, ma funziona abbastanza bene per un programma "Hello World".

Grafico delle predizioni del modello TensorFlow per un'onda sinusoidale rispetto ai valori realiFigura 2: Confronto tra le predizioni del modello TensorFlow per un'onda sinusoidale e i valori reali. (Immagine per gentile concessione di Beningo Embedded Group)

Selezione di una scheda di sviluppo

Prima di vedere come convertire il modello TensorFlow per l'esecuzione su un microcontroller, è necessario selezionare un microcontroller per l'implementazione del modello. Questo articolo si concentrerà sui microcontroller STM32 perché STMicroelectronics ha molti strumenti tinyML/ML che funzionano bene per convertire ed eseguire i modelli. Inoltre, STMicroelectronics dispone di un'ampia gamma di componenti compatibili con i suoi strumenti ML (Figura 3).

Tabella dell'ecosistema di IA di STMicroelectronics (fare clic per ingrandire)Figura 3: Sono mostrati i microcontroller e l'unità microprocessore (MPU) attualmente supportati dall'ecosistema di IA di STMicroelectronics. (Immagine per gentile concessione di STMicroelectronics)

Se avete una di queste schede a portata di mano, è perfetta per creare l'applicazione "Hello World". Tuttavia, per coloro che sono interessati a spingersi oltre questo esempio e a dedicarsi al controllo dei gesti o all'individuazione di parole chiave, è possibile optare per il nodo IoT Discovery STM32 B-L4S5I-IOT01A (Figura 4).

Questa scheda è dotata di un processore ARM Cortex®-M4 basato sulla serie STM32L4+. Il processore dispone di 2 MB di memoria flash e 640 kB di RAM, che offrono spazio sufficiente per i modelli tinyML. Il modulo è adattabile agli esperimenti di casi d'uso tinyML, perché è dotato anche del microfono MP34DT01 di STMicroelectronics per sistemi microelettromeccanici (MEMS) che può essere utilizzato per lo sviluppo di applicazioni di individuazione di parole chiave. Inoltre, l'accelerometro a tre assi LIS3MDLTR, sempre di STMicroelectronics, può essere utilizzato per il rilevamento dei gesti basato su tinyML.

Immagine del kit IoT Discovery STM32 B-L4S5I-IOT01A di STMicroelectronicsFigura 4: Il kit per il nodo IoT Discovery STM32 B-L4S5I-IOT01A è una piattaforma di sperimentazione adattabile per tinyML grazie al processore ARM Cortex-M4 integrato, al microfono MEMS e all'accelerometro a tre assi. (Immagine per gentile concessione di STMicroelectronics)

Conversione ed esecuzione del modello TensorFlow Lite mediante STM32Cube.AI

Dotati di una scheda di sviluppo utilizzabile per eseguire il modello tinyML, gli sviluppatori possono ora iniziare a convertire il modello TensorFlow Lite in qualcosa che possa essere eseguito sul microcontroller. Il modello TensorFlow Lite può essere eseguito direttamente sul microcontroller, ma ha bisogno di un ambiente di runtime per l'elaborazione.

Quando viene eseguito il modello, deve eseguire una serie di funzioni. Queste funzioni iniziano con la raccolta dei dati del sensore, quindi il filtraggio, l'estrazione delle caratteristiche necessarie e la trasmissione al modello. Il modello genera un risultato che può essere ulteriormente filtrato e poi, di solito, si interviene con un'azione. La Figura 5 fornisce una panoramica di come si presenta questo processo.

Diagramma dei flussi di dati dai sensori al runtime e quindi all'outputFigura 5: I dati fluiscono dai sensori al runtime e poi all'output in un'applicazione tinyML. (Immagine per gentile concessione di Beningo Embedded Group)

Il plug-in X-CUBE-AI per STM32CubeMx fornisce l'ambiente di runtime per interpretare il modello TensorFlow Lite e offre runtime alternativi e strumenti di conversione che gli sviluppatori possono sfruttare. Il plug-in X-CUBE-AI non è abilitato di default in un progetto. Tuttavia, dopo la creazione di un nuovo progetto e l'inizializzazione della scheda, in Software Packs-> Select Components, un'opzione consente di abilitare il runtime IA. Sono disponibili diverse opzioni; assicuratevi che per questo esempio venga utilizzato il modello Application, come mostrato nella Figura 6.

Immagine del plug-in X-CUBE-AI che deve essere abilitatoFigura 6: Il plug-in X-CUBE-AI deve essere abilitato utilizzando il modello di applicazione per questo esempio. (Immagine per gentile concessione di Beningo Embedded Group)

Una volta abilitato X-CUBE-AI, nella toolchain apparirà la categoria STMicroelectronics X-CUBE-AI. Facendo clic su tale categoria, lo sviluppatore potrà selezionare il file del modello creato e impostare i parametri del modello, come mostra la Figura 7. Un pulsante analizza inoltre il modello e fornisce agli sviluppatori informazioni su RAM, ROM e ciclo di esecuzione. Si consiglia vivamente di confrontare le opzioni dei modelli Keras e TFLite. Nell'esempio del modello di onda sinusoidale, che è piccolo, non ci sarà una differenza enorme, ma si nota. Il progetto può quindi essere generato facendo clic su "Generate code".

Immagine di RAM, ROM e informazioni sul ciclo di esecuzioneFigura 7: Il pulsante Analizza fornisce informazioni su RAM, ROM e ciclo di esecuzione. (Immagine per gentile concessione di Beningo Embedded Group)

Il generatore di codice inizializzerà il progetto e creerà l'ambiente di runtime per il modello tinyML. Tuttavia, per impostazione predefinita, il modello non riceve nulla. Gli sviluppatori devono aggiungere il codice per fornire i valori di input del modello - i valori x - che il modello interpreterà e utilizzerà per generare i valori y del seno. È necessario aggiungere alcuni elementi di codice alle funzioni acquis_e_elaborazione_dati e post_elaborazione, come mostra la Figura 8.

Immagine del codice che collegherà i valori falsi del sensore di inputFigura 8: Il codice mostrato collega i valori falsi del sensore di input al modello di onda sinusoidale. (Immagine per gentile concessione di Beningo Embedded Group)

A questo punto, l'esempio è pronto per l'esecuzione. Nota: aggiungere alcune dichiarazioni printf per ottenere l'output del modello per una rapida verifica. Una compilazione e una distribuzione veloci portano all'esecuzione del modello tinyML "Hello World". Estraendo l'output del modello per un ciclo completo si ottiene l'onda sinusoidale mostrata nella Figura 9. Non è perfetto, ma è eccellente per una prima applicazione tinyML. Da qui, gli sviluppatori possono collegare l'output a un modulatore della larghezza di impulso (PWM) e generare l'onda sinusoidale.

Immagine dell'output del modello di onda sinusoidale "Hello World" (fare clic per ingrandire)Figura 9: L'output del modello di onda sinusoidale "Hello World" eseguito su STM32. (Immagine per gentile concessione di Beningo Embedded Group)

Suggerimenti e consigli per il debug di un sistema embedded

Gli sviluppatori che desiderano iniziare a utilizzare ML su sistemi basati su microcontroller avranno parecchio lavoro da fare per rendere operativa la loro prima applicazione tinyML. Tuttavia, ci sono diversi accorgimenti da tenere a mente che possono semplificare e accelerare lo sviluppo:

  • Eseguite l'esempio di TensorFlow Lite per microcontroller "Hello World", compreso il file Google Colab. Prendetevi un po' di tempo per regolare i parametri e capire come influiscono sul modello addestrato.
  • Utilizzate modelli quantizzati per le applicazioni dei microcontroller. Il modello quantizzato è compresso per funzionare con uint8_t, anziché con numeri a virgola mobile a 32 bit. Di conseguenza, il modello sarà più piccolo e verrà eseguito più velocemente.
  • Esplorate gli esempi aggiuntivi nel repository TensorFlow Lite for Microcontrollers. Altri esempi sono il rilevamento dei gesti e il rilevamento delle parole chiave.
  • Prendiamo l'esempio di "Hello World" collegando l'output del modello a un PWM e a un filtro passa-basso per vedere l'onda sinusoidale risultante. Sperimentate il runtime per aumentare e diminuire la frequenza dell'onda sinusoidale.
  • Scegliete una scheda di sviluppo che includa sensori supplementari che consentano di provare un'ampia gamma di applicazioni ML.
  • Per quanto possa essere divertente raccogliere dati, è generalmente più facile acquistare o utilizzare un database open-source per addestrare il modello.

Seguendo questi consigli, gli sviluppatori risparmieranno parecchio tempo nella creazione delle applicazioni.

Conclusione

L'apprendimento automatico è giunto all'edge margini della rete e i sistemi basati su microcontroller con risorse limitate sono il target principale. Gli strumenti più recenti consentono di convertire e ottimizzare i modelli di ML per l'esecuzione su sistemi in tempo reale. Come mostrato, la messa in funzione di un modello su una scheda di sviluppo STM32 è relativamente semplice, nonostante le complessità che comporta. Se la discussione ha esaminato un modello semplice che genera un'onda sinusoidale, sono tuttavia possibili modelli molto più complessi, come il rilevamento dei gesti e l'individuazione delle parole chiave.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo è un consulente software embedded e attualmente lavora con clienti in più di una decina di paesi per trasformare radicalmente le loro attività migliorando la qualità dei prodotti, i costi e il time-to-market. Ha pubblicato più di 200 articoli sulle tecniche di sviluppo di software embedded, è un relatore e un istruttore tecnico e ha conseguito tre lauree, tra cui un master in ingegneria presso University of Michigan. Risponde all'indirizzo jacob@beningo.com, ha un sito web personale www.beningo.com e produce una Newsletter mensile Embedded Bytes cui è possibile iscriversi.

Informazioni su questo editore

Editori nordamericani di DigiKey