detectarea obiectelor End-to-end cu potrivirea șabloanelor folosind Python

cum se implementează detectarea obiectelor personalizate cu potrivirea șabloanelor. Nu sunt necesare date adnotate!

obiect-detectare-șablon-potrivire
detectare obiect cu șablon de potrivire pentru a detecta componente

astăzi, algoritmi de detectare a obiectelor de stat-of-the-art (algoritmi cu scopul de a detecta obiecte în imagini) folosesc rețele neuronale, cum ar fi Yolov4.

object-detection-output
o ieșire de detectare a obiectelor

potrivirea șablonului este o tehnică în procesarea digitală a imaginilor pentru găsirea unor părți mici ale unei imagini care se potrivește cu o imagine șablon. Este o soluție mult mai simplă decât o rețea neuronală pentru a efectua detectarea obiectelor. În plus, vine cu următoarele beneficii:

  • nu este nevoie să adnotați date (o sarcină consumatoare de timp și obligatorie pentru a instrui rețelele neuronale)
  • casetele de delimitare sunt mai precise
  • nu este nevoie de GPU

din experiența mea, combinarea unei rețele neuronale precum Yolov4 și detectarea obiectelor cu potrivirea șabloanelor aici este o modalitate bună de a vă îmbunătăți considerabil performanța rețelei neuronale!

ce este potrivirea șabloanelor?

când utilizați potrivirea șablonului OpenCV, șablonul glisează pixel cu pixel pe imagine. Pentru fiecare poziție, se calculează o valoare de similitudine între imaginea șablonului și partea din imagine pe care o recuperează:

template-matching-example
utilizarea potrivirii șablonului pentru a detecta ID-ul francez în documentele scanate

dacă metrica de similitudine este suficient de mare pentru un pixel, atunci acest pixel este probabil colțul din stânga sus al unui obiect care se potrivește șablonului!

în consecință, puteți obține detectarea obiectelor cu potrivirea șabloanelor numai dacă obiectele pe care încercați să le detectați sunt suficient de similare —aproape identice— într-o clasă. Puteți include în continuare mai multe șabloane pentru a aborda variațiile obiectelor (Dimensiune, Culoare, orientare). Dar va crește timpul de predicție.

la prima vedere, pare foarte restrictiv. Dar o mulțime de cazuri de utilizare a detectării obiectelor pot fi abordate cu potrivirea șabloanelor:

  • ID în documentele scanate
  • spațiu de parcare gol de la o cameră staționară
  • componente de pe o linie de asamblare…

un exemplu practic

un caz bun de utilizare pentru detectarea obiectelor folosind potrivirea șabloanelor este detectarea componentelor pe circuite imprimate, cum ar fi acesta:

circuit imprimat-unsplash
un circuit imprimat-foto de Umberto pe Unsplash

ne – am putea imagina o linie de asamblare care produce astfel de circuite. Să ne imaginăm că unele circuite fabricate lipsesc componente și, prin urmare, defecte. Am putea propune instalarea unei camere la capătul traseului și fotografierea fiecărui circuit, pentru a filtra produsele defecte. Putem realiza acest lucru cu detectarea obiectelor cu potrivirea șabloanelor!

din motive de simplitate, ne vom concentra pe detectarea câtorva componente.

o primă componentă care apare de două ori:

șablon-potrivire-component-1
Component 1

aceasta apare de patru ori:

șablon-potrivire-component-2
Component 2

și acest al treilea apare de șase ori:

șablon-potrivire-component-3
Component 3

în cele din urmă, alegem aceste trei imagini ca șabloane. În consecință, complexitatea acestui caz de utilizare este redusă: vom detecta cu ușurință cel puțin obiectele alese ca șabloane.

detectare obiect de bază cu potrivire șablon

definirea șablon

în primul rând, vom defini template-uri de la:

  • o cale de imagine,
  • o etichetă,
  • o culoare (pentru vizualizarea rezultatelor —încadrare cutii și etichete de culoare),
  • și un prag de potrivire.

în al doilea rând, considerăm că toți pixelii care au o metrică de similitudine peste acest prag indică o detectare pentru acest șablon.

iată șabloanele care definesc codul:

definirea șabloanelor

detectarea obiectului cu potrivirea șablonului

apoi, vom trece peste șabloane pentru a efectua detectarea obiectelor cu potrivirea șablonului pentru fiecare șablon. Deoarece folosim un prag, selectăm o metrică de similitudine normalizată (TM_CCOEFF_NORMED) atunci când aplicăm potrivirea șablonului. Prin urmare, putem alege un prag între 0 și 1:

detectarea obiectelor cu potrivirea șablonului

considerăm că fiecare pixel care are un scor de similitudine deasupra pragului șablonului este colțul din stânga sus al unui obiect (cu înălțimea, lățimea și eticheta șablonului).

Vizualizați obiectele detectate

apoi, trasăm casetele de delimitare prezise ale acestei detectări de obiecte cu potrivirea șablonului pe imaginea de intrare:

afișează rezultatele detectării obiectelor

în cele din urmă, obținem următoarele rezultate:

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

după cum este indicat de grosimea cutiilor (în verde, Galben și roșu), fiecare obiect a fost detectat de mai multe ori.

eliminați duplicatele

de ce am obținut detectări duplicate? După cum sa explicat mai sus, potrivirea șablonului OpenCV returnează o matrice 2-D având dimensiunea imaginii de intrare (o celulă— și astfel un scor de similitudine— pentru fiecare pixel de imagine de intrare).

prin urmare, dacă un obiect este detectat într-o singură locație, toți pixelii din jur vor avea cel mai probabil același scor de similitudine și, prin urmare, vor fi considerați ca alte colțuri din stânga sus ale obiectului.

pentru a aborda această problemă, vom sorta toate detectiile prin scăderea valorilor de potrivire. Apoi, vom alege dacă validăm sau nu fiecare detectare. Validăm detectarea dacă nu se suprapune prea mult cu niciuna dintre detectările deja validate. În cele din urmă, determinăm că două detectări se suprapun dacă intersecția peste unirea cutiilor lor de încadrare este peste un anumit prag. Acest proces se numește suprimare non-maximă.

iată o explicație vizuală a ceea ce intersecție peste Uniune (IoU) este:

intersecție peste Uniune

Iată cum am implementat-o (metoda compute IoU împreună cu mai multe explicații pot fi găsite aici):

suprimarea non-maximă

și apoi, am adăugat aceste două linii după bucla de detectare:

aplicați NMS

ca rezultat, obținem:

deduplicate-detectate-obiecte
deduplicate detectate obiecte

mult mai curat! Acum vedem clar că toate primele și a treia componente sunt detectate fără fals pozitiv (precizie și rechemare a 1).

acum vrem să reducem numărul de fals pozitive pentru componenta 2. Cea mai ușoară modalitate este de a crește pragul de potrivire pentru șablonul utilizat pentru această etichetă.

alegerea hiperparametrilor

este, desigur, mai bine să calculați valorile de detectare a obiectelor pe diferite imagini pentru a alege hiperparametrii (pragul de potrivire a șablonului și pragul de suprimare non-maxim). Deocamdată, putem crește pur și simplu pragul pentru componentă 2:

alegeți pragurile de potrivire a șabloanelor

și obținem:

ultima-ieșire
ieșire finală

acum avem doar două fals pozitive pentru componenta 2, în loc de zeci (precizie de 2/3, rechemare de 1)! În plus, componentele 1 și 2 sunt încă perfect detectate (precizie și rechemare a 1).

pentru a ne îmbunătăți rezultatele am putea:

  • includeți șabloane pentru componentele confundate cu componenta 2.
  • încercați mai multe valori de similitudine
  • adnotați câteva imagini pentru a calcula valorile de detectare și efectuați o căutare în grilă a acestor parametri.

rezumat

am realizat detectarea obiectelor cu potrivirea șablonului prin:

  • definirea a cel puțin unui șablon pentru fiecare obiect (cu cât aveți mai multe șabloane pentru un obiect, cu atât rechemarea dvs. va fi mai mare și precizia dvs. scăzută)
  • folosind metoda de potrivire a șablonului OpenCV pe imagine pentru fiecare șablon
  • având în vedere că fiecare pixel care are un scor de similitudine peste un prag de șablon este colțul din stânga sus al unui obiect (cu înălțimea, lățimea și eticheta acestui șablon)
  • aplicarea suprimării non—maxime a detectărilor obținute
  • alegerea pragurilor șablonului pentru îmbunătățirea preciziei detectării!

asta e!

căutați experți în recunoașterea imaginilor? Nu ezitați să ne contactați!

You might also like

Lasă un răspuns

Adresa ta de email nu va fi publicată.