EdgeAI na preprost način – Raziskovanje razvrščanja slik z Arduino Portenta, Edge Impulse in OpenMV
V tem članku je predstavljena razvojna plošča Arduino Portenta [1], ki vsebuje dva procesorja, ki lahko vzporedno izvajata naloge. Portenta lahko učinkovito izvaja procese, ustvarjene s programom TensorFlow™ Lite. Eno od jeder na primer sproti izračunava algoritem računalniškega vida (inferenca), drugo jedro pa vodi operacije na nizki ravni, kot je krmiljenje motorja in komuniciranje ali delovanje kot uporabniški vmesnik.
Vgrajeni brezžični modul omogoča hkratno WiFi in Bluetooth® povezljivost.
Dve paralelni jedri
Osrednji procesor H7 je dvojedrni procesor STM32H747 [2], vključno s procesorjem Cortex® M7, ki deluje pri 480 MHz, in procesorjem Cortex® M4, ki deluje pri 240 MHz. Jedri komunicirata prek mehanizma za oddaljeni klic postopkov, ki brez težav omogoča klicanje funkcij na drugem procesorju. Oba procesorja si delita vse periferne naprave na čipu in lahko poganjata:
- Arduino skice na vrhu operacijskega sistema Arm® Mbed™ OS
- Nativne aplikacije Mbed™
- MicroPython / JavaScript prek tolmača
- TensorFlow™ Lite
Ta vsebina je samo za naročnike
Pomnilne enote
Pomnilnik je ključnega pomena za ugnezdene projekte strojnega učenja. Plošča Portenta H7 lahko gosti do 64 MB pomnilnika SDRAM in 128 MB pomnilnika QSPI Flash. V mojem primeru je na plošči 8 MB SDRAM in 16 MB Flash QSPI. Vendar je treba upoštevati, da je MCU SRAM tisti, ki se uporablja za sklepanje o strojnem učenju; ta je za STM32H747 le 1 MB. Ta MCU ima vgrajenih tudi 2 MB FLASH, predvsem za shranjevanje kode.
Razširitvena plošča za vid
Naši plošči Portenta bomo dodali Vision Shield za uporabo v aplikacijah za vid, ki prinaša funkcije primerne za industrijo, kot so Ethernet (ali LoRa), kamera in mikrofoni.
Plošča za vid ima naslednje lastnosti:
Kamera: HM-01B0 z ločljivostjo 320 x 320 aktivnih slikovnih pik s podporo za QVGA.
Mikrofon: 2 x MP34DT05, izjemno kompakten, nizkoenergijski, vsesmerni, digitalni MEMS mikrofon s kapacitivnim zaznavnim elementom in IC vmesnikom.
Namestitev in testiranje
Povežite ploščo (USB-C) z računalnikom.
Nadalje v Arduino IDE namestite jedro operacijskega sistema Mbed za plošče Portenta.
Ko imate odprt IDE, pojdite v Orodja > Board > Board Manager in v iskalnem oknu poiščite Portenta, slika 4.
Nato pojdite na Tools > Board > Arduino Mbed OS Portenta Boards in izberite Arduino Portenta H7, slika 5.
Ko je plošča priključena na USB, se mora prikazati Portenta na portu, slika 6.
Odprite skico Blink na Examples/Basic in jo zaženite z gumbom IDE Upload. Vgrajena LED dioda (zelena) mora pričeti utripati.
Testiranje mikrofona
Po priključitvi plošče za vid začnimo s testiranjem mikrofonov:
V Arduino IDE pojdite na Examples > PDM > PDM > SerialPlotter in odprite skico. Pomagalo bi, če bi spremenili nekatere parametre, da bi uporabljali knjižnico PDM.h, slika 8.
Odprite risalnik in si oglejte prikaz zvoka iz obeh mikrofonov (levega in desnega), slika 9.
Spreminjajte frekvenco zvoka, ki ga ustvarjate, in preverite, ali mikrofoni delujejo pravilno, slika 10.
Testiranje kamere
Preizkusimo lahko tudi kamero, na primer s kodo, ki je na voljo v razdelku Examples > Camera > CamaraMotionDetect. Slike seveda ne morete videti, lahko pa dokažete vsaj to, da kamera zaznava spremembe svetlobe.
Ko to skico naložite v aplikacijo Portenta, lahko vidite utripanje modre LED RGB, kadar koli nekaj premaknete pred kamero. Prav tako lahko vidite, da se v serijskem monitorju prikaže napis “Motion Detected!“.
Lahko bi zajeli in videli tudi neobdelane podatke, vendar je najboljši preizkus s kamero, ko zajema sliko. Za to bomo uporabili še en IDE, OpenMV.
Namestitev IDE OpenMV
OpenMV IDE je najboljše integrirano razvojno okolje za uporabo z OpenMV kamerami, ki je na Portentu. Vsebuje zmogljiv urejevalnik besedila, terminal za odpravljanje napak in pregledovalnik izravnalnega polja s prikazom histograma. Za programiranje kamere bomo uporabili program MicroPython.
Obiščite stran OpenMV IDE [2], prenesite ustrezno različico za svoj operacijski sistem in sledite navodilom za namestitev v računalnik.
IDE se mora odpreti in privzeto prikazati kodo helloworld_1.py na svojem območju kode (angl. Code Area). Med izvajanjem bodo vsa sporočila, poslana prek serijske povezave (z uporabo funkcije print() ali sporočila o napakah), prikazana na serijskem terminalu. Ko imamo priključeno Portenta+Vision_Shield, bo slika, ki jo je zajela njena kamera, prikazana na območju Camera ViewerArea (ali Frame Buffer) in na območju Histogram, takoj pod pregledovalnikom kamere.
Upoštevajte, da lahko izberete več barvnih prostorov. Za delo s fotoaparatom Portenta moramo izbrati Grayscale.
Preden Portento povežete z OpenMV, se prepričajte, da imate najnovejšo različico zagonskega nalagalnika. V ta namen pojdite v Arduino IDE in odprite skico na: STM_32H747_System > STM_32H747_updateBootloader, slika 13 in 14.
Po posodobitvi zagonskega nalagalnika postavite Portenta ploščo v način zagonskega nalagalnika tako, da dvakrat pritisnete gumb za ponastavitev na plošči. Vgrajena zelena LED-ica se bo začela počasi prižigati in ugašati. Sedaj se vrnite v OpenMV IDE in kliknite ikono connect (leva orodna vrstica).
V pojavnem oknu boste videli, da je bila odkrita plošča v načinu DFU, in boste vprašani, kako želite nadaljevati. Najprej izberite “Install the latest release firmware“. S tem dejanjem bo na Portenta H7 ploščo nameščena najnovejša ugnezdena programska oprema OpenMV. Možnost brisanja notranjega datotečnega sistema lahko pustite neizbrano in kliknite “V redu“.
Zelena LED-ica na Portenta H7 plošči bo začela utripati, medtem ko se na ploščo nalaga ugnezdena programska oprema OpenMV. Nato se bo odprlo okno terminala, ki vam bo pokazalo napredek nalaganja kode, slika 16.
Počakajte, da se zelena LED-ica preneha prižigati in ugašati. Ko se postopek konča, se prikaže sporočilo “DFU firmware update complete!“.
Ko je naprava Portenta H7 uspešno povezana, se v orodni vrstici prikaže zelena tipka za predvajanje.
Ko kliknete zeleno tipko za predvajanje, bo Micropython (hellowolrd.py) skripta v območju Code Area naložena in zagnana na Portentu. V pregledovalniku na kameri se bo začel predvajati videoposnetek. Serijski monitor nam bo prikazal FPS (število sličic na sekundo), ki naj bi bilo več kot 60 sličic na sekundo, kar je super!
Kodo lahko razdelimo na dva dela:
Nastavitev: Kamor se uvozijo in inicializirajo knjižnice in spremenljivke.
Loop: del kode, ki se izvaja neprekinjeno. Tu je zajeta img spremenljivka (kader).
Vsak od teh kadrov se lahko uporabi za sklepanje v aplikacijah za strojno učenje.
Za prekinitev izvajanja programa pritisnite rdeči gumb [X].
Zaznavanje oseb z uporabo programa TensorFlow
Zdaj, ko smo preizkusili našo kamero in ustrezno namestili OpenMV IDE ter zagnali našo Portenta ploščo, preizkusimo MicroPython TensorFlow ogrodje s klasičnim primerom globokega učenja in vizualnim zaznavanjem oseb.
V meniju OpenMV pojdite na Primeri > Arduino > Portenta H7 > Machine Learning in odprite skripto tf_person_detection_search_whole_window.py, slika 20.
Upoštevajte, da je uvožena tudi knjižnica tf (TensorFlow). Modul tf lahko izvaja kvantizirane TensorFlow Lite modele.
Med inicializacijo moramo poleg nastavitve velikosti kadra kamere na QVGA določiti tudi velikost slikovnega okna, ki se uporablja za sklepanje.
Izbrana je velikost 240 x 240, ker je ML model uporabil to obliko kot vhodni tenzor.
Zdaj naložimo vgrajeni model za zaznavanje oseb (mreža) in njegove oznake, slika 22.
While Loop
Img bo uporabljen kot vhodni podatek modela.
V našem primeru net.classify() požene omrežje na celotni sliki, vendar vedno ustvari seznam rezultatov. Ko torej obdelujemo samo eno okno, ima obj samo eno komponento. V celotni kodi bomo zaradi preprostosti uporabili, slika 27.
Slika 28, rezultat pomeni, da je bil za celotno okno “x“:0, “y“:0, “w“:240, “h“:240 ustvarjen izhodni vektor ocene klasifikacije kot “output“:[0.257813, 0.742188]. Ta izhod pomeni, da ima indeks 0 (“no_person“) vrednost 0,26 in indeks 1 (“person“) vrednost 0,74, kar pomeni, da mora biti slika (img) oseba.
Čarovnija strojnega učenja je končana! Zdaj je treba opraviti le še naknadno obdelavo, in sicer zapisati oznake in njihove ocene na serijski terminal, slika 29 in napišite oznako z najvišjim številom točk na levi zgornji rob slike tukaj, slika 30.
Tukaj je celotna poenostavljena koda (lahko jo “kopirate/prilepite“ v OpenMV IDE, slika 31. Upoštevajte, da se sklepanje zgodi približno 18-krat na sekundo, kar je zelo dobro za aplikacije v realnem času. Pri samostojnem izvajanju, ločeno od IDE OpenMV, je število FPS še višje.
Zaključek
Arduino Portenta je zelo prilagodljiv in enostaven za programiranje. Ta projekt je pokazal potencial TinyML, njegovi splošni rezultati pa so ga uporabili v resničnih aplikacijah. Model, ki je bil uporabljen za transferno učenje, ni tinyML in je deloval pravilno (MobileNet V2 z α=0,35), kar kaže, da je Portenta primerna za vizualne aplikacije. Poleg tega njegova kamera porabi zelo malo energije, kar pomeni, da jo lahko uporabljamo neprekinjeno. Pri obeh namestitvah (C/C++ in MicroPython) je sklepanje modela trajalo 120 ms (Arduino IDE) oziroma 140 ms (OpenMV IDE). IDE (Edge Impulse Studio predvideva približno 104 ms). Moj naslednji projekt s Portento bo raziskal združevanje senzorjev (kamera + mikrofon) in zaznavanje predmetov. Upam, da bo ta projekt pomagal tudi drugim pri iskanju poti v razburljivem svetu umetne inteligence in elektronike!
Povzeto po:
https://mjrobot.org/2022/03/18/mug-or-not-mug-that-is-the-question/#more-14422
Viri:
https://docs.arduino.cc/hardware/portenta-h7
https://openmv.io/pages/download
http://helloworld.py/
Slike vir:
https://mjrobot.org/
https://mjrobot.org