Hvordan kjøre en «Hello World»-maskinlæringsmodell på STM32-mikrokontrollere

Av Jacob Beningo

Bidrag fra DigiKeys nordamerikanske redaktører

Maskinlæring (ML) har vært en populær teknikk i server- og mobilapplikasjoner i årevis, men har nå migrert og blitt kritisk på edge-enheter (inngangspunktenheter). Gitt at edge-enheter (inngangspunktenheter) må være energieffektive, må utviklere forstå hvordan de kan implementere ML-modeller (maskinlæringsmodeller) til mikrokontrollerbaserte systemer. ML-modeller som kjører på en mikrokontroller omtales ofte som tinyML. Dessverre er det ikke en helt enkel sak å distribuere en modell til en mikrokontroller. Det blir likevel enklere, og utviklere uten spesialopplæring kommer til å oppdage at de kan gjøre relativt raskt.

Denne artikkelen tar for seg hvordan integrasjonsutviklere kan komme i gang med ML ved hjelp av STMicroelectronics sin STM32-mikrokontroller. For å gjøre dette, viser den hvordan du oppretter et «Hello World»-program ved å konvertere en TensorFlow Lite for mikrokontrollere-modell for bruk i STM32CubeIDE ved hjelp av X-CUBE-AI.

Introduksjon til tinyML-brukstilfeller

TinyML er et voksende felt som bringer ML sine styrker til ressurs- og strømbegrensede enheter som mikrokontrollere, vanligvis ved hjelp av dype nevrale nettverk. Disse mikrokontrollerne kan deretter kjøre ML-modellen og utføre verdifullt arbeid på inngangspunktet (edge). Det er flere brukstilfeller der tinyML nå er ganske interessant.

Den første brukstilfellet, som ses i mange mobile enheter og hjemmeautomatiseringsutstyr, er oppdagelse av søkeord (keyword spotting). Søkeorddeteksjon gjør det mulig for den innebygde enheten å bruke en mikrofon til å fange opp tale og oppdage forhåndsinnlærte søkeord. Den lille ML-modellen bruker en tidsserie-inngang som representerer talen og konverterer den til talefunksjoner, vanligvis et spektrogram. Spektrogrammet inneholder frekvensinformasjon over tid. Spektrogrammet mates deretter inn i et nevralt nettverk som er opplært til å oppdage bestemte ord, og resultatet er en sannsynlighet for at et bestemt ord oppdages. Figur 1 viser et eksempel på hvordan denne prosessen ser ut.

Bilde av søkeorddeteksjon er et interessant brukstilfelle for tinyML (klikk for å forstørre)Figur 1: Søkeorddeteksjon er et interessant brukstilfelle for tinyML. Inndatatalen konverteres til et spektrogram og mates deretter inn i et opplært nevralt nettverk for å finne ut om det finnes et forhåndsinnlært ord. (Bildekilde: Arm®)

Det neste brukstilfellet for tinyML som mange innebygde utviklere er interessert i, er bildegjenkjenning. Mikrokontrolleren tar bilder fra et kamera, som deretter mates inn i en forhåndsinnlært modell. Modellen kan få øye på og skjelne hva som er i bildet. For eksempel kan man være i stand til å avgjøre om det er en katt, en hund, en fisk og så videre. Et godt eksempel på hvordan bildegjenkjenning brukes på inngangspunktet (edge) er i videodørklokker. Videodørklokken kan ofte oppdage om et menneske er til stede ved døren eller om en pakke er blitt etterlatt.

Et siste brukstilfelle med høy popularitet er å bruke tinyML for forebyggende vedlikehold. Forebyggende vedlikehold bruker ML til å forutsi utstyrstilstander basert på unormalitetsdeteksjon, klassifiseringsalgoritmer og prediktive modeller. Det er mange fortsatt mange potensielle bruksområder, alt fra HVAC-systemer til produksjonsutstyr i fabrikker.

Selv om de tre ovennevnte brukstilfellene for øyeblikket er populære for tinyML, er det utvilsomt mange potensielle brukstilfeller som utviklere kan finne. Her er en kjapp liste:

  • Klassifisering av bevegelser
  • Avviksdeteksjon
  • Analog måleravlesing
  • Veiledning og styring (Guidance and control – GNC)
  • Pakkedeteksjon

Uansett brukstilfelle er den beste måten å bli kjent med tinyML et «Hello World»-program, som hjelper utviklere å lære og forstå den grunnleggende prosessen å følge, for å få et minimalt system i gang. Det er fem nødvendige trinn for å kjøre en tinyML-modell på en STM32-mikrokontroller:

  1. Innsamling av data
  2. Etikettdata
  3. Innlæring til nevralt nettverket
  4. Konvertere modellen
  5. Kjør modellen på mikrokontrolleren

Innsamling , merking og opplæring av en «Hello World»-modell

Utviklere har generelt mange alternativer tilgjengelig for hvordan de vil fange og merke dataene som trengs for å lære opp modellen sin. For det første er det mange nettbaserte opplæringsdatabaser. Utviklere kan søke etter data som noen har samlet inn og merket. For eksempel, for grunnleggende bildedeteksjon, er det CIFAR-10 eller ImageNet. For å lære opp en modell til å oppdage smil på bilder, finnes det en bildesamling for det også. Datalager på nett er helt klart et veldig bra sted å starte.

Hvis de nødvendige dataene ikke allerede er gjort offentlig tilgjengelig på Internett, er et annet alternativ at utviklere genererer sine egne data. Matlab eller et annet verktøy kan brukes til å generere datasettene. Hvis automatisk datagenerering ikke er et alternativ, kan det gjøres manuelt. Til slutt, hvis alt dette virker for tidkrevende, er det noen datasett tilgjengelig for kjøp, også via nettet. Innsamling av data er ofte det mest spennende og interessante alternativet, men det er også det viktigste arbeidet.

«Hello World»-eksemplet som vi tar for oss her, viser hvordan du trener en modell for å generere en sinusbølge og distribuere den til en STM32. Eksemplet ble satt sammen av Pete Warden og Daniel Situnayake som en del av deres arbeid på Google på TensorFlow Lite for mikrokontrollere. Dette gjør jobben enklere fordi de har satt sammen en enkel, offentlig veiledning om opptak, merking og opplæring av modellen. Den finner du på Github her. Når du er der, bør utviklerne klikke på «Run in Google Colab»-knappen. Google Colab, forkortelse for Google Collaboratory, gjør det mulig for utviklere å skrive og kjøre Python i nettleseren uten noen konfigurasjon og gir gratis tilgang til Googles GPU-er.

Resultatet fra å gå gjennom opplæringseksemplet vil inkludere to forskjellige modellfiler; en model.tflite TensorFlow-modell som er kvantisert for mikrokontrollere og en model_no_quant.tflite-modell som ikke er kvantisert. Kvantiseringen angir hvordan modellaktiveringene og forspenningen lagres numerisk. Den kvantiserte versjonen produserer en mindre modell som passer bedre til en mikrokontroller. For de nysgjerrige leserne kan de innlærte modellresultatene i forhold til faktiske sinusbølgeresultater sees i figur 2. Utgangen av modellen er i rødt. Sinusbølge-utgangen er ikke perfekt, men den fungerer godt nok for et «Hello World»-program.

Graf for TensorFlow-modellforutsigelser for en sinusbølge versus de faktiske verdieneFigur 2: En sammenligning mellom TensorFlow-modellens forutsigelser for en sinusbølge versus de faktiske verdiene. (Bildekilde: Beningo Embedded Group)

Valg av utviklingskort

Før du ser på hvordan du konverterer TensorFlow-modellen til å kjøre på en mikrokontroller, må en mikrokontroller velges for distribusjon i modellen. Denne artikkelen vil fokusere på STM32 mikrokontroller fordi STMicroelectronics har mange verktøy til tinyML og ML, som fungerer bra for konvertering og kjøring av modeller. I tillegg har STMicroelectronics et bredt utvalg av deler som er kompatible med deres ML-verktøy (figur 3).

Tabell over STMicroelectronics AI-økosystem (klikk for å forstørre)Figur 3: Vist er mikrokontrollerne og mikroprosessorenheten (MPU) som for øyeblikket støttes av STMicroelectronics AI-økosystem. (Bildekilde: STMicroelectronics)

Hvis du har et av disse kortene liggende på kontoret, er det perfekt for å få «Hello World»-applikasjonen opp og kjøre. Men for de som er interessert i å gå lenger enn dette eksempelet og komme inn i gestkontroll eller søkeorddeteksjon, velg STM32 B-L4S5I-IOT01A Discovery IoT Node (figur 4).

Dette kortet har en Arm Cortex®-M4-prosessor basert på STM32L4+-serien. Prosessoren har 2 MB flashminne og RAM på 640 KB, noe som gir god plass til tinyML-modeller. Modulen er tilpasningsdyktig for tinyML-brukstilfeller fordi den også har STMicroelectronics sin MEMS-mikrofon MP34DT01 som kan brukes til søkeorddeteksjon og applikasjonsutvikling. I tillegg kan det integrerte tre-aksede akselerometeret LIS3MDLTR, også fra STMicroelectronics, brukes til tinyML-basert bevegelsesdeteksjon.

Bilde av STMicroelectronics STM32 B-L4S5I-IOT01A Discovery IoT-nodeFigur 4: STM32 B-L4S5I-IOT01A Discovery IoT-node er en tilpasningsdyktig eksperimenteringsplattform for tinyML, på grunn av sin integrerte Arm Cortex-M4-prosessor, MEMS-mikrofon og tre-akse akselerometer. (Bildekilde: STMicroelectronics)

Konvertering og kjøring av TensorFlow Lite-modellen med STM32Cube.AI

Utstyrt med et utviklingskort som kan brukes til å kjøre tinyML-modellen, kan utviklerne nå begynne å konvertere TensorFlow Lite-modellen til noe som kan kjøre på mikrokontrolleren. TensorFlow Lite-modellen kan kjøres direkte på mikrokontrolleren, men den trenger et kjøretidsmiljø (runtime environment) for å behandle den.

Når modellen kjøres, må en rekke funksjoner utføres. Disse funksjonene starter med å samle inn sensordataene, deretter filtrere dem, trekke ut de nødvendige funksjonene og mate dem til modellen. Modellen vil spytte ut et resultat som deretter kan filtreres ytterligere, og deretter – vanligvis – iverksettes noen tiltak. Figur 5 har en oversikt over hvordan denne prosessen ser ut.

Skjema over datastrømmer fra sensorer til kjøretid og deretter til utgangFigur 5: Hvordan data strømmer fra sensorer til kjøretiden og deretter til utgangen i en tinyML-applikasjon. (Bildekilde: Beningo Embedded Group)

Programtillegget X-CUBE-AI til STM32CubeMx gir kjøretidsmiljøet til å tolke TensorFlow Lite-modellen og tilbyr alternative kjøretider og konverteringsverktøy som utviklere kan utnytte. Programtillegget (plug-in) X-CUBE-AI er ikke aktivert som standard i et prosjekt. Men etter å ha opprettet et nytt prosjekt og initialisert kortet, under Software Packs- > Select Components, er det et alternativ for å aktivere AI-utføringstiden. Det er flere alternativer her; sørg for at applikasjonsmalen brukes for dette eksemplet, som vist i figur 6.

Bilde av X-CUBE-AI-plugin må være aktivertFigur 6: Programtillegget X-CUBE-AI må aktiveres ved hjelp av programmalen for dette eksemplet. (Bildekilde: Beningo Embedded Group)

Når X-CUBE-AI er aktivert, vises en STMicroelectronics X-CUBE-AI-kategori i verktøykjeden. Ved å klikke på kategorien vil utvikleren få muligheten til å velge modellfilen de opprettet og sette modellparametrene, som vist i figur 7. En analyseknapp vil også analysere modellen og gi utviklere informasjon om RAM, rom og kjøringssyklus. Det anbefales på det sterkeste at utviklerne sammenligner Keras- og TFLite-modellalternativene. På sinusbølgemodellen, som er liten, vil det ikke være noen stor forskjell, men den er merkbar. Prosjektet kan deretter genereres ved å klikke på "Generer kode".

Bilde av RAM, ROM og utførelsessyklusinformasjon Figur 7: Analyseringsknappen vil gi utviklere informasjon om RAM, ROM og utførelsessyklus. (Bildekilde: Beningo Embedded Group)

Kodegeneratoren vil initialisere prosjektet og bygge i kjøretidsmiljøet for tinyML-modellen. Som standard er det imidlertid ingenting som mater modellen. Utviklere må legge til kode for å gi modellens inngangsverdier – x-verdier – som modellen deretter vil tolke og bruke for å generere sine y-verdier. Noen få kodebiter må legges til funksjoneneacquire_and_process_data and post_process, som vist i figur 8.

Bilde av koden som vises vil koble til falske inndatasensorverdierFigur 8: Koden som vises vil koble falske inndatasensorverdier til sinusbølgemodellen. (Bildekilde: Beningo Embedded Group)

På dette tidspunktet er eksemplet nå klart til å kjøre. Merk: legg til noen printf-meldinger for å få modellutdata for rask verifisering. En rask kompilering og distribusjon resulterer i at «Hello World»-modellen kjører. Trekking av modellutgangen for en full syklus resulterer i sinusbølgen vist i figur 9. Det er ikke perfekt, men det er utmerket for et første tinyML program. Herfra kan utviklere knytte utgangen til en pulsbreddemodulator (PWM) og generere sinusbølgen.

Bilde av «Hello World»-sinusbølge modellutgang (klikk for å forstørre)Figur 9: modellutgang med «Hello World»-sinusbølge når du kjører på STM32. (Bildekilde: Beningo Embedded Group)

Tips og triks for ML på integrerte systemer

Utviklere som ønsker å komme i gang med ML på mikrokontroller-baserte systemer vil få ganske mye å gjøre for å få sin første tinyML-applikasjon i gang. Nedenfor kan du se flere «tips og triks» som til være oppmerksomme på slik at utviklingen kan forenkles og fremskyndes, som for eksempel:

  • Gå gjennom eksemplet TensorFlow Lite for mikrokontroller «Hello World», inklusiv Google Colab-filen. Ta deg tid til å justere parametere og forstå hvordan de påvirker den opplærte modellen.
  • Bruk kvantiserte modeller for mikrokontrollerapplikasjoner. Den kvantiserte modellen komprimeres for å fungere med uint8_t, istedenfor 32-biters flytetalls-nummer. Som et resultat vil modellen bli mindre og utføre raskere.
  • Utforsk de ekstra eksemplene i TensorFlow Lite for mikrokontroller-arkivet. Andre eksempler inkluderer deteksjon av bevegelser og søkeord
  • Ta «Hello World»-eksemplet ved å koble modellutgangen til en PWM og et lavpassfilter for å se den resulterende sinusbølgen. Eksperimentér med kjøretiden for å øke og redusere sinusbølgefrekvensen.
  • Velg et utviklingskort som inkluderer «ekstra» sensorer som gjør det mulig å prøve et bredt spekter av ML-programmer.
  • Likevel om det er gøy å samle inn data, er det generelt enklere å kjøpe eller bruke en åpen kildekodedatabase for å innlæring av modellen.

Utviklere som følger disse «tips og triks»-rådene, vil kunne spare ganske mye tid og bekymring når de sikrer applikasjonen sin.

Konklusjon

ML har kommet til nettverkets inngangspunkt (network edge) og ressursbegrensede mikrokontrollerbaserte systemer er et hovedmål. De nyeste verktøyene gjør at ML-modeller kan konverteres og optimaliseres for å kjøres i sanntidssystemer. Som vist er det relativt enkelt å få en modell i drift på et STM32-utviklingskort, til tross for kompleksiteten som er involvert. Mens gjennomgangen tok for seg en enkel modell som genererer en sinusbølge, er langt mer komplekse modeller som søkeorddeteksjon mulig.

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.

Om skribenten

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.

Om denne utgiveren

DigiKeys nordamerikanske redaktører