Miten suorittaa “Hello World” -koneoppimismalli STM32-mikrokontrollereilla
Julkaisija DigiKeyn kirjoittajat Pohjois-Amerikassa
2022-08-18
Koneoppiminen (ML) on ollut muotia palvelin- ja mobiilisovelluksissa jo vuosien ajan, mutta nyt siitä on tullut kriittinen osa reunalaitteita. Koska reunalaitteiden on oltava energiatehokkaita, kehittäjien on opittava ja ymmärrettävä miten ML-malleja voidaan käyttää mikrokontrolleripohjaisissa järjestelmissä. Mikrokontrollerissa käytettäviä ML-malleja kutsutaan usein nimellä tinyML. Valitettavasti mallin käyttö mikrokontrollerissa ei ole aivan yksinkertaista. Se on kuitenkin käymässä yhä helpommaksi, ja sellaisetkin kehittäjät, joilla ei ole alan erikoiskoulutusta, voivat alkaa käyttämään sitä nopeasti.
Tässä artikkelissa tarkastellaan sitä, miten sulautettujen järjestelmien kehittäjät voivat aloittaa ML-teknologian käytön STMicroelectronicsin STM32-mikrokontrollereissa. Artikkeli auttaa tässä näyttämällä miten luoda "Hello World" -sovellus muuntamalla TensorFlow Lite for Microcontrollers -malli STM32CubeIDE-ympäristöön käyttäen X-CUBE-AI-ohjelmistoa.
Johdatus tinyML-käyttötapauksiin
TinyML on kasvava kenttä, joka tuo ML:n tehon mikrokontrollereiden kaltaisiin resurssi- ja tehorajoitteisiin laitteisiin. Yleensä siinä käytetään syviä neuroverkkoja. Nämä mikrokontrollerilaitteet voivat sitten käyttää ML-mallia ja suorittaa tärkeää työtä reunalla. On useita käyttötapauksia, joissa tinyML on nyt varsin mielenkiintoinen.
Ensimmäinen käyttötapaus, jota käytetään monissa mobiililaitteissa ja kodin automaatiolaitteissa, on avainsanojen tunnistaminen. Avainsanojen tunnistamisessa sulautettu laite käyttää mikrofonia puheen äänittämiseen ja ennalta koulutettujen avainsanojen tunnistamiseen. TinyML-malli käyttää tulona puhetta edustavaa aikasarjaa ja muuntaa sen puheominaisuuksiksi, yleensä spektrogrammiksi. Spektrogrammi sisältää taajuusinformaation ajan funktiona. Tämän jälkeen spektrogrammi syötetään neuroverkkoon, joka on koulutettu tunnistamaan tiettyjä sanoja. Neuroverkko antaa tuloksena todennäköisyyden sille, että se tunnistaa tietyn sanan. Kuvassa 1 on esimerkki siitä, miltä tämä prosessi näyttää.
Kuva 1: Avainsanojen tunnistaminen on mielenkiintoinen tinyML-käyttötapaus. Äänitetty puhe muunnetaan spektrogrammiksi ja syötetään sitten koulutettuun neuroverkkoon, joka määrittää, sisältääkö se ennalta koulutetun sanan. (Kuvan lähde: Arm®)
Seuraava tinyML-käyttötapaus, josta monet sulautettujen järjestelmien kehittäjät ovat kiinnostuneita, on kuvantunnistus. Mikrokontrolleri ottaa kamerasta kuvia, jotka syötetään valmiiksi koulutettuun malliin. Malli pystyy tunnistamaan mitä kuvassa on. Malli voi esimerkiksi päätellä onko kuvassa kissa, koira, kala ja niin edelleen. Video-ovikellot ovat hyvä esimerkki siitä, miten kuvantunnistusta käytetään reunalla. Video-ovikello voi usein havaita, onko ovella ihminen tai onko sinne jätetty paketti.
Vielä yksi erittäin suosittu käyttötapaus on tinyML:n käyttö ennakoivassa kunnossapidossa. Ennakoivassa kunnossapidossa käytetään ML-teknologiaa laitteen tilan arvioimiseen ja poikkeavuuksien havaitsemisen luokittelualgoritmien ja ennakoivien mallien perusteella. Tähänkin on runsaasti sovelluksia aina LVI-järjestelmistä tehdasympäristössä käytettäviin laitteisiin.
Vaikka edellä mainitut kolme ovat tällä hetkellä suosittuja tinyML-käyttötapauksia, kehittäjät voivat epäilemättä löytää niitä paljon lisää. Tässä on lyhyt luettelo:
- eleiden luokittelu
 - poikkeavuuksien havaitseminen
 - analogisen mittarin lukija
 - GNC (Guidance and control)
 - pakettien tunnistaminen.
 
Käyttötapauksesta riippumatta paras tapa aloittaa tinyML:ään tutustuminen on "Hello World" -sovellus, joka auttaa kehittäjiä oppimaan ja ymmärtämään perusprosessin, jota noudattamalla minimaalinen järjestelmä saadaan toimimaan. TinyML-mallin suorittaminen STM32-mikrokontrollerilla vaatii viisi vaihetta:
- datan kerääminen
 - datan nimiöinti
 - neuroverkon kouluttaminen
 - mallin muuntaminen
 - mallin suorittaminen mikrokontrollerilla.
 
"Hello World" -mallin kerääminen, nimiöinti ja koulutus
Kehittäjillä on yleensä monia vaihtoehtoja miten kerätä ja nimiöidä mallin kouluttamisessa tarvittava data. Ensinnäkin verkossa on paljon koulutustietokantoja. Kehittäjät voivat etsiä dataa, jonka joku on jo kerännyt ja nimiöinyt. Esimerkiksi perustason kuvantunnistuksessa voidaan käyttää palveluita CIFAR-10 tai ImageNet. Jos haluat kouluttaa mallin tunnistamaan hymyileekö kukaan valokuvassa, myös sitä varten on olemassa kuvakokoelma. Verkkotietovarastot ovat selvästi hyvä paikka aloittaa.
Jos tarvittavaa dataa ei ole vielä julkisesti saatavilla Internetissä, vaihtoehtona on, että kehittäjät generoivat itse tarvitsemansa datan. Matlabia ja eräitä muita työkaluja voidaan käyttää datajoukkojen luomiseen. Jos automaattinen tietojen generointi ei ole mahdollista, se voidaan tehdä manuaalisesti. Jos tämä kaikki tuntuu vievän liikaa aikaa, Internetistä voi myös ostaa datajoukkoja. Datan kerääminen on usein jännittävin ja kiinnostavin vaihtoehto, mutta se on myös työläin.
Tässä tutkittavassa "Hello World" -esimerkissä näytetään, miten malli koulutetaan generoimaan siniaaltoa ja miten sitä käytetään STM32:ssa. Esimerkin ovat koonneet Pete Warden ja Daniel Situnayake ja se oli osa heidän työtään Googlen TensorFlow Lite for Microcontrollers -ohjelman parissa. Tämä helpottaa tehtävää, koska he ovat koonneet yksinkertaisen julkisen opetusohjelman, johon sisältyy mallin kerääminen, nimiöinti ja kouluttaminen. Ohjelma löytyy Githubista tästä; kun linkki on avattu, kehittäjien tulee klikata painiketta "Run in Google Colab". Google Colab on lyhenne sanoista Google Collaboratory, ja sen avulla kehittäjät voivat kirjoittaa ja suorittaa Python-koodia selaimessaan ilman konfiguroimista ja työkalu myös tarjoaa vapaan pääsyn Googlen GPU-yksiköiden käyttöön.
Koulutusesimerkin läpikäynti tuottaa kaksi erilaista mallitiedostoa; model.tflite TensorFlow-mallin, joka on kvantisoitu mikrokontrollereja varten, sekä model_no_quant.tflite-mallin, jota ei ole kvantisoitu. Kvantisointi kertoo miten mallin aktivoinnit ja biasointi tallennetaan numeerisesti. Kvantisoitu versio johtaa pienempään malliin, joka sopii paremmin mikrokontrollerille. Uteliaat lukijat voivat vertailla koulutetun mallin tuloksia ja todellista siniaaltoa kuvassa 2. Mallin tulos esitetään punaisella. Siniaaltolähtö ei ole täydellinen, mutta se toimii riittävän hyvin "Hello World" -ohjelmaa varten.
Kuva 2: Vertailu TensorFlow-mallin approksimoiman siniaallon ja oikean siniaallon kesken. (Kuvan lähde: Beningo Embedded Group)
Kehitysalustan valinta
Ennen kuin tarkastelemme sitä miten TensorFlow-malli muunnetaan toimimaan mikrokontrollerilla, mallin suorittamista varten on valittava mikrokontrolleri. Tässä artikkelissa keskitymme STM32-mikrokontrollereihin, koska STMicroelectronics tarjoaa monia tinyML/ML-työkaluja, jotka sopivat hyvin mallien muuntamiseen ja suorittamiseen. Lisäksi STMicroelectronicsilla on laaja valikoima ML-työkalujen kanssa yhteensopivia osia (kuva 3).
Kuva 3: Kuvassa esitetään STMicroelectronics AI -ekosysteemin tällä hetkellä tukemat mikrokontrollerit ja mikroprosessoriyksiköt (MPU). (Kuvan lähde: STMicroelectronics)
Jos toimistossasi sattuu lojumaan yksi tällainen kortti, se sopii täydellisesti "Hello World" -sovelluksen rakentamiseen ja suorittamiseen. Jos kuitenkin et halua rajoittua kyseiseen esimerkkiin vaan haluat alkaa käyttämään eleohjausta tai avainsanojen tunnistusta, kannattaa valita STM32 B-L4S5I-IOT01A Discovery IoT Node (kuva 4).
Tämä kortti sisältää STM32L4+ -sarjaan perustuvan Arm Cortex®-M4 -prosessorin. Prosessorissa on 2 megatavua flash-muistia ja 640 kilotavua RAM-muistia, mikä riittää reilusti tinyML-malleille. Moduulia voidaan käyttää kokeiltaessa erilaisia tinyML-käyttötapauksia, koska se sisältää myös STMicroelectronicsin MP34DT01-MEMS-mikrofonin, jota voidaan käyttää kehitettäessä avainsanojen tunnistamissovelluksia. Lisäksi kortilla olevaa STMicroelectronicsin kolmiakselista kiihtyvyysmittaria LIS3MDLTR voidaan käyttää tinyML-pohjaiseen eleiden tunnistukseen.
Kuva 4: STM32 B-L4S5I-IOT01A Discovery IoT Node on muokattava kokeilualusta tinyML-teknologiaa varten ja se sisältää Arm Cortex-M4 -prosessorin, MEMS-mikrofonin sekä kolmiakselisen kiihtyvyysmittarin. (Kuvan lähde: STMicroelectronics)
TensorFlow Lite -mallin muuntaminen ja suorittaminen STM32Cube.AI-ohjelman avulla
Nyt kun kehittäjillä on kehitysalusta, jolla voidaan suorittaa tinyML-mallia, he voivat muuntaa TensorFlow Lite -mallin sellaiseksi, että sitä voidaan käyttää mikrokontrollerilla. TensorFlow Lite -mallia voidaan käyttää suoraan mikrokontrollerissa, mutta sen käsittelyyn tarvitaan ajoympäristö.
Kun mallia suoritetaan, on suoritettava eräitä toimintoja. Nämä toiminnot alkavat anturidatan keräämisestä, joka sen jälkeen suodatetaan ja josta poimitaan tarvittavat ominaisuudet, jotka sen jälkeen syötetään malliin. Malli antaa tuloksen, jota voidaan edelleen suodattaa, minkä jälkeen - yleensä - ryhdytään toimenpiteisiin. Kuva 5 tarjoaa yleiskuvan siitä, miltä tämä prosessi näyttää
Kuva 5: Miten data kulkee tinyML-sovelluksessa antureilta ajoympäristöön ja sen jälkeen ulostuloon. (Kuvan lähde: Beningo Embedded Group)
X-CUBE-AI on STM32CubeMx-ympäristön lisäosa, joka tarjoaa ajoympäristön TensorFlow Lite -mallin tulkitsemiseksi. Se tarjoaa myös muita ajoympäristöjä sekä muunnostyökaluja kehittäjien hyödyksi. Projektit eivät oletusarvoisesti käytä X-CUBE-AI-lisäosaa. Sen jälkeen kun uusi projekti on luotu ja kortti on alustettu, valikosta Software Packs-> Select Components voidaan kuitenkin valita vaihtoehto, joka ottaa käyttöön AI-ajoympäristön. Tämä tarjoaa useita vaihtoehtoja; tässä esimerkissä käytetään kuitenkin Sovellus-mallia, kuten kuvassa 6 näytetään.
Kuva 6: Tässä esimerkissä on käytettävä sovellusmallia ja X-CUBE-AI-lisäosaa. (Kuvan lähde: Beningo Embedded Group)
Kun X-CUBE-AI on otettu käyttöön, työkaluketjuun ilmestyy STMicroelectronics X-CUBE-AI -luokka. Klikkaamalla luokkaa kehittäjä voi valita luomansa mallitiedoston ja asettaa mallin parametrit kuvassa 7 näytetyllä tavalla. Analyze-painike analysoi mallin ja antaa kehittäjille RAM- ja ROM-muistia sekä suoritussykliä koskevia tietoja. On erittäin suositeltavaa, että kehittäjät vertailevat Kerasin ja TFLiten mallivaihtoehtoja. Siniaaltomalli-esimerkki on pieni, ja siinä ero ei ole valtava, mutta ero on kyllä havaittavissa. Tämän jälkeen projekti voidaan generoida klikkaamalla "Generate code".
Kuva 7: Analyze-painike antaa kehittäjille RAM- ja ROM-muistia sekä suoritussykliä koskevia tietoja. (Kuvan lähde: Beningo Embedded Group)
Koodigeneraattori alustaa projektin ja rakentaa tinyML-mallin ajoympäristön. Oletusarvoisesti mallissa ei kuitenkaan ole tuloja. Kehittäjien on lisättävä koodi, joka antaa mallille tuloarvot - x-arvot - joita malli sitten tulkitsee ja joiden perusteella se sitten generoi siniaallon y-arvot. Funktioihin acquire_and_process_data ja post_process on lisättävä muutama koodinpätkä, kuten kuvassa 8 on esitetty.
Kuva 8: Näytetty koodi yhdistää simuloidut tuloanturin arvot siniaaltomalliin. (Kuvan lähde: Beningo Embedded Group)
Tässä vaiheessa esimerkki on nyt valmis suoritettavaksi. Huomaa: Lisää mallin lähtöön printf-lauseita, jotka helpottavat virheenkorjausta. Nopean kääntämisen ja laitteeseen siirron jälkeen "Hello World" tinyML-malli on valmis suoritettavaksi laitteella. Kuvassa 9 esitetty siniaaltoa esittävä mallin ulostulo koko syklin ajalta. Se ei ole täydellinen, mutta se on erittäin hyvä ensimmäiseksi tinyML-sovellukseksi. Tämän jälkeen kehittäjät voivat yhdistää lähdön pulssinleveysmodulaattoriin (PWM) ja generoida siniaallon.
Kuva 9: “Hello World” -siniaaltomallin lähtö suoritettaessa STM32-alustalla. (Kuvan lähde: Beningo Embedded Group)
Vinkkejä ja niksejä ML:n käyttöön sulautetuissa järjestelmissä
Kehittäjät, jotka haluavat aloittaa ML-teknologian käytön mikrokontrolleripohjaisissa järjestelmissä, joutuvat tekemään melko paljon työtä saadakseen ensimmäisen tinyML-sovelluksensa toimimaan. On kuitenkin erilaisia "vinkkejä ja niksejä", jotka voivat yksinkertaistaa ja nopeuttaa niiden kehittämistä:
- Käy läpi TensorFlow Lite for microcontrollers “Hello World” -esimerkki, mukaan lukien Google Colab -tiedosto. Käytä aikaa parametrien säätämiseen ja yritä ymmärtää miten ne vaikuttavat koulutettuun malliin.
 - Käytä malleja, jotka on kvantisoitu mikrokontrollerisovelluksia varten. Kvantisoitu malli on kompressoitu ja käyttää uint8_t-tyyppisiä liukulukuja 32-bittisten sijaan. Tämän seurauksena mallista tulee pienempi ja se toimii nopeammin.
 - Tutustu myös muihin TensorFlow Lite for Microcontrollers -repositorion esimerkkeihin. Muita esimerkkejä ovat muun muassa eleiden ja avainsanojen tunnistus.
 - Yhdistä “Hello World” -esimerkkimallin lähtö PWM-modulaatioon ja alipäästösuodattimeen niin voit nähdä generoidun siniaallon. Kokeile suoritusympäristössä siniaallon taajuuden kasvattamista ja vähentämistä.
 - Valitse kehitysalusta, joka tarjoaa erilaisia antureita ja helpottaa erilaisten ML-sovellusten kokeilemista.
 - Niin hauskaa kuin tietojen kerääminen voikin olla, on yleensä helpompaa ostaa tai käyttää avoimen lähdekoodin tietokantaa mallin kouluttamiseen.
 
Kehittäjät, jotka noudattavat näitä ”vinkkejä ja niksejä”, huomaavat säästävänsä melkoisesti aikaa ja vaivaa sovelluksensa parissa.
Yhteenveto
ML on saapunut verkon reunoille ja sen ensisijaisena kohteena ovat resurssirajoitteiset mikrokontrolleripohjaiset järjestelmät. Uusimmat työkalut mahdollistavat ML-mallien muuntamisen ja optimoinnin reaaliaikaisia järjestelmiä varten. Kuten artikkelissa osoitetaan, mallin käyttöönotto STM32-kehitysalustalla on suhteellisen helppoa, vaikka siinä on kompleksisiakin tekijöitä. Vaikka keskustelussa tarkasteltiinkin yksinkertaista siniaaltoa tuottavaa mallia, myös paljon monimutkaisemmat mallit, kuten eleiden tunnistaminen ja avainsanojen havaitseminen, ovat mahdollisia.
            
        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.




