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