hur man implementerar Anpassad objektdetektering med mallmatchning. Inga kommenterade data behövs!
idag använder toppmoderna objektdetekteringsalgoritmer (algoritmer som syftar till att upptäcka objekt i bilder) neurala nätverk som Yolov4.
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:
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:
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:
den här visas fyra gånger:
och den tredje som visas sex gånger:
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:
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:
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:
slutligen får vi följande resultat:
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:
här är hur jag implementerade det (beräkna IoU-metoden tillsammans med fler förklaringar finns här):
och sedan lade jag bara till dessa två linjer efter detekteringsslingan:
som ett resultat får vi:
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:
och vi får:
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!