Hvis der er uklarheder i denne artikel, bedes du se den originale engelske version.

Sådan kører du en "Hello World"-maskineindlæringsmodel på STM32-mikrocontrollere

Af Jacob Beningo

Bidraget af DigiKeys nordamerikanske redaktører

Maskinlæring (ML) har i årevis været meget populært i server- og mobilapplikationer, men det er nu flyttet over og er blevet afgørende for edge-enheder. Da edge-enheder skal være energieffektive, skal udviklerne lære og forstå, hvordan man anvender ML-modeller på mikrocontroller-baserede systemer. ML-modeller, der kører på en mikrocontroller, kaldes ofte for tinyML. Desværre er det ikke en triviel opgave at installere en model på en mikrocontroller. Det bliver dog stadig nemmere, og udviklere uden specialuddannelse vil opdage, at de kan gøre det hurtigt.

Denne artikel undersøger, hvordan embeddede udviklere kan komme i gang med ML ved hjælp af STMicroelectronics' STM32-mikrocontrollere. Derfor vises det, hvordan man opretter en "Hello World"-applikation ved at konvertere en TensorFlow Lite for Microcontrollers-model til brug i STM32CubeIDE ved hjælp af X-CUBE-AI.

Introduktion til tinyML-anvendelsestilfælde

TinyML er et voksende område, der bringer kraften i ML til enheder med begrænsede ressourcer og strømforsyning som f.eks. mikrocontrollere, normalt ved hjælp af dybe neurale netværk. Disse mikrocontroller-enheder kan derefter køre ML-modellen og udføre værdifuldt arbejde på kanten. Der er flere anvendelsesområder, hvor tinyML nu er ret interessant.

Den første brugssituation, som ses i mange mobile enheder og i udstyr til automatisering af hjemmet, er at finde nøgleord. Ved hjælp af søgeordspotting kan den indbyggede enhed bruge en mikrofon til at optage tale og registrere forud indlærte søgeord. tinyML-modellen bruger et serieinput, der repræsenterer tale, og konverterer det til talegenskaber som er normalt et spektrogram. Spektrogrammet indeholder frekvensoplysninger over tid. Spektrogrammet føres derefter ind i et neuralt netværk, der er trænet til at opdage specifikke ord, og resultatet er en sandsynlighed for, at et bestemt ord er opdaget. Figur 1 viser et eksempel på, hvordan denne proces ser ud.

Billedet af søgeordspotting er et interessant anvendelsesområde for tinyML (klik for at forstørre)Figur 1: Søgeordspotting er et interessant anvendelsesområde for tinyML. Indgangstalen konverteres til et spektrogram og føres derefter ind i et trænet neuralt netværk for at afgøre, om der er et ord, der er trænet på forhånd. (Billedkilde: Arm®)

Det næste anvendelsesområde for tinyML, som mange udviklere af embeddede programmer er interesserede i, er billedgenkendelse. Mikrocontrolleren optager billeder fra et kamera, som derefter føres ind i en på forhånd trænet model. Modellen kan se, hvad der er på billedet. Man kan f.eks. være i stand til at afgøre, om der er en kat, en hund, en fisk osv. Et godt eksempel på, hvordan billedgenkendelse bruges i udkanten, er videodørklokker. Videodørklokken kan ofte registrere, om der er et menneske til stede ved døren, eller om der er blevet efterladt en pakke.

Et sidste anvendelsestilfælde med stor popularitet er brugen af tinyML til forudsigelig vedligeholdelse. Predictive maintenance bruger ML til at forudsige udstyrets tilstand baseret på registrering af abnormiteter, klassifikationsalgoritmer og forudsigelsesmodeller. Igen er der masser af anvendelsesmuligheder, lige fra HVAC-systemer til udstyr på fabriksgulvet.

Selv om de tre ovennævnte anvendelsesområder er populære for tinyML i øjeblikket, er der utvivlsomt mange potentielle anvendelsesområder, som udviklere kan finde. Her er en hurtig liste:

  • Klassificering af bevægelser
  • Påvisning af anomalier
  • Analog måleraflæser
  • Styring og kontrol (GNC)
  • Registrering af pakker

Uanset anvendelsesformålet er den bedste måde at begynde at blive fortrolig med tinyML på med et "Hello World"-program, som hjælper udviklerne med at lære og forstå den grundlæggende proces, de skal følge for at få et minimalt system op at køre. Der er fem nødvendige trin for at køre en tinyML-model på en STM32-mikrocontroller:

  1. Registrering af data
  2. Mærkedata
  3. Træn det neurale netværk
  4. Konverter modellen
  5. Kør modellen på mikrocontrolleren

Registrering, mærkning og træning af en "Hello World"-model

Udviklerne har generelt mange muligheder for at opsamle og mærke de data, der er nødvendige for at træne deres model. For det første findes der mange online træningsdatabaser. Udviklere kan søge efter data, som andre har indsamlet og mærket. For eksempel er der CIFAR-10 eller ImageNet til grundlæggende billeddetektion. Der er også en billedsamling til at træne en model til at registrere smil i fotos. Online datalagre er helt klart et godt sted at starte.

Hvis de nødvendige data ikke allerede er offentligt tilgængelige på internettet, er en anden mulighed for udviklerne at generere deres egne data. Matlab eller et andet værktøj kan bruges til at generere datasættene. Hvis automatisk datagenerering ikke er en mulighed, kan det gøres manuelt. Hvis alt dette synes at være for tidskrævende, kan du endelig købe nogle datasæt, også på internettet. Indsamling af data er ofte den mest spændende og interessante løsning, men det er også den mest arbejdskrævende.

Eksemplet "Hello World", der undersøges her, viser, hvordan man træner en model til at generere en sinuskurve og implementerer den på en STM32. Eksemplet er udarbejdet af Pete Warden og Daniel Situnayake som led i deres arbejde hos Google på TensorFlow Lite for Microcontrollers. Det gør arbejdet nemmere, fordi de har udarbejdet en enkel, offentlig vejledning i at registrere, mærke og træne modellen. Den kan findes på Github her; når du er der, skal udviklere klikke på knappen "Run in Google Colab". Google Colab, som er en forkortelse for Google Collaboratory, giver udviklere mulighed for at skrive og udføre Python i deres browser uden nogen form for konfiguration og giver gratis adgang til Google GPU'er.

Resultatet af gennemgangen af træningseksemplet vil omfatte to forskellige modelfiler; en model.tflite TensorFlow-model, der er kvantiseret til mikrocontrollere, og en model_no_quant.tflite-model, der ikke er kvantiseret. Kvantiseringen angiver, hvordan modelaktiveringer og bias lagres numerisk. Den kvantiserede version giver en mindre model, som er mere egnet til en mikrocontroller. For de nysgerrige læsere kan de trænede modelresultater sammenlignet med de faktiske sinusbølgeresultater ses i figur 2. Modellens output er angivet med rødt. Sinusbølgeudgangen er ikke perfekt, men den fungerer godt nok til et "Hello World"-program.

Graf af TensorFlow-modellens forudsigelser for en sinusbølge i forhold til de faktiske værdierFigur 2: En sammenligning mellem TensorFlow-modellens forudsigelser for en sinusbølge og de faktiske værdier. (Billedkilde: Beningo Embedded Group)

Valg af et udviklingskort

Før vi ser på, hvordan TensorFlow-modellen konverteres til at køre på en mikrocontroller, skal der vælges en mikrocontroller til brug i modellen. Denne artikel vil fokusere på STM32-mikrocontrollere, fordi STMicroelectronics har mange tinyML/ML-værktøjer, der fungerer godt til konvertering og kørsel af modeller. Desuden har STMicroelectronics et bredt udvalg af dele, der er kompatible med deres ML-værktøjer (figur 3).

Tabel over STMicroelectronics AI-økosystem (klik for at forstørre)Figur 3: Her ses de mikrocontrollere og mikroprocessorenheder (MPU'er), der i øjeblikket understøttes af STMicroelectronics AI-økosystem. (Billedkilde: STMicroelectronics)

Hvis der ligger et af disse kort rundt omkring på kontoret, er det perfekt til at få programmet "Hello World" op at køre. Men hvis du er interesseret i at gå videre end dette eksempel og gå ind i gestikstyring eller søgeordspotting, skal du vælge STM32 B-L4S5I-IOT01A Discovery IoT Node (Figur 4).

Dette kort har en Arm Cortex®-M4-processor baseret på STM32L4+-serien. Processoren har 2 megabyte (Mbytes) flash-hukommelse og 640 kilobyte (Kbytes) RAM, hvilket giver masser af plads til småML-modeller. Modulet kan tilpasses til forsøg med tinyML-brugstilfælde, fordi det også har STMicroelectronics' MP34DT01-mikroelektromekaniske systemer (MEMS) mikrofon, der kan bruges til udvikling af nøgleordssporing. Desuden kan det indbyggede treakse-accelerometer LIS3MDLTR, også fra STMicroelectronics, bruges til tinyML-baseret gestusdetektion.

Billede af STMicroelectronics STM32 B-L4S5I-IOT01A Discovery IoT NodeFigur 4: STM32 B-L4S5I-IOT01A Discovery IoT Node er en fleksibel eksperimenteringsplatform til tinyML på grund af den indbyggede Arm Cortex-M4-processor, MEMS-mikrofon og treakset accelerometer. (Billedkilde: STMicroelectronics)

Konvertering og kørsel af TensorFlow Lite-modellen ved hjælp af STM32Cube.AI

Bevæbnet med et udviklingskort, der kan bruges til at køre tinyML-modellen, kan udviklerne nu begynde at konvertere TensorFlow Lite-modellen til noget, der kan køre på mikrocontrolleren. TensorFlow Lite-modellen kan køre direkte på mikrocontrolleren, men den har brug for et runtime-miljø til at behandle den.

Når modellen køres, skal der udføres en række funktioner. Disse funktioner starter med at indsamle sensordata, filtrere dem, udtrække de nødvendige funktioner og sende dem til modellen. Modellen vil give et resultat, som derefter kan filtreres yderligere, og derefter - som regel - træffes der en eller anden foranstaltning. Figur 5 giver et overblik over, hvordan denne proces ser ud.

Diagram over datastrømme fra sensorer til runtime og derefter til outputFigur 5: Hvordan data strømmer fra sensorer til runtime og derefter til output i en tinyML-applikation. (Billedkilde: Beningo Embedded Group)

X-CUBE-AI-plug-in'et til STM32CubeMx giver et køretidsmiljø til at fortolke TensorFlow Lite-modellen og tilbyder alternative køretider og konverteringsværktøjer, som udviklere kan udnytte. X-CUBE-AI plug-in'et er ikke aktiveret som standard i et projekt. Men efter at have oprettet et nyt projekt og initialiseret kortet er der under Software Packs> Select Components en mulighed for at aktivere AI runtime under Software Packs-> Select Components. Der er flere muligheder her; sørg for, at skabelonen Application anvendes i dette eksempel, som vist i Figur 6.

Billedet af X-CUBE-AI plug-in skal være aktiveretFigur 6: X-CUBE-AI plug-in'en skal aktiveres ved hjælp af ansøgningsskabelonen for dette eksempel. (Billedkilde: Beningo Embedded Group)

Når X-CUBE-AI er aktiveret, vises en STMicroelectronics X-CUBE-AI-kategori i værktøjskæden. Ved at klikke på kategorien får udvikleren mulighed for at vælge den modelfil, som han har oprettet, og indstille modelparametrene, som vist i figur 7. En analyseknap analyserer også modellen og giver udviklerne oplysninger om RAM, ROM og eksekveringscyklus. Det anbefales kraftigt, at udviklere sammenligner Keras- og TFLite-modellerne. På sinusbølgemodellen, som er lille, vil der ikke være en stor forskel, men den er mærkbar. Projektet kan derefter genereres ved at klikke på "Generate code" (generér kode).

Billede af RAM, ROM og oplysninger om udførelsescyklusFigur 7: Knappen analyze giver udviklere oplysninger om RAM, ROM og eksekveringscyklus. (Billedkilde: Beningo Embedded Group)

Kodegeneratoren initialiserer projektet og opbygger kørselstidsmiljøet for tinyML-modellen. Som standard tilføres modellen dog ikke noget til modellen. Udviklerne skal tilføje kode for at angive modellens inputværdier-x-værdier, som modellen derefter fortolker og bruger til at generere sinus-y-værdierne. Der skal tilføjes et par stykker kode til funktionerne acquire_and_process_data og post_process, som vist i figur 8.

Billede af den viste kode vil forbinde falske input sensorværdierFigur 8: Den viste kode forbinder falske input-sensorværdier med sinusmodellen. (Billedkilde: Beningo Embedded Group)

På dette tidspunkt er eksemplet nu klar til at køre. Bemærk: Tilføj nogle printf-meddelelser for at få modeloutput til hurtig kontrol. En hurtig kompilering og implementering resulterer i, at tinyML-modellen "Hello World" kører. Ved at trække modeludgangen i en hel cyklus fås den sinuskurve, der er vist i figur 9. Den er ikke perfekt, men den er fremragende til en første tinyML-applikation. Herfra kan udviklerne binde udgangen til en pulsbreddemodulator (PWM) og generere sinusbølgen.

Billede af output af "Hello World"-sinusbølgemodellen (klik for at forstørre)Figur 9: Output af sinusmodellen "Hello World", når den kører på STM32. (Billedkilde: Beningo Embedded Group)

Tips og tricks til ML på embeddede systemer

Udviklere, der ønsker at komme i gang med ML på mikrocontroller-baserede systemer, vil have en hel del at se til for at få deres første tinyML-applikation op at køre. Der er dog flere "tips og tricks", som kan forenkle og fremskynde udviklingen af dem:

  • Gennemgang af TensorFlow Lite for microcontrollers "Hello World"-eksemplet, herunder Google Colab-filen. Brug lidt tid på at justere parametre og forstå, hvordan de påvirker den trænede model.
  • Brug kvantiserede modeller til mikrocontroller-applikationer. Den kvantiserede model er komprimeret til at arbejde med uint8_t i stedet for 32-bit glidende tal. Som følge heraf bliver modellen mindre og hurtigere at udføre.
  • Udforsk de yderligere eksempler i TensorFlow Lite for Microcontrollers-repositoriet. Andre eksempler omfatter registrering af bevægelser og nøgleord.
  • Tag eksemplet "Hello World" ved at forbinde modeludgangen med en PWM og et lavpasfilter for at se den resulterende sinusbølge. Eksperimentér med køretiden for at øge og sænke sinusfrekvensen.
  • Vælg et udviklingskort, der indeholder "ekstra" sensorer, som gør det muligt at afprøve en lang række ML-applikationer.
  • Selv om det kan være sjovt at indsamle data, er det generelt nemmere at købe eller bruge en open source-database til at træne modellen.

Udviklere, der følger disse "tips og tricks", vil spare en hel del tid og besvær, når de skal sikre deres applikation.

Konklusion

ML er kommet til netværkskanten, og ressourcebegrænsede mikrocontroller-baserede systemer er et oplagt mål. De nyeste værktøjer gør det muligt at konvertere og optimere ML-modeller til at køre på realtidssystemer. Som det fremgår, er det relativt nemt at få en model op og køre på et STM32-udviklingskort på trods af den kompleksitet, der er involveret. I diskussionen blev en simpel model, der genererer en sinuskurve, undersøgt, men der er mulighed for langt mere komplekse modeller som f.eks. gestedetektering og nøgleordspotting.

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 denne forfatter

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 udgiveren

DigiKeys nordamerikanske redaktører