„Hello World” gépi tanulási modell futtatása STM32 mikrovezérlőkön
Contributed By DigiKey's North American Editors
2022-08-18
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.
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:
- Adatok rögzítése
- Adatok címkézése
- A neurális hálózat betanítása
- A modell átalakítása
- 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ő.
2. á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).
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ó.
4. á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ó.
5. á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.
6. á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.
7. á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.
8. á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.
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.
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.




