End-to-end Object Detection with Template Matching using Python

How to implement custom object detection with template matching. Ei merkintöjä tietoja tarvitaan!

object-detection-template-matching
Object detection with Template matching to detect components

nykyään huipputekniset objektintunnistusalgoritmit (algoritmit, jotka pyrkivät havaitsemaan objekteja kuvissa) käyttävät neuroverkkoja, kuten Yolov4.

object-detection-output
an object detection output

Template matching on digitaalisessa kuvankäsittelyssä käytettävä tekniikka, jolla etsitään pieniä osia kuvasta, jotka vastaavat mallikuvaa. Se on paljon yksinkertaisempi ratkaisu kuin neuroverkko objektin havaitsemiseen. Lisäksi siinä on seuraavat edut:

  • ei tarvitse merkitä tietoja (aikaa vievä ja pakollinen tehtävä neuroverkkojen kouluttamiseksi)
  • rajausrasiat ovat tarkempia
  • ei tarvetta GPU: lle

kokemukseni mukaan yolov4: n kaltaisen neuroverkon ja objektien tunnistuksen yhdistäminen tähän vastaavaan malliin on hyvä tapa parantaa neuroverkon suorituskykyä huomattavasti!

mikä on mallin vastaavuus?

kun käytät OpenCV-mallin yhteensopivuutta, mallisi liukuu kuvapisteittäin kuvaasi. Jokaiselle paikalle lasketaan yhtäläisyysmittari mallikuvan ja sen kuvan osan välille, jonka se palauttaa:

template-matching-esimerkki
käyttäen mallipohjasovitusta ranskalaisen ID: n tunnistamiseen skannatuissa asiakirjoissa

jos samankaltaisuusmittari on riittävän korkea yhdelle pikselille, tämä pikseli on todennäköisesti mallipohjaasi vastaavan kohteen vasemmassa yläkulmassa!

näin ollen voit saavuttaa objektin tunnistuksen mallipohjan vastaavuudella vain, jos kohteet, joita yrität havaita, ovat tarpeeksi samanlaisia —lähes identtisiä— luokassa. Voit silti sisällyttää enemmän malleja puuttua objektin vaihtelut (Koko, väri, suunta). Mutta se lisää ennusteaikaa.

ensi silmäyksellä se vaikuttaa hyvin rajoittavalta. Mutta paljon object detection käyttötapauksia voidaan käsitellä mallin matching:

  • tunniste skannatuissa asiakirjoissa
  • paikallaan olevan kameran tyhjä parkkipaikka
  • kokoonpanolinjalla olevat komponentit…

käytännön esimerkki

hyvä käyttötapaus objektin havaitsemiseksi mallipohjasovituksen avulla on havaita painettujen piirien komponentit, kuten tämä:

printed-circuit-unsplash
a printed circuit – Photo by Umberto on Unsplash

voisimme kuvitella kokoonpanolinjan tuottavan tällaisia piirejä. Kuvitellaan, että jotkut piirit valmistetaan puuttuvat komponentit ja siten viallinen. Voisimme ehdottaa kameran asentamista polun päähän ja jokaisen piirin kuvaamista viallisten tuotteiden suodattamiseksi. Voimme saavuttaa tämän objektin tunnistuksen kanssa malli matching!

yksinkertaisuuden vuoksi keskitymme muutamien komponenttien havaitsemiseen.

kahdesti ilmestynyt ensimmäinen komponentti:

template-matching-component-1
Component 1

tämä esiintyy neljä kertaa:

template-matching-component-2
Component 2

ja tämä kolmas ilmestyi kuusi kertaa:

template-matching-component-3
Component 3

lopuksi valitsemme nämä kolme kuvaa malleiksi. Näin ollen tämän käyttötapauksen monimutkaisuus vähenee: tunnistamme helposti ainakin malleiksi valitut kohteet.

basic object detection with template matching

Defining template

Firstly, we define templates from:

  • kuvapolku,
  • etiketti,
  • a väri (tuloksen visualisointiin —rajaavat laatikot ja etiketit väri),
  • ja vastaava raja.

toiseksi katsomme, että kaikki pikselit, joiden samankaltaisuus metriikka ylittää tämän kynnyksen, osoittavat havainnon tälle mallille.

tässä on mallin määrittelevä koodi:

määrittelevät mallit

havaitsemme objektin mallipohjan kanssa, joka vastaa

sitten, me loop over-mallineet, jotta voimme suorittaa objektin tunnistuksen mallipohjan kanssa. Koska käytämme kynnysarvoa, valitsemme normalisoidun samankaltaisuuden metriikan (TM_CCOEFF_NORMED) sovellettaessa mallin yhteensopivuutta. Näin ollen voimme valita kynnyksen välillä 0 ja 1:

Object detection with template matching

katsomme, että jokainen pikseli, jonka samankaltaisuuspistemäärä ylittää mallin kynnyksen, on objektin vasen yläkulma (mallin korkeus, leveys ja etiketti).

visualisoi havaitut objektit

sitten kuvaamme tämän objektin havaitsemisen ennustetut rajausruudut mallipohjan kanssa, joka vastaa syötekuvaa:

Näytä kohteen tunnistustulokset

lopuksi saadaan seuraavat tulokset:

template-matching-duplicated-detected-objects
Duplicated detected objects

kuten laatikoiden paksuudesta (vihreänä, keltaisena ja punaisena) ilmenee, jokainen kohde on havaittu useita kertoja.

Poista kaksoiskappaleet

miksi saimme kaksoiskappaleet? Kuten edellä on selitetty, OpenCV-mallin matching palauttaa 2— D— matriisin, jolla on syötekuvan ulottuvuus (yksi solu-ja siten yksi samankaltaisuuspiste-jokaista syötekuvan kuvapistettä kohti).

näin ollen, jos kohde havaitaan yhdessä paikassa, kaikilla ympäröivillä pikseleillä on todennäköisesti sama samankaltaisuuspistemäärä, ja niitä pidetään siten muina kohteina vasemmanpuoleisina yläkulmina.

tämän ongelman ratkaisemiseksi lajittelemme kaikki havainnot pienentämällä vastaavia arvoja. Sitten valitsemme, vahvistammeko jokaisen havainnon vai emme. Vahvistamme havainnon, jos se ei ole liian päällekkäinen jonkin jo vahvistetun havainnon kanssa. Lopuksi päätämme, että kaksi detections ovat päällekkäisiä, jos risteysalueiden yli unionin niiden rajaavat laatikot on yli tietyn kynnysarvon. Tätä prosessia kutsutaan ei-maksimaaliseksi tukahduttamiseksi.

tässä on visuaalinen selitys sille, mikä leikkauspiste unionin (IoU) yläpuolella on:

Intersection over Union

Here is how I implemented it (compute IoU method with more explanations can be found here):

Non-Maximum Suppression

And then, I just added these two lines after the detection loop:

sovelletaan NMS

tuloksena saadaan:

deduplicated-detected-objects
Deduplicated detected objects

Much cleaner! Nyt näemme selvästi, että kaikki ensimmäinen ja kolmas komponentti havaitaan ilman vääriä positiivisia (tarkkuus ja takaisinkutsu 1).

haluamme nyt vähentää osan 2 väärien positiivien määrää. Helpoin tapa on lisätä vastaavuuskynnystä tähän merkintään käytetylle mallille.

valitsemalla hyperparametrit

on tietenkin parempi laskea objektin tunnistusmittarit eri kuville, jotta voidaan valita hyperparametrit (mallinefragmentointikynnys ja ei-maksimaalinen Vaimennuskynnys). Nyt voimme yksinkertaisesti nostaa kynnystä komponentti 2:

valitse mallin vastaavuus kynnysarvot

ja saamme:

viimeinen lähtö
lopullinen lähtö

meillä on nyt vain kaksi väärää positiivista komponenttia 2, kymmenien sijaan (tarkkuus 2/3, takaisinkutsu 1)! Lisäksi osat 1 ja 2 havaitaan edelleen täydellisesti (tarkkuus ja takaisinkutsu 1).

tulosten parantamiseksi voisimme:

  • sisällytä malleja komponenttien virheellinen komponentti 2.
  • kokeile useita samankaltaisuuden mittareita
  • merkitse muistiin muutama kuva tunnistusmittareiden laskemiseksi ja suorita ruutuhaku näille parametreille.

Yhteenveto

olemme saavuttaneet objektin tunnistuksen mallipohjan kanssa:

  • vähintään yhden mallin määrittäminen kutakin objektia varten (mitä enemmän mallineita sinulla on yhdelle kohteelle, sitä enemmän palautuksesi on korkea—ja tarkkuutesi Alhainen)
  • käyttäen OpenCV-mallineenosoitusmenetelmää kunkin mallin kuvalle
  • ottaen huomioon, että jokainen pikseli, jonka samankaltaisuusaste ylittää mallinimen kynnyksen, on objektin vasen yläkulma (tämän mallin korkeus, leveys ja etiketti)
  • käyttämällä ei-maksimaalista estoa

  • valitsemalla mallikynnykset havaitsemistarkkuuden parantamiseksi!

That ’ s it!

Etsitkö kuvantunnistuksen asiantuntijoita? Älä epäröi ottaa yhteyttä!

You might also like

Vastaa

Sähköpostiosoitettasi ei julkaista.