„Hello World” gépi tanulási modell futtatása STM32 mikrovezérlőkön

By Jacob Beningo

Contributed By DigiKey's North American Editors

A gépi tanulás (ML) éveken keresztül óriási sláger volt a szerver- és mobilalkalmazások terén, de a hangsúly mostanra áthelyeződött, és ez a technológia a peremhálózati eszközökön vált egyre kulcsfontosságúbbá. Mivel a peremhálózati eszközöknek energiatakarékosnak kell lenniük, a fejlesztőknek tudniuk kell, hogyan lehet gépi tanulási modelleket telepíteni mikrovezérlő-alapú rendszerekre. A mikrovezérlőn futó gépi tanulási modelleket gyakran nevezik tinyML-nek. Sajnos ilyen modelleket telepíteni mikrovezérlőkre nem triviális feladat, de mégis, ennek megvalósítása egyre könnyebb, és a speciális képzéssel nem rendelkező fejlesztők is hamar felismerhetik, hogy ez kevés időráfordítással megtehető.

Ebben a cikkben azt vizsgáljuk, hogy a beágyazott rendszerek fejlesztői hogyan kezdhetik el a gépi tanulási algoritmusok használatát az STMicroelectronics gyártmányú STM32 mikrovezérlők segítségével. Ehhez bemutatjuk, hogyan hozható létre egy „Hello World” alkalmazás egy TensorFlow Lite for Microcontrollers modell átalakításával az STM32CubeIDE-ben való használatra az X-CUBE-AI segítségével.

A tinyML felhasználási lehetőségeinek bemutatása

A TinyML egy egyre növekvő terület, amely a gépi tanulás erejét juttatja el olyan erőforrás- és energiahiányos eszközökre, mint a mikrovezérlők, általában mély neurális hálózatok segítségével. A gépi tanulási modellek ezután ezek a mikrovezérlők által futtathatók, és jól hasznosíthatók a peremeken. Számos olyan felhasználási lehetőség van, ahol a tinyML ma már igen érdekesen alkalmazható.

Az első ilyen felhasználási lehetőség, amely számos mobileszközben és otthoni automatizálási berendezésben is megtalálható, a kulcsszó-felismerés. A kulcsszavak felismerése lehetővé teszi a beágyazott eszközök számára a beszéd rögzítését mikrofon segítségével, és így az előzetesen betanított kulcsszavak felismerését. A tinyML modell idősor bemeneti jelet fogad, és azt beszédjellemzőkké, általában spektrogramokká alakítja át. A spektrogram frekvenciaadatokat tartalmaz az idő függvényében. A spektrogramot ezután betáplálják egy bizonyos szavak felismerésére betanított neurális hálózatba, és az eredmény egy adott szó felismerésének valószínűsége. Az 1. ábrán látható egy példa erre a folyamatra.

Kép – a kulcsszó-felismerés egy érdekes lehetőség a tinyML használatára (kattintson a nagyításhoz)1. ábra: A kulcsszó-felismerés az egyik olyan érdekes terület, ahol a tinyML használható. A bemeneti beszédet a vezérlő spektrogrammá alakítja, majd betáplálja egy betanított neurális hálózatba annak megállapítására, hogy a bemenet bizonyos valószínűséggel azonos-e egy előzetesen betanított szóval (kép: ARM®)

Egy következő lehetőség a tinyML használatára, amely a beágyazott rendszerek fejlesztői közül sokat érdekelhet, a képfelismerés. A mikrovezérlő egy kamera segítségével rögzíti a képeket, amelyeket aztán egy előre betanított modellbe táplál. A modell képes felismerni, hogy mi van a képen, például, hogy az egy macska, kutya, hal vagy más. A képfelismerés peremhálózati alkalmazásának egyik nagyszerű példája a videós ajtócsengőknél vagy kaputelefonoknál való használata. A videós kapucsengők gyakran képesek érzékelni, ha egy ember áll az ajtóban, vagy ha csomagot hagytak ott.

A tinyML-nél egy utolsó, nagy népszerűségnek örvendő felhasználási lehetőség a prediktív karbantartásnál történő használat. A prediktív karbantartás gépi tanulás segítségével jelzi előre a berendezések állapotát, a rendellenességek felismerése, osztályozó algoritmusok és előrejelző modellek alapján. Ezen a területen is rengeteg alkalmazási lehetőség létezik, a fűtő-, szellőztető- és légkondicionálási (HVAC) rendszerektől kezdve a gyári berendezésekig.

Míg a tinyML fenti három felhasználási esete jelenleg a legnépszerűbb, a fejlesztők kétségtelenül további számos más potenciális felhasználási lehetőséget is találhatnak. Íme egy rövid lista ezekből:

  • Gesztusfelismerés
  • Anomália észlelés
  • Analóg mérőórák leolvasása
  • Irányítás és vezérlés (GNC)
  • Csomagészlelés

Függetlenül attól, hogy milyen feladatot kell megoldani, a tinyML-lel való ismerkedést legjobb egy „Hello World” alkalmazással kezdeni, amelyen keresztül a fejlesztők megtanulhatják és megérthetik azon folyamatok alapvető lépéseit, amelyeket követni kell egy minimális rendszer felállításához és beindításához. Egy tinyML-modell STM32 mikrovezérlővel történő futtatásához öt lépést kell végrehajtani:

  1. Adatok rögzítése
  2. Adatok címkézése
  3. A neurális hálózat betanítása
  4. A modell átalakítása
  5. A modell futtatása a mikrovezérlővel

„Hello World” modell – adatrögzítés, címkézés és betanítás

A fejlesztőknek általában számos lehetőségük van arra, hogyan rögzítsék és címkézzék a modelljük betanításához szükséges adatokat. Először is, rengeteg online betanítási adatbázis létezik, tehát a fejlesztők kereshetnek mások által már összegyűjtött és címkékkel ellátott adatokat. Alapvető képfelismerési feladatokhoz például ott van a CIFAR-10 vagy az ImageNet. A mosolyok fotókon való felismerésére szolgáló modell betanításához is van egy képgyűjtemény. Az online adattárak egyértelműen nagyszerű kiindulópontot jelentenek.

Ha a szükséges adatokat még nem tették nyilvánosan elérhetővé az interneten, akkor egy másik lehetőség a fejlesztők számára a saját maguk által generált adatok használata. Az adatkészletek létrehozásához használható a Matlab vagy más szoftver. Ha az automatikus adatgenerálás nem lehetséges, akkor az manuálisan is elvégezhető. Végül, ha mindez túlságosan időigényesnek tűnik, az interneten keresztül néhány megvásárolható adatkészlet is elérhető. A legizgalmasabb és legérdekesebb lehetőség gyakran az adatgyűjtés, de ugyanakkor ez jár a legtöbb munkával.

Az itt vizsgált „Hello World” példa azt mutatja be, hogyan lehet betanítani egy modellt szinuszhullám generálására, és hogyan lehet azt egy STM32-re telepíteni. A példát Pete Warden és Daniel Situnayake állította össze a Google-nál a TensorFlow Lite for Microcontrollerek számára végzett munkájuk részeként. Ez megkönnyíti az elvégzendő feladatot, mert egy egyszerű, nyilvánosan elérhető oktatóanyagot állítottak össze az adatok rögzítésére, címkézésére és a modell betanítására. A Githubon itt található; az oldalon a „Run in Google Colab” gombra kell kattintani. A Google Colab (a Google Collaboratory rövidítése) lehetővé teszi a fejlesztők számára, hogy a saját böngészőjükben tudjanak Python programokat írni és futtatni, semmilyen előzetes konfigurálás nélkül, és ingyenes hozzáférést biztosít a Google GPU-khoz.

Az oktató példa végén eredményként két különböző modellfájlt kapunk: egy mikrovezérlők számára kvantált TensorFlow modellt (model.tflite), és egy nem kvantált modellt (model_no_quant.tflite). A kvantálás mutatja, hogy a modell aktivációs függvényei és a torzításai hogyan tárolódnak numerikusan. A kvantált változat egy kisebb modellt eredményez, amely alkalmasabb egy mikrovezérlőhöz. A kíváncsi olvasók számára a betanított modellel és a tényleges szinuszhullámmal kapott eredmények a 2. ábrán láthatók. A modell kimenete piros színű. A szinuszhullám kimenet nem tökéletes, de egy „Hello World” típusú program követelményeihez elegendő.

Kép – a TensorFlow modell szerinti előrejelzések egy szinuszhullámra vonatkozólag összehasonítva a tényleges értékekkel2. ábra: A TensorFlow modell szerinti előrejelzések összehasonlítása egy szinuszhullámra vonatkozólag a tényleges értékekkel (kép: Beningo Embedded Group)

Fejlesztői kártya kiválasztása

Mielőtt megvizsgálnánk, hogyan lehet a TensorFlow-modellt átalakítani, hogy az mikrovezérlőn futhasson, ki kell választani egy mikrovezérlőt a modellhez. Ebben a cikkben az STM32 mikrovezérlőket tárgyaljuk, mivel az STMicroelectronics számos tinyML illetve gépi tanulási eszközzel rendelkezik, amelyek jól használhatók a modellek átalakítására és futtatására. Ezenkívül az STMicroelectronics széles választékot kínál a saját gépi tanulási eszközeivel kompatibilis alkatrészekből (3. ábra).

Kép – az STMicroelectronics AI fejlesztőkörnyezet táblázata (kattintson a nagyításhoz)3. ábra: A képen az STMicroelectronics AI fejlesztőkörnyezet által jelenleg támogatott mikrovezérlők és mikroprocesszor (MPU) látható (kép: STMicroelectronics)

Ha a műhelyben van valahol elfekvőben egy ilyen kártya, akkor az tökéletesen elegendő a „Hello World” alkalmazás beindításához és futtatásához. Akik azonban nem elégednek meg ezzel a példával, és szeretnének kísérletezni a gesztusvezérlés vagy a kulcsszó-felismerés területein, ehhez érdemes az STM32 B-L4S5I-IOT01A Discovery IoT Node kártyát választaniuk (4. ábra).

Ezen a kártyán az STM32L4+ sorozatra épülő Arm Cortex®-M4 processzor található. A processzor 2 Mbájt flashmemóriával és 640 Kbájt RAM-mal rendelkezik, ami bőségesen elegendő a tinyML modellek számára. A modul adaptálható a tinyML különböző felhasználási lehetőségeihez, mivel tartalmazza az STMicroelectronics MP34DT01 mikroelektromechanikai (MEMS) mikrofonját is a kulcsszó-felismerési alkalmazásfejlesztéshez. Ezenkívül, a szintén az STMicroelectronics által gyártott, kártyára integrált LIS3MDLTR háromtengelyes gyorsulásmérő a tinyML-alapú gesztusérzékeléshez használható.

Kép – az STMicroelectronics STM32 B-L4S5I-IOT01A Discovery IoT Node4. ábra: Az STM32 B-L4S5I-IOT01A Discovery IoT Node a beépített Arm Cortex-M4 processzornak, a MEMS mikrofonnak és a háromtengelyes gyorsulásmérőnek köszönhetően egy adaptálható kísérleti tinyML-platform (kép: STMicroelectronics)

A TensorFlow Lite modell átalakítása és futtatása az STM32Cube.AI segítségével

Ha a fejlesztőknek sikerült felfegyverkezniük egy tinyML modell futtatására használható fejlesztői kártyával, elkezdhetik a TensorFlow Lite modell átalakítását mikrovezérlővel futtatható programmá. A TensorFlow Lite modell közvetlenül a mikrovezérlőn is futtatható, de ehhez megfelelő végrehajtási környezetet kell biztosítani.

A modell futtatásakor végre kell hajtani egy sor funkciót. Ez a szenzoradatok összegyűjtésével, majd szűrésével, a szükséges jellemzők kinyerésével és a modellbe való betáplálásával kezdődik. A modell kiad egy eredményt, amelyet aztán tovább szűrnek, majd ezután (általában) valamilyen művelet elvégzése következik. Az 5. ábrán ennek a folyamatnak az áttekintése látható.

Kép – az érzékelőktől a végrehajtási környezetbe, majd a kimenetre történő adatáramlás5. ábra: Az adatok áramlása az érzékelőktől a végrehajtási környezetbe, majd a kimenetig egy tinyML alkalmazáson belül (kép: Beningo Embedded Group)

Az STM32CubeMx X-CUBE-AI plug-inje biztosítja a TensorFlow Lite modell értelmezéséhez szükséges végrehajtási környezetet, valamint alternatív környezeteket és konverziós eszközöket kínál, amelyeket a fejlesztők hasznosítani tudnak. Az X-CUBE-AI plug-in alapértelmezés szerint nincs engedélyezve a projektekben. Egy új projekt létrehozása és a kártya inicializálása után azonban a Software Packs-> Select Components menüpont alatt egy opción keresztül az AI végrehajtási környezet bekapcsolható. Itt több beállítási opció is van; ügyelni kell arra, hogy ehhez példához az „Application” sablont kell használni, lásd a 6. ábrát.

Kép – az X-CUBE-AI plug-int be kell kapcsolni6. ábra: Az X-CUBE-AI plug-in bekapcsolásakor az ehhez a példához való Application sablont kell beállítani (kép: Beningo Embedded Group)

Az X-CUBE-AI bekapcsolása után az eszközsorban megjelenik egy STMicroelectronics X-CUBE-AI kategória is. A kategóriára kattintva a fejlesztő kiválaszthatja az általa létrehozott modellfájlt, és beállíthatja a modell paramétereit, amint az a 7. ábrán látható. Az „Analyze” gomb segítségével a modell elemezhető, ami a fejlesztők számára a RAM-ra, a ROM-ra és a végrehajtási ciklusokra vonatkozó információkat biztosít. A fejlesztőknek erősen ajánlott összehasonlítaniuk a Keras és a TFLite modelleket. Ez a kicsi, szinuszhullám modell esetében a közöttük lévő különbség nem lesz óriási, de azért észrevehető. Ezután elvégezhető a projekt generálása a „Generate code” gomb segítségével.

Kép – a RAM-ra, a ROM-ra és a végrehajtási ciklusra vonatkozó információk7. ábra: Az Analyze gomb segítségével a fejlesztők a RAM-ra, a ROM-ra és a végrehajtási ciklusra vonatkozó információkat kapnak (kép: Beningo Embedded Group)

A kódgenerátor inicializálja a projektet, és beépíti a tinyML modell végrehajtási környezetét. Alapértelmezés szerint azonban a modell semmilyen betáplált adatokat nem kap. A fejlesztőknek kódot kell hozzáadniuk a modell bemeneti vektorának (x értékek) megadásához, amelyeket a modell értelmez, majd felhasználja a szinuszhullám kimeneti vektorának (y értékek) előállításához. A 8. ábrán látható néhány kódrészletet kell hozzáadni az acquire_and_process_data és a post_process függvényekhez.

Kép – ez a kód virtuális bemeneti érzékelők által szolgáltatott adatok betáplálására szolgál8. ábra: A bemutatott kód virtuális bemeneti érzékelők adatait rendeli hozzá a szinuszhullám modellhez (kép: Beningo Embedded Group)

Ezen a ponton a példa már készen áll a futtatásra. Megjegyezzük viszont, hogy érdemes néhány printf utasítást is hozzáadni a modell kimenetének gyors ellenőrzéséhez. Egy gyors fordítás és telepítés után a „Hello World” tinyML modell már vidáman fut is a rendszeren. A modell egy teljes ciklusra vonatkozó kimenete a 9. ábrán látható szinuszhullám, amely nem tökéletes, de egy első tinyML alkalmazásnak kiváló. Ettől kezdve a fejlesztők a kimenetet összekapcsolhatják egy impulzusszélesség-modulátorral (PWM) a szinuszhullám generálásához.

Kép – a „Hello World” szinuszhullám modell kimenete (kattintson a nagyításhoz)9. ábra: Az STM32-n futtatott „Hello World” szinuszhullám modell kimenete (kép: Beningo Embedded Group)

Tippek és trükkök a beágyazott rendszereken történő gépi tanulás használatához

Azoknak a fejlesztőknek, akik mikrovezérlő-alapú rendszereken szeretnék elkezdeni a gépi tanulás használatát, elég sok dolguk lesz ahhoz, hogy működőképessé tegyék az első tinyML-alkalmazásukat. Azonban számos „tipp és trükk” létezik, amelyeket érdemes szem előtt tartani a fejlesztések egyszerűsítéséhez és felgyorsításához:

  • Menjen végig a TensorFlow Lite for Microcontrollers „Hello World” példán, beleértve a Google Colab fájlt is. Szánjon egy kis időt a paraméterek beállítására, és tanulmányozza át, hogyan befolyásolják azok a betanított modellt.
  • Kvantált modelleket használjon mikrovezérlős alkalmazásokhoz. A kvantált modell tömörítve van, hogy 32 bites lebegőpontos számok helyett uint8_t számokkal dolgozzon. Következésképpen a modell kisebb méretű és gyorsabban végrehajtható.
  • Tanulmányozzon át további példákat a TensorFlow Lite for Microcontrollers tárolóban. Ezek között gesztusérzékelésre és kulcsszó-felismerésre való példák is találhatók.
  • Használja fel a „Hello World” példát úgy, hogy a modell kimenetét egy PWM-hez és egy aluláteresztő szűrőhöz csatlakoztatja, és nézze meg az eredményül kapott szinuszhullámot. Kísérletezzen a végrehajtási idővel a szinuszhullám frekvenciájának növelésére és csökkentésére.
  • „Extra” érzékelőket is tartalmazó fejlesztői kártyát válasszon, amelyek lehetővé teszik azt, hogy a gépi tanulási alkalmazások széles körét ki tudja próbálni.
  • Bármennyire is szórakoztató lehet az adatgyűjtés, általában egyszerűbb azokat megvásárolni vagy nyílt forráskódú adatbázist használni a modell betanításához.

Ezen „tanácsokat és trükköket” megfogadó fejlesztők sok időt megtakaríthatnak, és sokkal kevesebb keserűségben lesz részük alkalmazásuk kifejlesztése során.

Összegzés

Az gépi tanulás megérkezett a hálózatok peremére, és elsődleges fókuszaként a korlátozott erőforrásokkal rendelkező mikrovezérlő-alapú rendszereket jelölte meg. A legújabb eszközöknek köszönhetően a gépi tanulási modellek átalakíthatók és valós idejű rendszereken való futtatásra optimalizálhatók. Amint azt bemutattuk, a bonyolultság ellenére egy modell felállítása és futtatása egy STM32 fejlesztői kártyán viszonylag egyszerű. Míg tárgyként egy egyszerű, szinuszhullámot generáló modellt vizsgáltunk, ennél sokkal összetettebb modellek is lehetségesek, mint például a gesztus- és a kulcsszó-felismerés.

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