Bruk OpenMV-kameraet til å raskt komme i gang med maskinlæring i forbindelse med objektdeteksjon
Bidrag fra DigiKeys nordamerikanske redaktører
2020-02-25
Maskinlæring (ML) i forbindelse med objektdeteksjon og klassifisering er raskt i ferd med å bli et pressende behov innen bransjer som benytter innebygde systemer – spesielt for tingenes Internett (IoT – Internet of Things), sikkerhet, avanserte kjøreassistentsystemer (ADAS – advanced driving assist systems) og industrielle automatiseringsbaserte systemer. Objektdeteksjon er imidlertid et komplekst emne, og ML er relativt nytt, så det kan være vanskelig og utfordrende å utvikle ML-applikasjoner for detektering av objekter.
For eksempel har objektdeteksjon vanligvis krevd at utviklere lærer seg rammeverk som OpenCV og kjøper datautstyr for titusenvis av kroner for å lykkes. Derfor er tradisjonelle tilnærminger til objektdeteksjon og maskinsyn ikke bare tidkrevende, men også dyre.
Den Python-programmerbare OpenMV H7-kameramodulen fra SparkFun Electronics er en innovativ løsning som er godt egnet for ingeniører som ønsker å bruke ML i forbindelse med objektdeteksjon og maskinsynsapplikasjoner uten å måtte bli eksperter på ML eller tømme bankkontoen for å gjøre innkjøp av utstyr. Modulen er konstruert for å være en prisgunstig «Arduino»-lignende modul for bildebehandling og deteksjon. Derfor tilbyr modul- og programvareøkosystemet en unik og interessant løsning som muliggjør brukervennlig objektdeteksjon og klassifisering ved å benytte ML som en kostnadseffektiv modul.
Denne artikkelen introduserer OpenMV H7-kameramodulen og viser hvordan utviklere kan komme i gang med ML i forbindelse med objektdeteksjon ved å bruke CIFAR-10-bildedatasettet for datasyn.
OpenMV H7-kameramodulen
OpenMV H7-kameramodulen, med sine funksjonsrike programvarebiblioteker, tilbyr masse hjelp til utviklere som ønsker å raskt opprette en ML-applikasjon. Utviklere kan for eksempel bruke OpenMV-kameraet for deteksjon av ansikt og øyne, og til og med for nøyaktig sporing av pupiller. Det kan brukes til å opprette klatter eller markører som sporer en farge. Det finnes til og med eksempler på hvordan du bruker ML til å detektere og spore egendefinerte objekter.
OpenMV H7-kameramodulen er et enkelt integrert utviklingskort som omfatter alle nødvendige maskinvarekomponenter for ML-basert objektdeteksjon og klassifisering, men til en pris som er flere ganger mindre enn tradisjonelle maskinsynsystemer. Modulen er relativt liten, med dimensjoner på bare 36 mm (1,4 tommer) x 44 mm (1,75 tommer), og den omfatter:
- En avansert mikrokontroller
- En integrert og utskiftbar kameramodul
- Batterikontakt
- USB mikro-kontakt
- Trefarget LED
- En microSD-kontakt (støtter kort på opptil 64 gigabyte)
- Utvidelsesinngang og -utgang (I/O)
Figur 1: OpenMV H7-kameramodulen kommer fullstendig integrert med alle nødvendige komponenter for å raskt utvikle og distribuere en maskinsynsapplikasjon som bruker ML. (Bildekilde: SparkFun Electronics)
Utvidelsesinngangen og -utgangen (I/O) gir utviklere en rekke tilleggsfunksjoner fra mikrokontrolleren (figur 2). Disse funksjonene omfatter kommunikasjonsgrensesnitt som:
- UART
- SPI
- I2C
- CAN
Utvidelsesinngangen og -utgangen (I/O) omfatter også kontroll- og datakanaler som driver servoer, genererer signaler gjennom en digital-til-analog-omformer (DAC) eller avleser sensorverdier gjennom en analog-til-digital-omformer (ADC). Disse utvidelsesinngangene og -utgangene (I/O) gjør OpenMV-modulen ekstremt interessant for maskinsynsapplikasjoner innen hjemmeautomatisering, robotstyring, industriell automatisering, objektdeteksjon og sporing av objekter.
Figur 2: OpenMV H7-kameramodulen kommer med en overflod av utvidbare I/O-pinner. Disse pinnene kan brukes til å kontrollere servomotorer, samplingssensorer eller kommunikasjon med en Wi-Fi-modul for å opprette en IoT-enhet. (Bildekilde: SparkFun)
Den innebygde mikrokontrolleren er STMicroelectronics STM32F765VIT6, som omfatter en Arm Cortex-M7-prosessor i en 100-pinners LQFP. Prosessoren kjører på 216 megahertz (MHz) og har 2 megabyte flash og 512 kilobyte RAM. Prosessoren er ekstremt kapabel og er velegnet for applikasjoner innen maskinsyn takket være flytetallsbrikken (FPU – floating point unit) med dobbeltpresisjon og fullstendige DSP-instruksjoner. Mikrokontrolleren inneholder også en maskinvarebasert JPEG-koder som kan akselerere bildebehandlingsapplikasjoner. Det generelle blokkskjemaet for STM32F765VIT6 vises i figur 3.
Figur 3: STM32F765VIT omfatter 2 megabyte flash, 512 kilobytes RAM og periferiutstyr som maskinvarebasert JPEG-koding og DSP-instruksjoner, noe som gjør den perfekt for applikasjoner innen maskinsyn. (Bildekilde: STMicroelectronics)
OpenMV H7-kameramodulen er unik fordi den støtter flere forskjellige kameramoduler. Hvis for eksempel en utvikler ikke ønsker å bruke det innebygde kameraet, som har en oppløsning på 640 x 480 piksler, kan vedkommende bytte til en modul som støtter MT9V034-bildesensoren fra ON Semiconductor. MT9V034 er en 8,4 mm (1/3 tommer) digital bildesensor i VGA-format med CMOS aktiv-piksel, som omfatter global lukker og HDR-modus (high dynamic range). Sensoren har en bildeoppløsning på 752 x 480 piksler og er utviklet til å operere over et bredt temperaturområde, fra -30 ˚C til +70 ˚C. ON Semiconductor leverer et utviklingskort for denne bildesensoren, MT9V034C12STCH-GEVB (figur 4).
Figur 4: MT9V034C12STCH-GEVB er et utviklingskort for bildesensoren MT9V034, som omfatter et innebygd objektiv som akselererer utvikling og testing. (Bildekilde: ON Semiconductor)
Utvikling av en første objektdeteksjonsapplikasjon
Applikasjonsutvikling for OpenMV H7-kameramodulen utføres via OpenMV IDE, som er et Python-grensesnitt for applikasjonsutvikling (figur 5). Med Python er det ikke nødvendig å kjenne et grunnleggende programmeringsspråk. Ikke bare er skript skrevet i Python, men OpenMV H7-kameramodulen kjører faktisk MicroPython som standard. Dette gir utviklere en ekstremt enkel måte å komme i gang med å skrive maskinsynsapplikasjoner og kjøre logiske slutninger for ML med minimal innsats.
Figur 5: OpenMV IDE leverer et Python-basert grensesnitt for å utvikle applikasjonskode for OpenMV H7-kameramodulen. Applikasjonen sendes deretter som et skript til kameramodulen, som kjører MicroPython. (Bildekilde: Beningo Embedded Group)
Noe av det første en utvikler gjør når de er klare til å sette i gang, er å kjøre den grunnleggende hello_world.py, som inneholder koden i liste 1. Python-skriptet viser utviklere hvordan de aktiverer OpenMV-kameraet og tar kontinuerlige hurtigbilder. Dette gjør det mulig for utviklere å få live-video og måle bildefrekvensen. Bildefrekvensen kan variere når den er koblet til en datamaskin, fra så lav som 25 bilder per sekund (fps) til rundt 60 bilder per sekund (fps). Applikasjonen kjøres ved å koble OpenMV-kameraet til OpenMV IDE ved å bruke tilkoblingsknappen nederst til venstre på skjermen, og deretter klikke på den grønne knappen.
Kopi # 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.
Liste 1: OpenMV IDE hello_world.py-applikasjonen gjør det mulig for OpenMV-kameramodulen å levere video i sanntid. (Kildekode: OpenMV)
For å utføre en første test med objektdeteksjon og klassifisering, må et ML-nettverk trenes opp med de ønskede klassene for objektgjenkjenning. CIFAR-10-datasettet brukes ofte til å trene opp modeller for objektdeteksjon og teste hvor godt disse modellene fungerer. CIFAR-10-datasettet består av 60 000 bilder som inneholder 32x32-fargebilder for de 10 ulike bildeklassene nedenfor:
- Fly
- Bil
- Fugl
- Katt
- Hjort
- Hund
- Frosk
- Hest
- Skip
- Lastebil
Denne artikkelen beskriver ikke prosessen som brukes til å trene modellen og konvertere den til en logisk slutning som kan kjøres på OpenMV-kameraet. Det er mulig å kjøre et nettverk som er CIFAR-10-trent uten å gå via modellutviklingen: OpenMV IDE inneholder allerede en trent modell for CIFAR-10 som bare trenger å lastes inn på kameraet.
Hvis du vil bruke denne modellen, kobler du OpenMV-kameraet til datamaskinen og OpenMV IDE. Fra OpenMV IDE, klikker du på verktøy (tools) -> maskinlæring (machine learning) -> CNN-nettverksbibliotek (CNN Network Library). Et vindu åpnes med mappen for OpenMV qtcreator-modeller. Det er to alternativer:
- cmsisnn
- tensorflow
Under cmsisnn navigerer du til cifar10-mappen, klikker på cifar10.network og deretter åpner. Et annet vindu vil da åpnes. Dette vinduet er der for å lagre den trente nettverksfilen på OpenMV-kameraet. Brukeren kan deretter velge masselagringsstasjonen som vises med kameraet for å lagre til nettverket.
Når nettverket er lagret, laster du eksempelet for CIFAR-10-maskinlæring ved å gå til Fil (File) -> Eksempler (Examples) -> 25-Machine-Learning -> nn_cifar10_search_whole_window.py. Dette laster inn et eksempelskript som kan sees nedenfor (liste 2).
Kopi # 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())
Liste 2: OpenMV IDE nn_cifar10_search_whole_window.py-eksempelapplikasjonen brukes til å klassifisere bilder og gi en måling med tillitsnivået for klassifiseringen. (Kildekode: OpenMV)
Testapplikasjonen kan kjøres i henhold til hello_world.py-skriptet: Koble OpenMV IDE til modulen ved å klikke på koble til nederst til venstre, og klikk deretter på kjør. På dette tidspunktet kjører kameraet skriptet og prøver å klassifisere bildene det ser. Terminalvinduet angir om et bilde er klassifisert eller ikke, og hva tillitsnivået er.
På dette tidspunktet er en utvikler kun nødt til å presentere forskjellige objekter som befinner seg innenfor CIFAR-10-datasettet og la kameraet klassifisere dem. I forbindelse med denne artikkelen, ble kameraet gitt et bilde av en katt (figur 6) og et bilde av et fly (figur 7). Det er vanskelig å se fra bildet, men tillitsnivået var rundt 70 %. Tillitsnivået kan være lavt på grunn av forskjeller i de trente bildene sammenlignet med testbildene, lysforholdene og andre faktorer. Høyere nivåer er absolutt oppnåelige med ekstra trening og strammere kontroll over kameraomgivelsene.
Figur 6: OpenMV IDE-kameraet som kjører et CNN-nettverk for CIFAR-10-datasettet er gitt en katt for gjenkjennelse. (Bildekilde: Beningo Embedded Group)
Figur 7: OpenMV IDE-kameraet som kjører et CNN-nettverk for CIFAR-10-datasettet er gitt et fly for gjenkjennelse. (Bildekilde: Beningo Embedded Group)
Utvide mulighetene til OpenMV H7
Det er mange muligheter til å utvide OpenMV-modulen slik at den kan brukes med forskjellige kameramoduler og et nesten ubegrenset antall eksterne sensorer.
Selv om OpenMV-modulen har I/O-utvidelsesmuligheter, kan det være nyttig å bruke et eksternt utvidelseskort for å gi ekstra tilgang til strøm, jording og kommunikasjonssignaler. Et nyttig utvidelseskort er DFR0578 Gravity Expansion Shield for OpenMV M7-modulen fra DFRobot (figur 8). På figuren kan man se at Gravity-modulen gir tilgang til mange flere strøm- og jordingspinner. Den kan til og med utvides med ytterligere I2C-linjer, og gir flere alternativer for strømsetting av modulen. Dette gjør det mye enklere å samhandle med eksterne sensorer og moduler uten å måtte bruke et prototypekort eller skjøte ledninger.
Figur 8: DFRobot Gravity-utvidelseskortet for OpenMV M7-kameraet har flere lettilgjengelige stiftlister som muliggjør rask prototypetesting. (Bildekilde: DFRobot)
Et annet interessant utvidelseskort som utviklere kan dra nytte av, i tillegg til Gravity-kortet, er DFRobot DFR0498 FireBeetle Covers – kamera-og-lyd-mediekort (figur 9). FireBeetle-utviklingsmodulen omfatter:
- Et grensesnitt for å koble til IIS-kodeker
- En kameramodul
- Høretelefoner
- Mikrofon
Det finnes mange andre utvidelseskort som kan kobles til OpenMV H7-kameramodulen, avhengig av den endelige applikasjonen.
Figur 9: DFRobot FireBeetle DFR0498 omfatter utvidelse for medieenheter, for eksempel mikrofon. (Bildekilde: DFRobot)
Tips og triks for å jobbe med OpenMV
Det er ikke vanskelig å komme i gang med OpenMV H7-kameramodulen, men det er mange nyanser og beslutninger som utviklere må være klar over første gang de jobber med den. Her er noen «tips og triks» for å komme i gang med modulen:
- Når du først bruker modulen, må du sørge for å justere fokuset på modulen ved å bruke fremgangsmåten som er beskrevet i OpenMV-dokumentasjonen.
- Fra Filer (Files) -> Eksempler (Examples) i menyen får du tilgang til dusinvis av eksempler som omhandler alt fra hvordan du detekterer en farge til hvordan du utfører ansiktsgjenkjenning.
- Vurder å bruke et Wi-Fi-skjold hvis du vil legge til Internett-forbindelse. Et Wi-Fi-skjold kan aktiveres automatisk ved oppstart i OpenMV IDE fra Verktøy (Tools) -> OpenMV-kamerainnstillinger (OpenMVCam Settings).
- Vurder å bruke TensorFlow Lite til å trene en ML-modell for objektet/objektene du er interessert i.
Utviklere som følger disse «tipsene og triksene» vil oppdage at de kan spare ganske mye tid og stress når de arbeider med OpenMV H7-kameramodulen for første gang.
Konklusjon
OpenMV H7-kameramodulen er som vist her unikt egnet til å hjelpe utviklere med å raskt komme i gang med ML-prinsipper i forbindelse med objektdeteksjon og andre relaterte applikasjoner. Det finnes eksempler på applikasjoner som utviklere kan dra nytte av for å få fart på utviklingen, samt mange utvidelsesalternativer for kameraer og sensorer. Alt utviklere trenger å vite for å komme i gang, er hvordan de skriver noen få linjer med Python-kode. De kan ha en fungerende applikasjon oppe å gå i løpet av noen få timer, avhengig av kompleksiteten.
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.




