OpenMV-kameran avulla voit aloittaa helposti konenäön käytön esineiden tunnistamiseen

Kirjoittaja Jacob Beningo

Julkaisija DigiKeyn kirjoittajat Pohjois-Amerikassa

Sulautettujen järjestelmien parissa on kiireellinen tarve soveltaa koneoppimista (machine learning, ML) esineiden tunnistamiseen ja luokitteluun. Tämä koskee erityisesti esineiden internetiä (IoT), tietoturvaa, edistyneitä ajoavustusjärjestelmiä (ADAS) sekä teollisuusautomaatiojärjestelmiä. Esineiden tunnistaminen on kuitenkin monimutkainen aihe ja koneoppiminen on suhteellisen uusi teknologia, joten sovellusten kehittäminen esineiden tunnistamiseen voi olla vaikeaa.

Aiemmin esineiden tunnistamista varten on esimerkiksi vaadittu, että kehittäjät opettelevat OpenCV:n kaltaisen kehitysympäristön ja ostavat tuhansien dollarien arvosta tietokonelaitteistoa. Näin perinteiset lähestymistavat esineiden tunnistamiseen ja konenäköön ovat sekä aikaa vieviä että kalliita.

Pythonilla ohjelmoitava SparkFun Electronicsin OpenMV H7 -kameramoduuli on innovatiivinen ratkaisu, kun halutaan koneoppimiseen pohjautuvaa esineiden tunnistamista ja konenäköä ilman merkittävää koneoppimisen asiantuntemusta tai huomattavan kalliita laitteistoja. Moduuli on suunniteltu edulliseksi Arduinon tyyppiseksi moduuliksi, jota voi käyttää kuvien käsittelyyn ja tunnistamiseen. Tämä moduulin ja ohjelmiston muodostama ekosysteemi tarjoaa ainutlaatuisen ja kiinnostavan ratkaisun, jolla voidaan toteuttaa esineiden tunnistus ja luokittelu koneoppimisen avulla käyttäen edullista moduulia.

Tässä artikkelissa esitellään OpenMV H7 -kameramoduuli ja näytetään, miten kehittäjät voivat aloittaa koneoppimisen käytön esineiden tunnistamiseen käyttäen konenäön CIFAR-10-datajoukkoa.

OpenMV H7 -kameramoduuli

Runsaasti ominaisuuksia sisältävien ohjelmakirjastojensa ansiosta OpenMV H7 -kameramoduuli tarjoaa runsaasti apua koneoppimissovelluksen kehittäjälle. Kehittäjät voivat käyttää OpenMV-kameraa esimerkiksi kasvojen ja silmien tunnistamiseen ja jopa pupillien tarkkaan seurantaan. Sillä voidaan luoda blobeja eli merkkejä, jotka seuraavat tiettyä väriä. Käytettävissä on esimerkkejä myös siitä, miten koneoppimisen avulla voidaan tunnistaa ja seurata haluttuja objekteja.

OpenMV H7 -kameramoduuli on yksittäinen integroitu kehityskortti, joka sisältää kaikki koneoppimispohjaiseen esineiden tunnistamiseen tarvittavat laitteistokomponentit, ja sen hinta on kertaluokkia pienempi kuin perinteisten konenäköjärjestelmien. Suhteellisen pieni, vain 1,4 x 1,75 tuuman kokoinen moduuli sisältää seuraavat komponentit:

  • tehokas mikrokontrolleri
  • integroitu kameramoduuli jonka voi vaihtaa
  • akkuliitin
  • micro-USB-liitin
  • kolmivärinen LED
  • microSD-korttipaikka (tukee enintään 64 gigatavun kortteja)
  • laajennusväylän tulo ja lähtö (I/O).

Kuva SparkFun Electronicsin OpenMV H7 -kameramoduulistaKuva 1: OpenMV H7 -kameramoduuliin on integroitu kaikki komponentit, joita tarvitaan koneoppimiseen perustuvan konenäkösovelluksen nopeaan kehittämiseen ja käyttöönottoon. (Kuvan lähde: SparkFun Electronics)

Laajennus-I/O:n kautta kehittäjät saavat käyttöönsä useita mikrokontrollerin lisäominaisuuksia (kuva 2). Näitä ominaisuuksia ovat muun muassa viestintärajapinnat, kuten seuraavat:

  • UART
  • SPI
  • I2C
  • CAN.

Laajennus-I/O sisältää myös ohjaus- ja datakanavat servojen ohjaukseen, signaalien generointiin digitaali-analogimuuntimen (DAC) kautta sekä anturien arvojen lukemiseen analogi-digitaalimuuntimen (ADC) kautta. Nämä laajennus-I/O:t tekevät OpenMV-moduulista erittäin kiinnostavan näkösovelluksiin kotiautomaatiossa, robottien ohjauksessa, teollisuusautomaatiossa sekä esineiden tunnistamisessa ja tilojen seurannassa.

Taulukko SparkFunin OpenMV H7 -kameramoduulin pinnikonfiguraatioistaKuva 2: OpenMV H7 -kameramoduulissa on runsaasti laajennettavia I/O-pinnejä. Näitä pinnejä voidaan käyttää ohjaamaan servomoottoreita tai näytteenottoantureita tai siirtämään tietoa Wi-Fi-moduulin kanssa IoT-laitteen luomiseksi. (Kuvan lähde: SparkFun)

Kortin mikrokontrolleri on STMicroelectronicsin STM32F765VIT6, johon sisältyy Arm Cortex-M7-suoritin 100-pinnisessä LQFP-pakkauksessa. Suoritin toimii 216 megahertsin (MHz) taajuudella, ja sillä on 2 megatavua (Mt) Flash-muistia sekä 512 kilotavua (kt) RAM-muistia. Suoritin on erittäin tehokas ja sopii hyvin konenäkösovelluksiin kaksinkertaisen tarkkuuden liukulukuyksikön (FPU) ja täyden DSP-käskykannan ansiosta. Mikrokontrolleri sisältää myös laitteistopohjaisen JPEG-enkooderin, joka voi nopeuttaa kuvantamissovelluksia. STM32F765VIT6:n yleinen lohkokaavio esitetään kuvassa 3.

Kaavio: STMicroelectronics STM32F765VIT sisältää 2 Mt Flash-muistia ja 512 kt RAM-muistiaKuva 3: STM32F765VIT sisältää 2 Mt Flash-muistia ja 512 kt RAM-muistia sekä oheislaitteita, kuten laitteistopohjaisen JPEG-koodauksen ja DSP-käskyt, joiden ansiosta se sopii täydellisesti konenäkösovelluksiin. (Kuvan lähde: STMicroelectronics)

OpenMV H7 -kameramoduuli on sikäli ainutlaatuinen, että se tukee monia erilaisia kameramoduuleita. Jos kehittäjä ei esimerkiksi halua käyttää sisäänrakennettua kameraa, jonka tarkkuus on 640 × 480 kuvapistettä, sen tilalle voi vaihtaa ON Semiconductorin MT9V034-kuva-anturia tukevan moduulin. MT9V034 on 1/3 tuumaa leveä CMOS active-pixel -tekniikkaan pohjautuva VGA-formaatin digitaalikuva-anturi, joka sisältää globaalin sulkimen sekä HDR-tilan (korkea dynamiikka, high dynamic range). Anturin tarkkuus on 752 × 480 kuvapistettä, ja se on suunniteltu toimimaan laajalla lämpötila-alueella -30 – +70 ˚C. ON Semiconductor tarjoaa kyseiselle kuva-anturille MT9V034C12STCH-GEVB-kehitysalustan (kuva 4).

Kuva ON Semiconductorin MT9V034C12STCH-GEVB-kehitysalustastaKuva 4: MT9V034C12STCH-GEVB on kehitysalusta MT9V034-kuva-anturille ja se sisältää valmiin linssin, mikä nopeuttaa kehitystä ja testausta. (Kuvan lähde: ON Semiconductor)

Ensimmäisen esineentunnistussovelluksen kehittäminen

OpenMV H7 -kameramoduulin sovelluskehitys tehdään käyttäen OpenMV IDE -ympäristöä, joka tarjoaa Python-rajapinnan sovelluksen kehittämiseen (kuva 5). Pythonin myötä tarve matalan tason ohjelmointikielen osaamiselle poistuu. Paitsi, että komentosarjat kirjoitetaan Pythonilla, myös itse OpenMV H7 -kameramoduuli pyörii MicroPythonilla. Näin kehittäjät saavat käyttöönsä erinomaisen helpon tavan aloittaa konenäkösovellusten kirjoittaminen ja koneoppimisen päättelyketjujen suorittaminen.

Kuva OpenMV IDE:n Python-pohjaisesta käyttöliittymästä (suurenna klikkaamalla)Kuva 5: OpenMV IDE tarjoaa Python-pohjaisen käyttöliittymän, jolla OpenMV H7 -kameramoduulille voidaan kirjoittaa sovelluksia. Sovellus lähetetään tämän jälkeen komentosarjana kameramoduulille, joka ajaa MicroPythonia. (Kuvan lähde: Beningo Embedded Group)

Perusasennuksen tehtyään kehittäjät ajavat yleensä hello_world.py-komentosarjan, joka sisältää listauksen 1 mukaisen koodin. Python-komentosarja näyttää kehittäjälle, miten OpenMV:n kamera otetaan käyttöön ja kuinka sillä otetaan jatkuvasti kuvia. Näin saadaan käyttöön live-videota ja voidaan mitata päivitysnopeus. Tietokoneeseen yhdistettynä päivitysnopeus voi vaihdella 25 ruudusta sekunnissa (fps) aina noin 60 fps:ään. Sovellus ajetaan yksinkertaisesti yhdistämällä OpenMV-kamera OpenMV IDE:en käyttäen näytön vasemmassa alakulmassa olevaa yhdistämispainiketta ja klikkaamalla sitten vihreää suorituspainiketta.

Kopioi
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!
 
import sensor, image, time
 
sensor.reset()                      # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000)     # Wait for settings take effect.
clock = time.clock()                # Create a clock object to track the FPS.
 
while(True):
    clock.tick()                    # Update the FPS clock.
    img = sensor.snapshot()         # Take a picture and return the image.
    print(clock.fps())              # Note: OpenMV Cam runs about half as fast when connected
                                                                        # to the IDE. The FPS should increase once disconnected.

Listaus 1: OpenMV IDE:n hello_world.py-sovellus käyttää OpenMV-kameramoduulin live-videota. (Koodin lähde: OpenMV)

Koneoppimisverkko on koulutettava ensimmäistä esineiden tunnistamis- ja luokitustestiä varten käyttämällä haluttuja esineiden tunnistusluokkia. CIFAR-10-datajoukkoa käytetään yleisesti kouluttamaan esineiden tunnistusmalleja ja kokeilemaan mallin toimintaa. CIFAR-10 koostuu 60 000 kuvasta. Kuvat ovat 32 x 32 kuvapisteen värikuvia seuraavista kymmenestä eri luokasta:

  • lentokone
  • auto
  • lintu
  • kissa
  • peura
  • koira
  • sammakko
  • hevonen
  • laiva
  • kuorma-auto.

Tässä artikkelissa ei ole mahdollista kuvata prosessia, jolla malli muunnetaan päättelyketjuksi, joka voidaan suorittaa OpenMV-kamerassa. Mallin kehitystä ei kuitenkaan tarvitse käydä läpi, jotta CIFAR-10:llä koulutettua verkkoa voitaisiin käyttää: OpenMV IDE sisältää valmiiksi CIFAR-10:llä koulutetun mallin, joka tarvitsee vain ladata kameraan.

Voit käyttää mallia yhdistämällä OpenMV-kameran tietokoneeseen ja OpenMV IDE:en. Klikkaa OpenMV IDE:ssä tools -> machine learning -> CNN Network Library (työkalut -> koneoppiminen -> CNN-verkkokirjasto). Näyttöön avautuu ikkuna, jossa näytetään OpenMV:n qtcreator-mallikansio. Valittavana on kaksi vaihtoehtoa:

  • cmsisnn
  • tensorflow.

Siirry cmsisnn:n alla cifar10-kansioon ja klikkaa tiedostoa cifar10.network ja sitten painiketta open. Tämän jälkeen avautuu toinen ikkuna. Tässä ikkunassa koulutettu verkkotiedosto tallennetaan OpenMV-kameraan. Käyttäjä voi tallentaa verkon valitsemalla kamerassa näkyvän tallennusvälineen.

Kun verkko on tallennettu, lataa CIFAR-10-koneoppimisesimerkki kohdasta File (Tiedosto) -> Examples (Esimerkit) -> 25-Machine-Learning -> nn_cifar10_search_whole_window.py. Tämä lataa alla näkyvän esimerkkikomentosarjan (listaus 2).

Kopioi
# CIFAR-10 Search Whole Window Example
#
# CIFAR is a convolutional neural network designed to classify its field of view into several
# different object types and works on RGB video data.
#
# In this example we slide the LeNet detector window over the image and get a list of activations
# where there might be an object. Note that use a CNN with a sliding window is extremely compute
# expensive so for an exhaustive search do not expect the CNN to be real-time.
 
import sensor, image, time, os, nn
 
sensor.reset()                         # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565)    # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)      # Set frame size to QVGA (320x240)
sensor.set_windowing((128, 128))       # Set 128x128 window.
sensor.skip_frames(time=750)           # Don't let autogain run very long.
sensor.set_auto_gain(False)            # Turn off autogain.
sensor.set_auto_exposure(False)        # Turn off whitebalance.
 
# Load cifar10 network (You can get the network from OpenMV IDE).
net = nn.load('/cifar10.network')
# Faster, smaller and less accurate.
# net = nn.load('/cifar10_fast.network')
labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
 
clock = time.clock()
while(True):
    clock.tick()
 
    img = sensor.snapshot()
 
    # net.search() will search an roi in the image for the network (or the whole image if the roi is not
    # specified). At each location to look in the image if one of the classifier outputs is larger than
    # threshold the location and label will be stored in an object list and returned. At each scale the
    # detection window is moved around in the ROI using x_overlap (0-1) and y_overlap (0-1) as a guide.
    # If you set the overlap to 0.5 then each detection window will overlap the previous one by 50%. Note
    # the computational work load goes WAY up the more overlap. Finally, for mult-scale matching after
    # sliding the network around in the x/y dimensions the detection window will shrink by scale_mul (0-1)
    # down to min_scale (0-1). For example, if scale_mul is 0.5 the detection window will shrink by 50%.
    # Note that at a lower scale there's even more area to search if x_overlap and y_overlap are small...
    # contrast_threshold skips running the CNN in areas that are flat.
 
    for obj in net.search(img, threshold=0.6, min_scale=0.5, scale_mul=0.5, \
            x_overlap=0.5, y_overlap=0.5, contrast_threshold=0.5):
        print("Detected %s - Confidence %f%%" % (labels[obj.index()], obj.value()))
        img.draw_rectangle(obj.rect(), color=(255, 0, 0))
    print(clock.fps())

Listaus 2: OpenMV IDE:n nn_cifar10_search_whole_window.py-esimerkkisovellusta käytetään luokittelemaan kuvia ja antamaan luokitukselle luotettavuustaso. (Koodin lähde: OpenMV)

Koesovellus voidaan suorittaa samoin kuin hello_world.py-komentosarja: yhdistä OpenMV IDE moduuliin klikkaamalla vasemman alakulman yhdistämiskuvaketta ja klikkaa sitten suorita. Tällöin kamera suorittaa komentosarjan ja yrittää luokitella näkemänsä kuvat. Pääteikkunaan tulostuu, onko kuva luokiteltu vai ei ja mikä sen luotettavuustaso on.

Tässä vaiheessa kehittäjän tarvitsee vain näyttää kameralle erilaisia CIFAR-10-datajoukkoon sisältyviä kohteita ja antaa kameran luokitella ne. Tätä artikkelia varten kameralle näytettiin kuva kissasta (kuva 6) ja lentokoneesta (kuva 7). Tätä on vaikea nähdä kuvasta, mutta luottamustaso oli noin 70 %. Luottamustaso voi laskea johtuen eroista koulutuskuvien ja testikuvien välillä, valaistusolosuhteista sekä muista tekijöistä. Lisäkoulutuksella ja kameran ympäristön tarkemmalla hallinnalla on varmasti saatavissa korkeampia tasoja.

Kuva OpenMV IDE -kamerasta suorittamassa CNN-verkkoa (suurenna klikkaamalla)Kuva 6: CIFAR-10-datajoukkoa käyttävää CNN-verkkoa ajavalle OpenMV IDE -kameralle esitetään tunnistettavaksi kissan kuva. (Kuvan lähde: Beningo Embedded Group)

Kuva OpenMV IDE -kamerasta suorittamassa CNN-verkkoa CIFAR-10:llä (suurenna klikkaamalla)Kuva 7: CIFAR-10-datajoukkoa käyttävää CNN-verkkoa ajavalle OpenMV IDE -kameralle esitetään tunnistettavaksi lentokoneen kuva. (Kuvan lähde: Beningo Embedded Group)

OpenMV H7:n ominaisuuksien laajentaminen

OpenMV-moduulia voidaan laajentaa monin tavoin käytettäväksi erilaisten kameramoduulien sekä lukemattomien ulkoisten anturien kanssa.

Vaikka OpenMV-moduulissa on I/O-laajennusmahdollisuus, voi olla hyödyllistä käyttää ulkoista laajennuskorttia, jolla saadaan käyttöön lisää virta-, maadoitus- ja viestintäsignaaleja. Eräs hyödyllinen laajennuskortti on DFRobotin OpenMV M7 -moduulille tarkoitettu DFR0578 Gravity Expansion Shield (kuva 8). Kuvasta näkyy, että Gravity-moduuli antaa käyttöön lukuisia uusia virta- ja maadoituspinnejä. Se tarjoaa jopa ylimääräisiä I2C-linjoja ja uusia vaihtoehtoja moduulin virransyöttöön. Tämän ansiosta ulkoisien antureiden ja moduulien liittäminen on paljon helpompaa ilman tarvetta koekytkentälevylle tai johtojen liittämiselle.

Kuva DFRobot Gravity -laajennuskortistaKuva 8: DFRobotin Gravity-laajennuskortti OpenMV M7 -kameralle tarjoaa useita helppokäyttöisiä lisäliittimiä nopeuttamaan prototyyppien suunnittelua. (Kuvan lähde: DFRobot)

Gravity-kortin lisäksi toinen kiinnostava kehittäjille hyödyllinen laajennuskortti on DFRobotin DFR0498 FireBeetle Covers – Camera & Audio Media Board (kuva 9).  FireBeetle-kehitysmoduuliin kuuluvat:

  • IIS-koodekkien liitäntärajapinta
  • kameramoduuli
  • kuulokkeet
  • mikrofoni.

OpenMV H7 -kameramoduuliin voidaan loppusovelluksesta riippuen liittää monia muitakin laajennuskortteja.

Kuva: DFRobot FireBeetle DFR0498Kuva 9: DFRobot FireBeetle DFR0498 sisältää laajennuksen medialaitteille, kuten mikrofonille. (Kuvan lähde: DFRobot)

Vinkkejä OpenMV:n kanssa työskentelyyn

Alkuun pääseminen OpenMV H7 -kameramoduulin kanssa ei ole vaikeaa, mutta ensi kertaa sitä käyttävien kehittäjien on hyvä olla tietoisia tietyistä laitteeseen liittyvistä piirteistä ja valinnoista. Tässä on muutamia vinkkejä moduulin käyttöön:

  • Kun käytät moduulia ensi kertaa, muista säätää tarkennus OpenMV:n dokumentaatiossa kuvatulla tavalla.
  • Valikko Files -> Examples (Tiedostot -> Esimerkit) sisältää kymmenittäin esimerkkejä värin havaitsemisesta kasvojen tunnistamiseen.
  • Internetyhteyttä varten voidaan lisätä Wi-Fi-lisäkortti. Wi-Fi-lisäkortti voidaan ottaa automaattisesti käyttöön käynnistyksen yhteydessä OpenMV IDE:n Tools -> OpenMV Cam Settings (Työkalut -> OpenMV Cam -asetukset) -valinnan kautta.
  • TensorFlow Liten avulla voit kouluttaa kiinnostavista kohteista koneoppimismallin.

Näitä vinkkejä noudattava kehittäjät voivat säästää runsaasti aikaa ja vaivaa käyttäessään OpenMV H7 -kameramoduulia ensimmäistä kertaa.

Yhteenveto

Kuten artikkelista käy ilmi, OpenMV H7 -kameramoduuli on ainutlaatuinen siinä miten se auttaa kehittäjiä aloittamaan koneoppimisen periaatteiden soveltamisen esineiden tunnistamisessa sekä muissa vastaavissa sovelluksissa. Paitsi, että sille on saatavana runsaasti esimerkkisovelluksia, joilla kehittäjät voivat nopeuttaa kehitysprosessiaan, saatavana on myös useita laajennusvaihtoehtoja kameroita ja antureita varten. Alkuun päästäkseen kehittäjien tarvitsee osata vain kirjoittaa muutama rivi Python-koodia, minkä jälkeen he voivat saada toimivan sovelluksen aikaan jopa muutamassa tunnissa (monimutkaisuudesta riippuen).

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.

Tietoja kirjoittajasta

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.

Tietoja tästä julkaisijasta

DigiKeyn kirjoittajat Pohjois-Amerikassa