End-to-end-objektdetektering med Mallmatchning med Python

hur man implementerar Anpassad objektdetektering med mallmatchning. Inga kommenterade data behövs!

objektdetektering-mallmatchning
objektdetektering med Mallmatchning för att upptäcka komponenter

idag använder toppmoderna objektdetekteringsalgoritmer (algoritmer som syftar till att upptäcka objekt i bilder) neurala nätverk som Yolov4.

objektdetektering-utgång
en objektdetekteringsutgång

Mallmatchning är en teknik i digital bildbehandling för att hitta små delar av en bild som matchar en mallbild. Det är en mycket enklare lösning än ett neuralt nätverk för att utföra objektdetektering. Dessutom kommer det med följande fördelar:

  • inget behov av att kommentera data (en tidskrävande och obligatorisk uppgift att träna neurala nätverk)
  • avgränsningsboxar är mer exakta
  • inget behov av GPU

enligt min erfarenhet kombinerar ett neuralt nätverk som Yolov4 och objektdetektering med mallmatchning här ett bra sätt att avsevärt förbättra ditt neurala nätverksprestanda!

vad är mallmatchning?

när du använder OpenCV-mallmatchning glider din mall pixel för pixel på din bild. För varje position beräknas ett likhetsmått mellan din mallbild och den del av bilden som den återställer:

mallmatchning-exempel
använda mallmatchning för att upptäcka franska ID i skannade dokument

om likhetsmåttet är tillräckligt högt för en pixel, är den här pixeln förmodligen det övre vänstra hörnet av ett objekt som matchar din mall!

följaktligen kan du uppnå objektdetektering med mallmatchning endast om objekten du försöker upptäcka är tillräckligt lika —nästan identiska— inom en klass. Du kan fortfarande inkludera fler mallar för att hantera objektvariationer (storlek, färg, orientering). Men det kommer att öka förutsägelsetiden.

vid första anblicken verkar det mycket restriktivt. Men många objektdetekteringsanvändningsfall kan hanteras med mallmatchning:

  • ID i skannade dokument
  • tom parkeringsplats från en stationär kamera
  • komponenter på en monteringslinje…

ett praktiskt exempel

ett bra användningsfall för objektdetektering med mallmatchning är att upptäcka komponenter på tryckta kretsar, som den här:

printed-circuit-unsplash
en tryckt krets – foto av Umberto på Unsplash

vi kan föreställa oss en monteringslinje som producerar sådana kretsar. Låt oss föreställa oss att vissa tillverkade kretsar saknar komponenter och därmed är defekta. Vi kan föreslå att installera en kamera i slutet av spåret och att skjuta varje krets för att filtrera bort defekta produkter. Vi kan uppnå detta med objektdetektering med mallmatchning!

för enkelhetens skull kommer vi att fokusera på detektering av några komponenter.

en första komponent som visas två gånger:

Mall-matchning-komponent-1
komponent 1

den här visas fyra gånger:

Mall-matchning-komponent-2
komponent 2

och den tredje som visas sex gånger:

Mall-matchning-komponent-3
komponent 3

slutligen väljer vi dessa tre bilder som mallar. Följaktligen reduceras komplexiteten i detta användningsfall: vi kommer lätt att upptäcka åtminstone de objekt som valts som mallar.

grundläggande objektdetektering med mallmatchning

definiera Mall

för det första definierar vi mallar från:

  • en bildväg,
  • en etikett,
  • en färg (för resultatvisualisering —avgränsningsrutor och Etikettfärg),
  • och en matchande tröskel.

för det andra anser vi att alla pixlar som har en likhetsmått över denna tröskel indikerar en detektering för den här mallen.

här är koden som definierar mallar:

definiera mallar

upptäcka objekt med mallmatchning

sedan slingrar vi över mallar för att utföra objektdetektering med mallmatchning för varje mall. Eftersom vi använder ett tröskelvärde väljer vi ett normaliserat likhetsmått (TM_CCOEFF_NORMED) vid tillämpning av mallmatchning. Därför kan vi välja en tröskel mellan 0 och 1:

objektdetektering med mallmatchning

vi anser att varje pixel som har en likhetspoäng över malltröskeln är det övre vänstra hörnet av ett objekt (med mallens höjd, bredd och etikett).

visualisera upptäckta objekt

sedan plottar vi de förutsagda avgränsningsrutorna för denna objektdetektering med mallmatchning på inmatningsbilden:

Visa objektdetekteringsresultat

slutligen får vi följande resultat:

Mall-matchning-duplicerade-upptäckta-objekt
duplicerade upptäckta objekt

som indikeras av tjockleken på rutorna (i grönt, gult och rött) har varje objekt upptäckts flera gånger.

ta bort dubbletter

Varför fick vi duplicerade upptäckter? Som förklarats ovan returnerar OpenCV-mallmatchning en 2-D-matris med dimensionen av ingångsbilden (en cell— och därmed en likhetspoäng— för varje ingångsbildpixel).

därför, om ett objekt upptäcks på en plats, alla omgivande pixlar kommer sannolikt att ha samma likhetspoäng, och därmed betraktas som andra objekt övre vänstra hörn.

för att ta itu med detta problem sorterar vi alla upptäckter genom att minska matchande värden. Sedan väljer vi om vi vill validera varje upptäckt eller inte. Vi validerar upptäckten om den inte överlappar för mycket med någon av de redan validerade upptäckterna. Slutligen bestämmer vi att två upptäckter överlappar varandra om korsningen över föreningen av deras avgränsningslådor ligger över en given tröskel. Denna process kallas icke-maximal undertryckning.

här är en visuell förklaring av vad korsning över Union (IoU) är:

korsning över Union

här är hur jag implementerade det (beräkna IoU-metoden tillsammans med fler förklaringar finns här):

icke-maximal undertryckning

och sedan lade jag bara till dessa två linjer efter detekteringsslingan:

applicera NMS

som ett resultat får vi:

deduplicerade-upptäckta-objekt
deduplicerade upptäckta objekt

mycket renare! Vi ser nu tydligt att alla första och tredje komponenter detekteras utan falskt positivt (precision och återkallelse av 1).

vi vill nu minska antalet falska positiva effekter för komponent 2. Det enklaste sättet är att öka matchningströskeln för mallen som används för den här etiketten.

välja hyperparametrar

det är naturligtvis bättre att beräkna objektdetekteringsmått på olika bilder för att välja hyperparametrar (mallmatchningströskel och tröskelvärde för icke-maximal undertryckning). För tillfället kan vi helt enkelt öka tröskeln för komponent 2:

Välj mall matchande trösklar

och vi får:

last-output
Final output

vi har nu bara två falska positiva för komponent 2, i stället för dussintals (precision av 2/3, återkallande av 1)! Dessutom är komponenterna 1 och 2 fortfarande perfekt detekterade (precision och återkallande av 1).

för att förbättra våra resultat kunde vi:

  • inkludera mallar för komponenterna som misstas med komponent 2.
  • prova flera likhetsmått
  • kommentera några bilder för att beräkna detekteringsmått och utför en rutnätssökning på dessa parametrar.

sammanfattning

vi har uppnått objektdetektering med mallmatchning av:

  • definiera minst en mall för varje objekt (ju fler mallar du har för ett objekt desto mer kommer din återkallelse att vara hög—och din precision låg)
  • använda OpenCV-mallmatchningsmetod på bilden för varje mall
  • med tanke på att varje pixel som har en likhetspoäng över en malltröskel är det övre vänstra hörnet av ett objekt (med mallens höjd, bredd och etikett)
  • tillämpa icke-maximal undertryckning av de detekteringar som erhållits
  • välja malltrösklar för att förbättra detekteringsnoggrannheten!

det är det!

letar du efter Bildigenkänningsexperter? Tveka inte att kontakta oss!

You might also like

Lämna ett svar

Din e-postadress kommer inte publiceras.