Cum să rulați un model de învățare automată „Hello World” pe microcontrolerele STM32

By Jacob Beningo

Contributed By DigiKey's North American Editors

Învățarea automată (ML) face furori în aplicațiile pentru servere și dispozitive mobile de ani buni, dar acum a migrat și a devenit esențială pentru dispozitivele de la marginea rețelei. Având în vedere că dispozitivele de la marginea rețelei trebuie să fie eficiente din punct de vedere energetic, dezvoltatorii trebuie să învețe și să înțeleagă cum să implementeze modele ML în sistemele bazate pe microcontrolere. Modelele ML care rulează pe un microcontroler sunt adesea denumite tinyML. Din nefericire, implementarea unui model pe un microcontroler nu este un proces simplu. Cu toate acestea, devine din ce în ce mai ușor, iar dezvoltatorii fără o pregătire specializată vor descoperi că pot face acest lucru într-un timp destul de scurt.

Acest articol explorează modul în care dezvoltatorii de aplicații integrate pot începe să utilizeze ML folosind microcontrolerele STM32 de la STMicroelectronics. În acest sens, articolul arată cum se creează o aplicație „Hello World” prin convertirea unui model TensorFlow Lite pentru microcontrolere, pentru a fi utilizat în STM32CubeIDE folosind X-CUBE-AI.

Prezentarea cazurilor de utilizare tinyML

TinyML este un domeniu în creștere care aduce puterea ML la dispozitive cu resurse și energie limitate, cum ar fi microcontrolerele, folosind de obicei rețele neuronale profunde. Aceste dispozitive cu microcontroler pot rula apoi modelul ML și pot efectua o muncă valoroasă la marginea rețelei. Există mai multe cazuri de utilizare în care tinyML este acum foarte interesant.

Primul caz de utilizare, care se regăsește în multe dispozitive mobile și echipamente de automatizare a locuinței, este identificarea cuvintelor cheie. Identificarea cuvintelor cheie permite dispozitivului încorporat să utilizeze un microfon pentru a capta vocea și a detecta cuvintele cheie pentru care s-a făcut instruire în prealabil. Modelul tinyML utilizează o intrare de serie temporală care reprezintă vorbirea și o convertește în caracteristici de vorbire, de obicei o spectrogramă. Spectrograma conține informații privind frecvența în timp. Spectrograma este apoi introdusă într-o rețea neuronală instruită să detecteze cuvinte specifice, iar rezultatul este o probabilitate ca un anumit cuvânt să fie detectat. Figura 1 prezintă un exemplu al acestui proces.

Imagine cu identificarea cuvintelor cheie, care este un caz de utilizare interesant pentru tinyML (faceți clic pentru a mări imaginea)Figura 1: identificarea cuvintelor cheie este un caz de utilizare interesant pentru tinyML. Vorbirea detectată este convertită într-o spectrogramă și apoi este introdusă într-o rețea neuronală instruită pentru a determina dacă este prezent un cuvânt pre-înregistrat. (Sursa imaginii: Arm®)

Următorul caz de utilizare pentru tinyML de care sunt interesați mulți dezvoltatori de aplicații integrate este recunoașterea imaginilor. Microcontrolerul captează imagini de la o cameră, care sunt apoi introduse într-un model instruit în prealabil. Modelul poate discerne ceea ce se află în imagine. De exemplu, ar putea fi capabil să determine dacă există o pisică, un câine, un pește și așa mai departe. Un exemplu excelent de utilizare a recunoașterii imaginii la marginea rețelei este cel al soneriilor video. Soneria video poate detecta adesea dacă la ușă este prezent un om sau dacă a fost lăsat un pachet.

Un ultim caz de utilizare cu o popularitate ridicată este utilizarea tinyML pentru întreținerea predictivă. Întreținerea predictivă utilizează ML pentru a prezice stările echipamentelor pe baza detectării anomaliilor, a algoritmilor de clasificare și a modelelor predictive. Din nou, sunt disponibile o mulțime de aplicații, de la sistemele HVAC la echipamentele din fabrică.

În timp ce cele trei cazuri de utilizare de mai sus sunt în prezent populare pentru tinyML, există, fără îndoială, multe cazuri de utilizare potențiale pe care dezvoltatorii le pot găsi. Iată o listă rapidă:

  • Clasificarea gesturilor
  • Detectarea anomaliilor
  • Cititor de contoare analogice
  • Ghidare și control (GNC)
  • Detectarea pachetelor

Indiferent de cazul de utilizare, cel mai bun mod de a începe să vă familiarizați cu tinyML este o aplicație „Hello World”, care îi ajută pe dezvoltatori să învețe și să înțeleagă procesul de bază pe care îl vor urma pentru a pune în funcțiune un sistem minim. Există cinci pași necesari pentru a rula un model tinyML pe un microcontroler STM32:

  1. Înregistrarea datelor
  2. Etichetarea datelor
  3. Instruirea rețelei neuronale
  4. Conversia modelului
  5. Rularea modelului pe microcontroler

Înregistrarea, etichetarea și instruirea unui model „Hello World”

Dezvoltatorii au, în general, mai multe opțiuni disponibile în ceea ce privește modul în care vor înregistra și eticheta datele necesare pentru instruirea modelului lor. În primul rând, există o mulțime de baze de date de instruire online. Dezvoltatorii pot căuta date pe care cineva le-a colectat și le-a etichetat. De exemplu, pentru detectarea de bază a imaginilor, există CIFAR-10 sau ImageNet. Pentru a instrui un model de detectare a zâmbetelor în fotografii, există o colecție de imagini și pentru aceasta. Depozitele de date online sunt în mod clar un bun punct de pornire.

În cazul în care datele necesare nu au fost deja puse la dispoziția publicului pe internet, o altă opțiune este ca dezvoltatorii să își genereze propriile date. Pentru a genera seturile de date se poate utiliza Matlab sau un alt instrument. În cazul în care generarea automată a datelor nu este o opțiune, aceasta se poate face manual. În cele din urmă, în cazul în care toate acestea par că necesită prea mult timp, există unele seturi de date care pot fi achiziționate tot de pe internet. Colectarea datelor este adesea cea mai interesantă și mai interesantă opțiune, dar și cea mai dificilă.

Exemplul „Hello World” explorat aici arată cum se instruiește un model pentru a genera o undă sinusoidală și cum se implementează pe un STM32. Exemplul a fost creat de Pete Warden și Daniel Situnayake ca parte a activității lor la Google pentru TensorFlow Lite pentru microcontrolere. Acest lucru ușurează munca, deoarece au pregătit un tutorial simplu și public despre înregistrarea, etichetarea și instruirea modelului. Acesta poate fi găsit pe Github aici; odată ajunși acolo, dezvoltatorii trebuie să facă clic pe butonul „Run in Google Colab”. Google Colab, prescurtarea de la Google Collaboratory, permite dezvoltatorilor să scrie și să execute Python în browserul lor fără nicio configurație și oferă acces gratuit la GPU-urile Google.

Rezultatul parcurgerii exemplului de instruire va include două fișiere de model diferite; un model TensorFlow model.tflite cuantizat pentru microcontrolere și un model model_no_quant.tflite care nu este cuantizat. Cuantizarea indică modul în care sunt stocate numeric activările și polarizarea modelului. Versiunea cuantizată produce un model mai mic, care este mai potrivit pentru un microcontroler. Pentru cititorii curioși, rezultatele modelului instruit față de rezultatele reale ale undelor sinusoidale pot fi văzute în Figura 2. Rezultatul modelului este cel cu roșu. Ieșirea sinusoidală nu este perfectă, dar funcționează suficient de bine pentru un program „Hello World”.

Graficul predicțiilor modelului TensorFlow pentru o undă sinusoidală față de valorile realeFigura 2: o comparație între predicțiile modelului TensorFlow pentru o undă sinusoidală față de valorile reale. (Sursă imagine: Beningo Embedded Group)

Selectarea unei plăci de dezvoltare

Înainte de a analiza modul de conversie a modelului TensorFlow pentru a rula pe un microcontroler, trebuie selectat un microcontroler pentru implementarea în model. Acest articol se va concentra asupra microcontrolerelor STM32, deoarece STMicroelectronics are multe instrumente tinyML/ML care funcționează bine pentru convertirea și rularea modelelor. În plus, STMicroelectronics dispune de o mare varietate de piese compatibile cu instrumentele sale ML (Figura 3).

Tabel al ecosistemului de inteligență artificială STMicroelectronics (faceți clic pentru a mări imaginea)Figura 3: sunt prezentate microcontrolerele și unitatea de microprocesor (MPU) acceptate în prezent de ecosistemul de inteligență artificială STMicroelectronics. (Sursă imagine: STMicroelectronics)

Dacă aveți una dintre aceste plăci prin birou, este perfectă pentru a pune în funcțiune aplicația „Hello World”. Cu toate acestea, pentru cei interesați să meargă dincolo de acest exemplu și să descopere controlul gesturilor sau identificarea cuvintelor cheie, optați pentru STM32 B-L4S5I-IOT01A Discovery IoT Node (Figura 4).

Această placă are un procesor Arm Cortex®-M4 bazat pe seria STM32L4+. Procesorul are 2 megaocteți (Mbytes) de memorie flash și 640 kiloocteți (Kbytes) de memorie RAM, ceea ce oferă suficient spațiu pentru modelele tinyML. Modulul este adaptabil pentru experimentele cazurilor de utilizare tinyML, deoarece dispune și de microfonul MP34DT01 al sistemelor microelectromecanice (MEMS) de la STMicroelectronics, care poate fi utilizat pentru dezvoltarea aplicațiilor de identificare a cuvintelor cheie. În plus, accelerometrul cu trei axe LIS3MDLTR încorporat, tot de la STMicroelectronics, poate fi utilizat pentru detectarea gesturilor bazată pe tinyML.

Imagine a STM32 B-L4S5I-IOT01A Discovery IoT Node STMicroelectronicsFigura 4: STM32 B-L4S5I-IOT01A Discovery IoT Node este o platformă de experimentare adaptabilă pentru tinyML datorită procesorului Arm Cortex-M4 încorporat, microfonului MEMS și accelerometrului cu trei axe. (Sursă imagine: STMicroelectronics)

Convertirea și rularea modelului TensorFlow Lite cu STM32Cube.AI

Înarmați cu o placă de dezvoltare care poate fi utilizată pentru a rula modelul tinyML, dezvoltatorii pot începe acum să convertească modelul TensorFlow Lite în ceva ce poate rula pe microcontroler. Modelul TensorFlow Lite poate rula direct pe microcontroler, dar are nevoie de un mediu de execuție pentru procesare.

Atunci când modelul este rulat, trebuie să se execute o serie de funcții. Aceste funcții încep cu colectarea datelor senzorilor, apoi le filtrează, extrag caracteristicile necesare și le introduc în model. Modelul va emite un rezultat care poate fi filtrat în continuare și apoi – de obicei – se iau măsuri. Figura 5 oferă o imagine de ansamblu a acestui proces.

Diagrama fluxurilor de date de la senzori la timpul de execuție și apoi la ieșireFigura 5: modul în care datele trec de la senzori la timpul de execuție și apoi la ieșire într-o aplicație tinyML. (Sursă imagine: Beningo Embedded Group)

Plug-in-ul X-CUBE-AI pentru STM32CubeMx oferă mediul de execuție pentru interpretarea modelului TensorFlow Lite și oferă timpi de execuție alternativi și instrumente de conversie pe care dezvoltatorii le pot utiliza. Plug-in-ul X-CUBE-AI nu este activat în mod implicit într-un proiect. Cu toate acestea, după crearea unui nou proiect și inițializarea plăcii, în Software Packs-> Select Components, există o opțiune pentru a activa timpul de execuție AI. Există mai multe opțiuni aici; asigurați-vă că pentru acest exemplu se utilizează șablonul pentru aplicații, așa cum se arată în Figura 6.

Imaginea plug-in-ului X-CUBE-AI care trebuie să fie activatFigura 6: plug-in-ul X-CUBE-AI trebuie să fie activat cu ajutorul șablonului de aplicație pentru acest exemplu. (Sursă imagine: Beningo Embedded Group)

După ce X-CUBE-AI a fost activat, o categorie STMicroelectronics X-CUBE-AI va apărea în lanțul de instrumente. Dacă face clic pe categorie, dezvoltatorul va avea posibilitatea de a selecta fișierul modelului pe care l-a creat și de a seta parametrii modelului, după cum se arată în Figura 7. De asemenea, un buton de analiză va analiza modelul și va oferi dezvoltatorilor informații despre RAM, ROM și ciclul de execuție. Se recomandă în mod deosebit ca dezvoltatorii să compare opțiunile modelelor Keras și TFLite. Pe exemplul modelului cu unde sinusoidale, care este mic, nu va fi o diferență uriașă, dar va fi vizibilă. Proiectul poate fi apoi generat făcând clic pe „Generate code”.

Imagine cu informații despre RAM, ROM și ciclurile de execuțieFigura 7: butonul de analiză le va oferi dezvoltatorilor informații despre RAM, ROM și ciclurile de execuție. (Sursă imagine: Beningo Embedded Group)

Generatorul de cod va inițializa proiectul și va construi mediul de execuție pentru modelul tinyML. Cu toate acestea, în mod implicit, modelul nu este alimentat cu nimic. Dezvoltatorii trebuie să adauge cod pentru a furniza valorile de intrare ale modelului – valorile x – pe care modelul le va interpreta și le va folosi pentru a genera valorile sinusoidale y. Câteva bucăți de cod trebuie adăugate la funcțiile acquire_and_process_data și post_process, după cum se arată în Figura 8.

Imaginea codului afișat care va conecta valorile false ale senzorilor de intrareFigura 8: codul prezentat va conecta valorile false ale senzorilor de intrare la modelul cu unde sinusoidale. (Sursă imagine: Beningo Embedded Group)

În acest moment, exemplul este gata să fie rulat. Notă: adăugați câteva instrucțiuni printf pentru a obține rezultatul modelului pentru o verificare rapidă. O compilare rapidă și o implementare rapidă au ca rezultat rularea modelului tinyML „Hello World”. Tragerea ieșirii modelului pentru un ciclu complet rezultă în unda sinusoidală prezentată în Figura 9. Nu este perfect, dar este excelent pentru o primă aplicație tinyML. De aici, dezvoltatorii ar putea lega ieșirea la un modulator în lățime a impulsurilor (PWM) și ar putea genera unda sinusoidală.

Imagine a ieșirii modelului de undă sinusoidală „Hello World” (faceți clic pentru a mări imaginea)Figura 9: ieșirea modelului de undă sinusoidală „Hello World” atunci când este rulat pe STM32. (Sursă imagine: Beningo Embedded Group)

Sfaturi și trucuri pentru ML pe sisteme încorporate

Dezvoltatorii care doresc să înceapă să utilizeze ML pe sisteme bazate pe microcontroler vor avea destul de multe de făcut pentru a pune în funcțiune prima lor aplicație tinyML. Cu toate acestea, există câteva „sfaturi și trucuri” de care trebuie să țineți cont și care pot simplifica și accelera dezvoltarea lor:

  • Parcurgeți exemplul TensorFlow Lite pentru microcontrolere „Hello World”, inclusiv fișierul Google Colab. Acordați-vă puțin timp pentru a ajusta parametrii și a înțelege cum afectează aceștia modelul instruit.
  • Utilizați modele cuantizate pentru aplicații cu microcontroler. Modelul cuantizat este comprimat pentru a funcționa mai degrabă cu uint8_t decât cu numere în virgulă mobilă pe 32 de biți. Drept urmare, modelul va fi mai mic și se va executa mai rapid.
  • Explorați exemplele suplimentare din depozitul TensorFlow Lite pentru microcontrolere. Alte exemple includ detectarea gesturilor și detectarea cuvintelor cheie.
  • Luați exemplul „Hello World”, conectând ieșirea modelului la un PWM și la un filtru trece-jos pentru a vedea unda sinusoidală rezultată. Experimentați cu timpul de execuție pentru a mări și a micșora frecvența undei sinusoidale.
  • Selectați o placă de dezvoltare care să includă senzori „extra” care să permită încercarea unei game largi de aplicații ML.
  • Oricât de distractiv ar fi să colectezi date, este în general mai ușor să achiziționezi sau să folosești o bază de date open-source pentru instruirea modelului.

Dezvoltatorii care urmează aceste „sfaturi și trucuri” vor economisi destul de mult timp și energie mentală atunci când își securizează aplicația.

Concluzie

ML a ajuns la marginea rețelei, iar sistemele bazate pe microcontrolere cu resurse limitate sunt o țintă principală. Cele mai recente instrumente permit convertirea și optimizarea modelelor ML pentru a fi rulate pe sisteme în timp real. După cum s-a arătat, configurarea și rularea unui model pe o placă de dezvoltare STM32 sunt relativ ușoare, în ciuda complexității implicate. În timp ce discuția a examinat un model simplu care generează o undă sinusoidală, sunt posibile modele mult mai complexe, cum ar fi detectarea gesturilor și identificarea cuvintelor cheie.

DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

About this author

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo is an embedded software consultant. He has published more than 200 articles on embedded software development techniques, is a sought-after speaker and technical trainer, and holds three degrees, including a Masters of Engineering from the University of Michigan.

About this publisher

DigiKey's North American Editors