end-to-end objektdetektering med Skabelontilpasning ved hjælp af Python

Sådan implementeres brugerdefineret objektdetektering med skabelontilpasning. Ingen annoterede data er nødvendige!

object-detection-template-matching
Object detection med skabelon matching til at detektere komponenter

i dag bruger avancerede objektdetekteringsalgoritmer (algoritmer, der sigter mod at registrere objekter i billeder) neurale netværk som Yolov4.

object-detection-output
en object detection output

skabelon matching er en teknik i digital billedbehandling til at finde små dele af et billede, der matcher et skabelonbillede. Det er en meget enklere løsning end et neuralt netværk til at udføre objektdetektion. Derudover kommer det med følgende fordele:

  • ingen grund til at kommentere data (en tidskrævende og obligatorisk opgave at træne neurale netværk)
  • afgrænsningsbokse er mere nøjagtige
  • intet behov for GPU

efter min erfaring er det en god måde at forbedre din neurale netværks ydeevne betydeligt!

hvad er skabelon matching?

når du bruger OpenCV-skabelonmatchning, glider din skabelon billedbillede efter billedbillede på dit billede. For hver position beregnes en lighedsmåling mellem dit skabelonbillede og den del af billedet, det genopretter:

skabelon-matching-eksempel
brug af skabelon matching til at registrere fransk ID i scannede dokumenter

hvis lighedsmetrikken er høj nok til et punkt, så er dette punkt sandsynligvis det øverste venstre hjørne af et objekt, der matcher din skabelon!

derfor kan du kun opnå objektdetektering med skabelontilpasning, hvis de objekter, du prøver at opdage, er ens nok —næsten identiske— inden for en klasse. Du kan stadig medtage flere skabeloner til at tackle objektvariationer (størrelse, farve, orientering). Men det vil øge forudsigelsestiden.

ved første blik virker det meget restriktivt. Men mange tilfælde af objektdetektering kan tackles med skabelontilpasning:

  • ID i scannede dokumenter
  • tom parkeringsplads fra et stationært kamera
  • komponenter på en samlebånd…

et praktisk eksempel

en god brugssag til objektdetektering ved hjælp af skabelontilpasning er at registrere komponenter på trykte kredsløb, som denne:

trykt kredsløb-unsplash
et trykt kredsløb-foto af Umberto på Unsplash

vi kunne forestille os en samlebånd, der producerer sådanne kredsløb. Lad os forestille os, at nogle fremstillede kredsløb mangler komponenter og dermed defekte. Vi kunne foreslå at installere et kamera i slutningen af stien og skyde hvert kredsløb for at filtrere defekte produkter ud. Vi kan opnå dette med objektdetektering med skabelon matching!

for enkelhedens skyld vil vi fokusere på påvisning af nogle få komponenter.

en første komponent vises to gange:

skabelon-matchende-komponent-1
Komponent 1

denne vises fire gange:

skabelon-matchende-komponent-2
Komponent 2

og denne tredje vises seks gange:

skabelon-matchende-komponent-3
komponent 3

endelig vælger vi disse tre billeder som skabeloner. Derfor reduceres kompleksiteten af denne brugssag: vi registrerer let i det mindste de objekter, der er valgt som skabeloner.

grundlæggende objektdetektering med skabelon matching

definition af skabelon

for det første definerer vi skabeloner fra:

  • en billedsti,
  • en etiket,
  • en farve (til resultatvisualisering —afgrænsningsbokse og Etiketfarve),
  • og en matchende tærskel.

for det andet mener vi, at alle billedpunkter, der har en lighedsmåling over denne tærskel, angiver en detektion for denne skabelon.

her er koden, der definerer skabeloner:

definition af skabeloner

detektering af objekt med skabelonmatchning

derefter løber vi over skabeloner for at udføre objektdetektering med skabelonmatchning for hver skabelon. Fordi vi bruger en tærskel, vælger vi en normaliseret lighedsmåling (TM_CCOEFF_NORMED), når vi anvender skabelonmatchning. Derfor kan vi vælge en tærskel mellem 0 og 1:

objektdetektering med skabelonmatchning

vi mener, at hvert punkt, der har en lighedsscore over skabelontærsklen, er det øverste venstre hjørne af et objekt (med skabelonens højde, bredde og etiket).

Visualiser detekterede objekter

derefter plotter vi de forudsagte afgrænsningsbokse for denne objektdetektering med skabelontilpasning på inputbilledet:

Vis objektdetekteringsresultater

endelig opnår vi følgende resultater:

skabelon-matching-duplicated-detected-objects
Duplicated detected objects

som angivet ved tykkelsen af kasser (i grøn, gul og rød) er hvert objekt blevet detekteret flere gange.

Fjern dubletter

Hvorfor fik vi duplikerede detektioner? Som forklaret ovenfor returnerer OpenCV-skabelontilpasning en 2— d— matrice med dimensionen af inputbilledet (en celle-og dermed en lighedsscore-for hvert inputbilledbillede).

derfor, hvis et objekt registreres et sted, vil alle omgivende billedpunkter sandsynligvis have den samme lighedsscore og således betragtes som andre objekt øverst til venstre hjørner.

for at løse dette problem sorterer vi alle detektioner ved at reducere matchende værdier. Derefter vælger vi, om vi vil validere hver detektion eller ej. Vi validerer detektionen, hvis den ikke overlapper for meget med nogen af de allerede validerede detektioner. Endelig bestemmer vi, at to detektioner overlapper hinanden, hvis krydset over foreningen af deres afgrænsningskasser er over en given tærskel. Denne proces kaldes ikke-Maksimal undertrykkelse.

her er en visuel forklaring på, hvad kryds over Union (IOU) er:

kryds over Union

her er hvordan jeg implementerede det (beregne IOU metode sammen med flere forklaringer kan findes her):

ikke-Maksimal undertrykkelse

og så tilføjede jeg lige disse to linjer efter detektionssløjfen:

Anvend NMS

som følge heraf opnår vi:

deduplicated-detected-objects
deduplicated detected objects

meget renere! Vi ser nu tydeligt, at alle første og tredje komponenter registreres uden falsk positiv (præcision og tilbagekaldelse af 1).

vi ønsker nu at reducere antallet af falske positiver for Komponent 2. Den nemmeste måde er at øge den matchende tærskel for den skabelon, der bruges til denne etiket.

valg af hyperparametre

det er selvfølgelig bedre at beregne objektdetekteringsmålinger på forskellige billeder for at vælge hyperparametre (skabelon matchende tærskel og ikke-Maksimal Undertrykkelsestærskel). For nu kan vi simpelthen øge tærsklen for Komponent 2:

Vælg skabelon matchende tærskler

og vi får:

sidste udgang
endelig udgang

vi har nu kun to falske positiver for Komponent 2, i stedet for snesevis (præcision på 2/3, tilbagekaldelse af 1)! Derudover er komponenter 1 og 2 stadig perfekt detekteret (præcision og tilbagekaldelse af 1).

for at forbedre vores resultater kunne vi:

  • Inkluder skabeloner til de komponenter, der forveksles med komponent 2.
  • prøv flere lighedsmålinger
  • anmærke et par billeder for at beregne detektionsmålinger, og udfør en gittersøgning på disse parametre.

Resume

vi har opnået objektdetektering med skabelon matching af:

  • definition af mindst en skabelon for hvert objekt (jo flere skabeloner du har til et objekt, jo mere vil din tilbagekaldelse være høj—og din præcision lav)
  • brug af OpenCV-skabelonmatchningsmetode på billedet for hver skabelon
  • i betragtning af at hvert punkt, der har en lighedsscore over en skabelontærskel, er det øverste venstre hjørne af et objekt (med denne skabelons højde, bredde og etiket)
  • anvendelse af ikke-maksimal undertrykkelse af de opnåede detektioner
  • valg af skabelontærskler for at forbedre detektionsnøjagtigheden!

det er det!

Leder du efter Billedgenkendelseseksperter? Tøv ikke med at kontakte os!

You might also like

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.