Använd OpenMV-kameran för att komma igång med maskininlärning för objektdetektering

Av Jacob Beningo

Bidraget med av DigiKeys nordamerikanska redaktörer

Att använda maskininlärning för detektering och klassificering av objekt har blivit en avgörande faktor för tillverkare av inbäddade system – i synnerhet inom Internet of Things (IoT), säkerhet, avancerade förarassistanssystem (ADAS) och industriella automationsbaserade system. Men eftersom objektdetektering är ett komplext ämne och maskininlärning är något relativt nytt, kan det vara svårt och tidsödande att utveckla maskininlärningstillämpningar som känner igen föremål.

För att lyckas åstadkomma objektdetektering och maskinseende med konventionella utvecklingsmetoder har utvecklarna varit tvungna att lära sig ett omfattande ramverk som OpenCV, och att investera i datorutrustning för tusentals dollar. Under de förutsättningarna blir utvecklingstiden för sådana system extremt lång och kostnaderna mycket höga.

För utvecklare som vill använda maskininlärning och maskinseende i sina tillämpningar, utan att för den sakens skull behöva bli maskininlärningsexperter eller satsa en smärre förmögenhet på utrustning, är kameramodulen OpenMV H7 från SparkFun Electronics en innovativ lösning. Modulen kan programmeras i Python och är utformad för att vara en prisvärd ”Arduino-liknande” enhet för bildbearbetning och bilddetektering. Kombinerat med det omgivande ekosystemet av programvara ger modulen en unik och intressant lågkostnadslösning för att åstadkomma enklare objektdetektering och objektklassificering med maskininlärning.

I denna artikel presenterar vi kameramodulen OpenMV H7 och visar hur utvecklare kan börja använda maskininlärning för objektdetektering baserad på CIFAR-10 – en bilddatauppsättning för datorseende.

Kameramodulen OpenMV H7

Kameramodulen OpenMV H7 och de tillhörande funktionsspäckade programbiblioteken gör det möjligt att skapa maskininlärningsapplikationer på ett snabbt och enkelt sätt. Till exempel kan utveckaren använda OpenMV-kameran för ansikts- och ögonigenkänning, och till och med för exakt pupillavläsning. Enheten kan användas för att skapa dataobjekt eller markörer som sedan kan kopplas till färger. Det finns till och med exempel på hur maskininlärning kan användas för att detektera och spåra anpassade objekt.

OpenMV H7-kameramodulen är ett integrerat utvecklingskort med alla hårdvarukomponenter som behövs för maskininlärningsbaserad igenkänning och klassificering av objekt, till en väsentligt mycket lägre kostnad än för konventionella system för maskinseende. Den relativt lilla modulen – storleken är endast ca 3,6 x 4,4 cm – innehåller:

  • En avancerad microcontroller
  • En integrerad och utbytbar kamera
  • Batterikontakt
  • Micro USB-kontakt
  • LED med tre färger
  • Ett microSD-uttag (stöder kort med upp till 64 GB)
  • Expansionsgränssnitt (I/O)

Bild av kameramodulen OpenMV H7 från SparkFun ElectronicsFigur 1: Kameramodulen OpenMV H7 är en fullt integrerad enhet med alla komponenter som behövs för att snabbt kunna utveckla och driftsätta en tillämpning för maskinseende baserat på maskininlärning. (Bildkälla: SparkFun Electronics)

Expansionsgränssnittet ger utvecklaren tillgång till en rad extrafunktioner hos microcontrollern (figur 2). Exempel på sådana extrafunktioner är kommunikationsgränssnitt som:

  • UART
  • SPI
  • I2C
  • CAN

Expansionsgränssnittet innefattar även styrning och datakanaler för att driva servomotorer, generera signaler via en D/A-omvandlare eller avläsa sensorvärden via en A/D-omvandlare. Expansionsgränssnittet gör OpenMV-modulen extra intressant för att utveckla kameratillämpningar för hemautomation, robotstyrning, industriell automation samt objektdetektering och objektspårning.

Tabell för stiftkonfigurationer hos SparkFuns OpenMV H7-kameramodulFigur 2: Kameramodulen OpenMV H7 har en bred uppsättning expansionsstift. De kan användas för att styra servomotorer, sampla sensorer eller kommunicera med en Wi-Fi-modul om man vill bygga en IoT-enhet. (Bildkälla: SparkFun)

Microcontrollern på kortet är STMicroelectronics STM32F765VIT6, som innefattar en Arm Cortex-M7-processor i en 100-stifts LQFP-kapsel. Processorn körs vid 216 MHz och har 2 MB flashminne och 512 kB RAM-minne. Den extremt kapabla processorn är mycket väl lämpad för maskinseende tack vare en double precision-flyttalsprocessor samt fullständiga signalprocessorinstruktioner. Microcontrollern innefattar också en hårdvarubaserad JPEG-encoder som kan accelerera bildbearbetande applikationer. I figur 3 visas ett generellt blockdiagram för STM32F765VIT6.

Diagram: STMicroelectronics STM32F765VIT har 2 MB flashminne, 512 kB RAMFigur 3: STM32F765VIT har 2 MB flashminne, 512 kB RAM-minne och extrafunktioner såsom hårdvarubaserad JPEG-kodning och signalprocessorinstruktioner. Detta gör microcontrollern mycket väl lämpad för tillämpningar inom maskinseende. (Bildkälla: STMicroelectronics)

OpenMV H7-kameramodulen är unik på så sätt att den stöder flera andra kameramoduler. Anta till exempel att du som utvecklare inte vill använda kortets inbyggda kamera, som har en upplösning på 640 x 480. I en sådan situation kan du i stället välja en modul som stöder bildsensorn MT9V034 från ON Semiconductor. MT9V034 är en 1/3 tum bred VGA-bildsensor med CMOS-teknik. Enheten har en global slutare och ett HDR-läge (high dynamic range). Sensorn har en bildupplösning på 752 x 480 och är utvecklad för att drivas i ett brett temperaturområde, från -30 ˚C till +70 ˚C. ON Semiconductor erbjuder ett utvecklingskort till bildsensorn: MT9V034C12STCH-GEVB (figur 4).

Bild av ON Semiconductors utvecklingskort MT9V034C12STCH-GEVBFigur 4: MT9V034C12STCH-GEVB, ett utvecklingskort för bildsensorn MT9V034, har ett inbyggt objektiv, för snabbare utveckling och testning. (Bildkälla: ON Semiconductor)

Utveckla en första applikation för objektdetektering

Applikationsutveckling för kameramodulen OpenMV H7 utförs i utvecklingsmiljön OpenMV IDE, som har ett Python-gränssnitt för applikationsutveckling (figur 5). Eftersom Python används behöver du inte kunna något lågnivåspråk. Skripten skrivs i Python och kameramodulen OpenMV H7 kör dessutom MicroPython. Detta ger utvecklaren ett mycket enkelt sätt att börja skriva kameratillämpningar och köra maskininlärningsfunktioner.

Bild av det Python-baserade gränssnittet i OpenMV IDE (klicka för att förstora)Figur 5: OpenMV IDE har ett Python-baserat gränssnitt för att utveckla applikationskod till kameramodulen OpenMV H7. Applikationen skickas sedan som ett skript till kameramodulen, som kör MicroPython. (Bildkälla: Beningo Embedded Group)

När väl den integrerade utvecklingsmiljön (dvs. OpenMV IDE) är igång, börjar utvecklaren med att köra det enkla skriptet hello_world.py. Det innehåller den kod som visas i ”program 1” nedan. Python-skriptet visar hur man aktiverar OpenMV-kameran och tar ögonblicksbilder kontinuerligt. Detta ger tillgång till realtidsbilder, med möjlighet att mäta bildhastigheten. När enheten är ansluten till en dator kan bildhastigheten variera från endast 25 rutor per sekund (fps), upp till ca 60 rutor per sekund. För att köra applikationen ansluter man först OpenMV-kameran till IDE-miljön genom att klicka på anslutningsknappen nere till vänster. Sedan kör man applikationen genom att klicka på den gröna pilen.

Kopiera
# 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. 

Program 1: Applikationen hello_world.py i OpenMV:s IDE kan användas för att få OpenMV-kameramodulen att leverera realtidsbilder. (Kodkälla: OpenMV)

Innan man kan börja testa objektdetekterings- och klassificeringsfunktionerna måste maskininlärningssystemet ”tränas” att känna igen önskade objektkategorier. CIFAR-10 är en bilddatamängd som ofta används för att ”lära upp” och testa objektdetekteringsmodeller. CIFAR-10 består av 60 000 färgbilder av formatet 32 x 32, i följande 10 bildkategorier:

  • Flygplan
  • Bil
  • Fågel
  • Katt
  • Rådjur
  • Hund
  • Groda
  • Häst
  • Båt
  • Lastbil

Att beskriva den process som används för att träna modellen och omvandla den till en inferens som kan köras på OpenMV-kameran, får vi inte plats med i denna artikel. Men det går att köra ett ”CIFAR-10-tränat” nätverk utan att gå igenom hela modellutvecklingsprocessen: OpenMV IDE innefattar en färdigtränad modell för CIFAR-10. Modellen behöver bara läsas in i kameran.

För att använda modellen ansluter du OpenMV-kameran till datorn och OpenMV IDE. I OpenMV IDE klickar du på Tools -> Machine learning -> CNN Network Library. Ett fönster med en mapp för OpenMV:s qtcreator-modeller öppnas. Där finns två alternativ:

  • cmsisnn
  • tensorflow

Under cmsisnn navigerar du till mappen ”cifar10”, klickar på ”cifar10.network” och sedan på ”open”. Ett nytt fönster öppnas. Det är till för att spara den ”upplärda” nätverksfilen på OpenMV-kameran. Sedan kan du spara nätverket genom att välja den masslagringsenhet som visas vid kameran.

När nätverket har sparats läser du in maskininlärningsexemplet för CIFAR-10 genom att välja File -> Examples -> 25-Machine-Learning -> nn_cifar10_search_whole_window.py. Exempelskriptet nedan (program 2) läses in.

Kopiera # 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()) 

Program 2: Exempelapplikationen nn_cifar10_search_whole_window.py i OpenMV:s IDE används för att klassificera bilder och generera en konfidensnivå för klassificeringen. (Kodkälla: OpenMV)

Testapplikationen kan köras på samma sätt som skriptet hello_world.py: Anslut OpenMV IDE till modulen genom att klicka på anslutningsikonen och klicka sedan på startpilen. Kameran kör skriptet och försöker klassificera de bilder som den ”ser”. I terminalfönstret visas om en bild har klassificerats, liksom konfidensnivån för utförda klassificeringar.

Allt utvecklaren behöver göra nu är att visa upp olika föremål som finns i CIFAR-10-datamängden och låta kameran klassificera dem. Som testuppgift för den här artikeln placerade vi en bild av en katt (figur 6) och en bild av ett flygplan (figur 7) framför kameran. Skärmdumpen är otydlig, men konfidensnivån blev ca 70 %. Att konfidensnivån blev så pass låg kan bero på skillnader mellan de inlärda bilderna och våra testbilder, ljusförhållanden och andra faktorer. Högre konfidensnivåer går definitivt att uppnå med ytterligare inlärning och bättre förhållanden i kameramiljön.

Bild av OpenMV IDE-kamera som kör ett CNN-nätverk (klicka för att förstora)Figur 6: Kameran för OpenMV IDE kör ett CNN-nätverk för datamängden CIFAR-10 och har fått en katt för igenkänning. (Bildkälla: Beningo Embedded Group)

Bild av OpenMV IDE-kamera som kör ett CNN-nätverk för CIFAR-10 (klicka för att förstora)Figur 7: Kameran för OpenMV IDE kör ett CNN-nätverk för datauppsättningen CIFAR-10, och har fått ett flygplan för igenkänning. (Bildkälla: Beningo Embedded Group)

Utöka OpenMV H7:s kapacitet

Det finns många möjligheter att utöka OpenMV-modulen så att den kan användas med andra kameramoduler och ett i stort sett oändligt antal externa sensorer.

OpenMV-modulen har ju inbyggda expansionsgränssnitt, men det kan ändå vara bra att använda ett externt expansionskort för tillgång till effekt-, jord- och kommunikationssignaler. Ett användbart expansionskort är DFR0578 Gravity Expansion Shield för OpenMV M7-modulen, från DFRobot (figur 8). Som framgår av bilden ger Gravity-modulen tillgång till en rad ström- och jordstift. Du får också tillgång till fler I2C-alternativ och fler möjligheter att driva modulen. Det gör det mycket lättare att ansluta externa sensorer och moduler – du slipper skarva ledningar eller använda kopplingsdäck.

Bild av expansionskortet Gravity från DFRobotFigur 8: Expansionskortet Gravity från DFRobot är avsett för OpenMV M7-kameran och ger tillgång till en rad lättåtkomliga stiftlister för snabb prototypframtagning. (Bildkälla: DFRobot)

Ett annat intressant expansionskort från DFRobot är DFR0498 FireBeetle Covers – Camera & Audio Media Board (figur 9). FireBeetle-modulen innefattar:

  • Ett gränssnitt för att ansluta IIS-codecar
  • En kameramodul
  • Hörlurar
  • Mikrofon

Många andra expansionskort kan anslutas till OpenMV H7-modulen, beroende på vilken tillämpning man vill skapa.

Bild av DFRobot FireBeetle DFR0498Figur 9: DFRobot FireBeetle DFR0498 har expansionsplatser för medieenheter, exempelvis en mikrofon. (Bildkälla: DFRobot)

Tips för att arbeta med OpenMV

Att komma igång med kameramodulen OpenMV H7 är inte svårt, men det finns många faktorer att beakta för den som arbetar med modulen för första gången. Här ger vi några användbara tips för att komma igång:

  • När du börjar använda modulen, kom ihåg att ställa in fokus genom att följa instruktionerna i OpenMV-dokumentationen.
  • Gå till Files -> Examples för att ta del av ett antal exempel för olika uppgifter, från att detektera färger till att utföra ansiktsigenkänning.
  • Överväg att använda en Wi-Fi-sköld om du vill lägga till internetkonnektivitet. Du kan ange att en Wi-Fi-sköld ska aktiveras automatisk vid start. Välj ”Tools -> OpenMV Cam Settings” i OpenMV IDE för att hitta inställningen.
  • Överväg att använda TensorFlow Lite för att lära en ML-modell att känna igen önskade föremål.

Utvecklare som följer dessa tips spar en hel del tid och slipper onödiga problem när de använder kameramodulen OpenMV H7 första gången.

Slutsats

Som vi har beskrivit ovan är kameramodulen OpenMV H7 ett mycket lämpligt alternativ för utvecklare som vill börja använda maskininlärning för objektigenkänning och relaterade tillämpningar. Med enheten levereras ett antal exempelapplikationer som bidrar till att optimera och accelerera utvecklarens arbete. Därtill finns ett antal expansionsalternativ för kameror och sensorer. För att komma igång behöver man bara kunna skriva några rader Python-kod – inom några timmar kan man ha en fullt fungerande applikation, beroende på hur avancerad den ska vara.

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.

Om skribenten

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo är konsult inom inbäddad programvara. Han har publicerat över 200 artiklar om utveckling av inbäddad programvara, och är en eftertraktad talare och teknisk utbildare med tre examina, däribland en master i teknik från University of Michigan.

Om utgivaren

DigiKeys nordamerikanska redaktörer