Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
Edellisen Sipeed MaiX Boards -levyn kuvien tunnistusta käsittelevän artikkelin jatkoksi päätin kirjoittaa uuden opetusohjelman, joka keskittyy objektien havaitsemiseen. Kendryte K210 -sirun kanssa ilmestyi äskettäin mielenkiintoisia laitteita, mukaan lukien Seeed AI Hat for Edge Computing, M5 -pinon M5StickV ja DFRobotin HuskyLens (vaikka sillä on oma laiteohjelmisto ja se on suunnattu aloittelijoille). Halvan hinnan vuoksi Kendryte K210 on vetänyt ihmisiä, jotka haluavat lisätä tietokonenäköä projekteihinsa. Mutta kuten tavallisesti kiinalaisilla laitteistotuotteilla, tekninen tuki puuttuu, ja tätä yritän parantaa artikkeleillani ja videoillani. Muista kuitenkin, että en ole Kendryte- tai Sipeed -kehittäjien tiimissä enkä voi vastata kaikkiin tuotteeseen liittyviin kysymyksiin.
Tämä mielessä, aloitetaan! Aloitamme lyhyellä (ja yksinkertaistetulla) yleiskatsauksella objektien tunnistuksen CNN -mallien toimintaan.
PÄIVITTÄMINEN TOUKOKUU 2020: Koska artikkelini ja videoni Objektien havaitsemisesta K210-levyillä ovat edelleen erittäin suosittuja ja YouTuben ja Googlen huipputulosten joukossa, päätin päivittää artikkelin sisältämään tiedot aXeleRate, Keras-pohjaisesta AI-kehyksestä Edge I kehittyy. aXeleRate perustuu pohjimmiltaan kokoelmaan skriptejä, joita käytin kuvantunnistus-/objektin havaitsemismallien kouluttamiseen - yhdistettynä yhdeksi kehykseksi ja optimoitu Google Colabin työnkulkua varten. Se on kätevämpi käyttää ja ajan tasalla.
Artikkelin vanha versio näkyy edelleen osoitteessa steemit.com.
Vaihe 1: Kohteen tunnistusmalliarkkitehtuuri selitetty
Kuvan tunnistusmallit (tai kuvien luokittelumallit) käyttävät koko kuvaa panoksena ja tuottavat luettelon todennäköisyyksistä jokaiselle luokalle, jonka yritämme tunnistaa. On erittäin hyödyllistä, jos kiinnostunut kohde vie suuren osan kuvasta emmekä välitä paljon sen sijainnista. Mutta entä jos projektimme (esimerkiksi kasvojenseurantakamera) edellyttää meiltä paitsi tietämystä kuvassa olevan kohteen tyypistä myös sen koordinaateista. Entä projekti, joka edellyttää useiden kohteiden havaitsemista (esimerkiksi laskemista varten)?
Tässä on, kun objektien tunnistusmallit ovat käteviä. Tässä artikkelissa käytämme YOLO (katsot vain kerran) -arkkitehtuuria ja keskitymme selitykseen tämän arkkitehtuurin sisäiseen mekaniikkaan.
Yritämme selvittää, mitä esineitä kuvassa on ja mitkä ovat niiden koordinaatit. Koska koneoppiminen ei ole taikuutta eikä "ajatteleva kone", vaan vain algoritmi, joka käyttää tilastoja toiminnon (hermoverkko) optimoimiseen tietyn ongelman ratkaisemiseksi paremmin. Meidän on muotoiltava tämä ongelma, jotta se olisi "optimoitavampi". Naiivi lähestymistapa olisi saada algoritmi minimoimaan menetys (ero) sen ennusteen ja kohteen oikeiden koordinaattien välillä. Se toimisi melko hyvin, kunhan kuvassa on vain yksi esine. Useiden kohteiden kohdalla lähestymistapa on erilainen - lisäämme ruudukon ja panemme verkon ennustamaan objektin (tai poissaolon) läsnäolon (tai poissaolon) kussakin ruudukossa. Kuulostaa hienolta, mutta jättää silti liikaa epävarmuutta verkolle - miten ennuste tuotetaan ja mitä tehdä, kun ruudukon solun sisällä on useita kohteita? Meidän on lisättävä yksi rajoitus - niin sanotut ankkurit. Ankkurit ovat alkuperäisiä kokoja (leveys, korkeus), joista osa (lähimpänä objektin kokoa) muutetaan objektikokoon - käyttämällä joitain hermoverkon ulostuloja (lopullinen ominaisuuskartta).
Tässä on siis ylätason näkymä siitä, mitä tapahtuu, kun YOLO-arkkitehtuurin hermoverkko havaitsee kuvan. Ominaisuuksien poimintaverkoston havaitsemien ominaisuuksien mukaan jokaiselle ruudukkosolulle tehdään ennustejoukko, joka sisältää ankkurien siirtymän, ankkuritodennäköisyyden ja ankkuriluokan. Sitten hylkäämme ennusteet pienellä todennäköisyydellä ja voila!
Vaihe 2: Valmistele ympäristö
aXeleRate perustuu penny4860, SVHN yolo-v2-numeronilmaisimen hienoon projektiin. aXeleRate vie tämän Kerasin YOLO -ilmaisimen toteutuksen seuraavalle tasolle ja käyttää kätevää kokoonpanojärjestelmää harjoittaakseen ja muuntaakseen kuvantunnistus-/objektitunnistus- ja kuvien segmentointiverkkoja erilaisilla taustajärjestelmillä.
Voit käyttää aXeleRatea kahdella tavalla: käynnissä paikallisesti Ubuntu -koneella tai Google Colabissa. Jos haluat käyttää Google Colabia, katso tämä esimerkki:
PASCAL-VOC Object Detection Colab -muistikirja
Mallin kouluttaminen paikallisesti ja sen vieminen käytettäväksi laitteistokiihdytyksen kanssa on myös paljon helpompaa. Suosittelen asentamaan kaikki tarvittavat riippuvuudet Anaconda -ympäristöön, jotta projektisi pysyy erillään muista ja vältetään konflikteja.
Lataa asennusohjelma täältä.
Kun asennus on valmis, luo uusi ympäristö:
conda create -n yolo python = 3.7
Aktivoidaan uusi ympäristö
conda aktivoi yolo
Etuliite ennen bash -kuorta tulee näkyviin ympäristön nimen kanssa, mikä osoittaa, että työskentelet nyt kyseisessä ympäristössä.
Asenna aXeleRate paikalliselle koneellesi
pip install git+https://github.com/AIWintermuteAI/aXeleRate
Suorita sitten tämä ladataksesi komentosarjat, joita tarvitset koulutukseen ja päätelmiin:
git -klooni
Voit suorittaa pikatestejä testien_training.py avulla aXeleRate -kansiossa. Se suorittaa koulutusta ja päätelmiä kullekin mallityypille, tallentaa ja muuntaa koulutetut mallit. Koska se on vain viiden aikakauden koulutus ja tietojoukko on hyvin pieni, et voi saada hyödyllisiä malleja, mutta tämä skripti on tarkoitettu vain virheiden puuttumisen tarkistamiseen.
Vaihe 3: Koulujen havaitsemismallin kouluttaminen Kerasin avulla
Nyt voimme suorittaa harjoitusskriptin asetustiedoston kanssa. Koska YOLO -objektinilmaisimen Keras -toteutus on melko monimutkainen, selitän sen sijaan, että selitän kaikki asiaankuuluvat koodit, mutta selitän, miten koulutus määritetään, ja kuvailen myös asiaankuuluvia moduuleja, jos haluat tehdä niihin muutoksia itse.
Aloitetaan leluesimerkillä ja koulutetaan pesukarhuilmaisinta. /Config -kansion sisällä on määritystiedosto raccoon_detector.json. Valitsemme arkkitehtuuriksi MobileNet7_5 (jossa 7_5 on alkuperäisen Mobilenet -toteutuksen alfa -parametri, ohjaa verkon leveyttä) ja 224x224 tulon kooksi. Katsotaanpa konfiguraation tärkeimpiä parametreja:
Tyyppi on mallin käyttöliittymä - luokittelija, ilmaisin tai segnet
- Full Yolo - Pieni Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Lisätietoja ankkureista on täällä:
Tunnisteet ovat tietojoukossasi olevia tarroja. TÄRKEÄÄ: Luettele kaikki tietojoukossa olevat tarrat.
object_scale määrittää, kuinka paljon rangaistaan kohteen ennustajien luottamuksen virheellisestä ennustamisesta
no_object_scale määrittää, kuinka paljon rangaistaan muiden kuin esineiden ennustajien virheellisestä luottamusennusteesta
coord_scale määrittää, kuinka paljon rangaista väärästä sijainnista ja koon ennusteista (x, y, w, h)
class_scale määrittää, kuinka paljon rangaista väärää luokan ennustamista
augumentation - kuvan lisäys, koon muuttaminen, siirtäminen ja sumentaminen, jotta estetään liiallinen sovittaminen ja saadaan monipuolisempaa tietoaineistoa.
train_times, validation_times - kuinka monta kertaa tietojoukko toistetaan. Hyödyllinen, jos sinulla on lisäys
käytössä
first_trainable_layer - voit jäädyttää tietyt kerrokset, jos käytät esikoulutettua ominaisuusverkkoa
Nyt meidän on ladattava tietojoukko, jonka jaoin Google Drivellani (alkuperäinen tietojoukko), joka on pesukarjan havaintotiedosto, joka sisältää 150 huomautettua kuvaa.
Muista muuttaa asetustiedoston rivejä (juna_kuvan_kansio, juna_en_kansio) vastaavasti ja aloita sitten koulutus seuraavalla komennolla:
python axelerate/train.py -c configs/raccoon_detector.json
train.py lukee kokoonpanon.json -tiedostosta ja kouluttaa mallin komentosarjalla axelerate/networks/yolo/yolo_frontend.py. yolo/backend/loss.py on se, missä mukautettu häviötoiminto toteutetaan ja yolo/backend/network.py on malli, jossa malli luodaan (tulo-, ominaisuuserotin- ja tunnistuskerrokset). axelerate/networks/common_utils/fit.py on skripti, joka toteuttaa koulutusprosessin ja axelerate/networks/common_utils/feature.py sisältää ominaisuuksien poimijat. Jos aiot käyttää koulutettua mallia, jossa on K210 -siru ja Micropython -laiteohjelmisto, voit valita muistin rajoitusten vuoksi MobileNetin (2_5, 5_0 ja 7_5) ja TinyYolon, mutta olen havainnut, että MobileNet antaa paremman tunnistustarkkuuden.
Koska se on leluesimerkki ja sisältää vain 150 kuvaa pesukarhuista, koulutusprosessin pitäisi olla melko nopea, jopa ilman GPU: ta, vaikka tarkkuus on kaukana loistavasta. Työhön liittyvässä projektissa olen kouluttanut liikennemerkkien ilmaisimen ja numeroilmaisimen, molemmissa tietojoukoissa oli yli muutama tuhat harjoitusesimerkkiä.
Vaihe 4: Muunna se.kmodel -muotoon
AXeleRate -mallin muunnos suoritetaan automaattisesti - tämä on luultavasti suurin ero harjoitusskriptien vanhaan versioon! Lisäksi saat mallitiedostot ja harjoituskaavion siististi projektikansioon. Huomasin myös, että vaihtoehtotarkkuus ei joskus anna arvioita mallin todellisesta suorituskyvystä objektien havaitsemiseksi, ja siksi lisäsin mAP: n objektihavaitsemismallien validointimittariksi. Voit lukea lisää mAP: sta täältä.
Jos mAP, keskimääräinen tarkkuus (validointimittarimme) ei parane 20 aikakaudella, koulutus keskeytyy ennenaikaisesti. Aina kun mAP paranee, malli tallennetaan projektikansioon. Harjoituksen päätyttyä aXeleRate muuntaa automaattisesti parhaan mallin tiettyyn muotoon - voit valita "tflite", "k210" tai "edgetpu".
Nyt viimeiseen vaiheeseen, käytämme malliamme todella Sipeed -laitteistolla!
Vaihe 5: Käytä Micropython -laiteohjelmistoa
On mahdollista tehdä johtopäätöksiä C -koodilla varustetulla objektihavaitsemismallilla, mutta mukavuuden vuoksi käytämme sen sijaan Micropython -laiteohjelmistoa ja MaixPy IDE: tä.
Lataa MaixPy IDE täältä ja micropython -laiteohjelmisto täältä. Voit polttaa laiteohjelmiston käyttämällä python -skriptiä kflash.py tai ladata erillisen GUI -flash -työkalun täältä.
Kopioi model.kmodel SD -kortin juureen ja aseta SD -kortti Sipeed Maix Bitiin (tai muuhun K210 -laitteeseen). Vaihtoehtoisesti voit polttaa.kmodel -laitteen laitteen flash -muistiin. Esimerkkiskriptini lukee.kmodel flash -muistista. Jos käytät SD -korttia, muuta tämä rivi
tehtävä = kpu.load (0x200000)
kohteeseen
tehtävä = kpu.load ("/sd/model.kmodel")
Avaa MaixPy IDE ja paina yhdistämispainiketta. Avaa raccoon_detector.py -komentosarja example_scripts/k210/detector -kansiosta ja paina Käynnistä -painiketta. Sinun pitäisi nähdä suora lähetys kamerasta, jossa on rajoittavat laatikot … No, pesukarhu. Voit parantaa mallin tarkkuutta tarjoamalla lisää harjoitusesimerkkejä, mutta muista, että se on keiju pieni malli (1,9 M) ja sillä on vaikeuksia havaita pieniä esineitä (alhaisen resoluution vuoksi).
Yksi kysymyksistä, jotka sain kommentteihin edelliseen kuvantunnistusta käsittelevään artikkeliini, on se, miten havaintotulokset lähetetään UART/I2C -yhteyden kautta toiselle Sipeed -kehityskortille liitetylle laitteelle. Github -arkistostani löydät toisen esimerkkiskriptin, raccoon_detector_uart.py, joka (arvasit sen) havaitsee pesukarhuja ja lähettää rajauslaatikoiden koordinaatit UART: n yli. Muista, että UART -viestintään käytetyt nastat ovat erilaisia eri levyillä, joten sinun on tarkistettava itsesi dokumentaatiosta.
Vaihe 6: Yhteenveto
Kendryte K210 on vankka siru tietokoneen näkemiseen, joustava, vaikkakin muistia on rajoitetusti. Toistaiseksi opetusohjelmissamme olemme käsitelleet sen käyttöä mukautettujen objektien tunnistamiseen, mukautettujen objektien havaitsemiseen ja joidenkin OpenMV -pohjaisten tietokonenäkötehtävien suorittamiseen. Tiedän tosiaan, että se soveltuu myös kasvojentunnistukseen, ja pienellä näpyttelyllä pitäisi olla mahdollista tehdä asentojen havaitseminen ja kuvien segmentointi (voit käyttää aXeleRatea semanttisen segmentointimallin kouluttamiseen, mutta en vielä ottanut käyttöön päätelmää K210: llä). Voit vapaasti katsoa aXeleRate -arkiston ongelmia ja tehdä PR: n, jos uskot, että sinulla on joitain parannuksia!
Tässä on joitain artikkeleita, joita käytin tämän opetusohjelman kirjoittamisessa. Katso, jos haluat lisätietoja objektien havaitsemisesta hermoverkkojen avulla:
Rajauslaatikon esineiden ilmaisimet: YOLOn ymmärtäminen, katso vain kerran
YOLON ymmärtäminen (lisää matematiikkaa)
Hellävarainen opas siitä, miten YOLO -objektien lokalisointi toimii Kerasin kanssa (osa 2)
Reaaliaikainen objektien tunnistus YOLO: n, YOLOv2: n ja nyt YOLOv3: n avulla
Toivottavasti voit käyttää nykyistä tietämystäsi rakentaaksesi mahtavia projekteja konenäön avulla! Voit ostaa Sipeed -levyjä täältä, ne ovat halvimpia vaihtoehtoja ML: lle sulautetuissa järjestelmissä.
Lisää minut LinkedIniin, jos sinulla on kysyttävää, ja tilaa YouTube -kanavani, niin saat ilmoituksen mielenkiintoisimmista koneoppimista ja robotiikkaa koskevista projekteista.