End-to-end objectdetectie met Template Matching met behulp van Python

aangepaste objectdetectie met template matching implementeren. Geen geannoteerde gegevens nodig!

object-detection-template-matching
Object-detection met Template matching voor het detecteren van componenten

tegenwoordig maken state-of-the-art algoritmes voor objectdetectie (algoritmes die objecten in afbeeldingen willen detecteren) gebruik van neurale netwerken zoals Yolov4.

objectdetectie-uitvoer
een objectdetectie-uitvoer

Template matching is een techniek in digitale beeldverwerking voor het vinden van kleine delen van een afbeelding die overeenkomt met een sjabloonafbeelding. Het is een veel eenvoudiger oplossing dan een neuraal netwerk om objectdetectie uit te voeren. Bovendien, het komt met de volgende voordelen:

  • het is niet nodig om gegevens te annoteren (een tijdrovende en verplichte taak om neurale netwerken te trainen)
  • bounding boxes zijn nauwkeuriger
  • GPU

in mijn ervaring is het combineren van een neuraal netwerk zoals Yolov4 en objectdetectie met template matching een goede manier om de prestaties van uw neurale netwerk aanzienlijk te verbeteren!

Wat is sjabloon-overeenkomst?

wanneer u OpenCV template matching gebruikt, schuift uw template pixel voor pixel op uw afbeelding. Voor elke positie wordt een vergelijkingsmetrie berekend tussen uw sjabloonafbeelding en het deel van de afbeelding dat het herstelt:

template-matching-example
template matching gebruiken om Franse ID te detecteren in gescande documenten

als de vergelijkingsmetrie hoog genoeg is voor één pixel, dan is deze pixel waarschijnlijk de linkerbovenhoek van een object dat overeenkomt met uw sjabloon!

bijgevolg kunt u objectdetectie met sjabloonmatching alleen bereiken als de objecten die u probeert te detecteren gelijk genoeg zijn —bijna identiek— binnen een klasse. U kunt nog steeds meer sjablonen toevoegen om objectvariaties (grootte, kleur, oriëntatie) aan te pakken. Maar het zal de voorspellingstijd verhogen.

op het eerste gezicht lijkt het zeer beperkend. Maar veel object detectie use cases kunnen worden aangepakt met template matching:

  • ID in gescande documenten
  • lege parkeerplaats van een stationaire camera
  • onderdelen op een assemblagelijn…

een praktisch voorbeeld

een goed voorbeeld voor objectdetectie met template matching is het detecteren van componenten op gedrukte schakelingen, zoals deze:

printed-circuit-unsplash
een printed circuit-Foto van Umberto op Unsplash

we zouden ons een lopende band kunnen voorstellen die dergelijke circuits produceert. Laten we ons voorstellen dat sommige circuits zijn ontbrekende componenten en dus defect. We zouden kunnen voorstellen om een camera te installeren aan het einde van de trail en om elk circuit te schieten, om te filteren defecte producten. We kunnen dit bereiken met objectdetectie met template matching!

omwille van de eenvoud zullen we ons concentreren op de detectie van enkele componenten.

Een eerste component verschijnt twee keer:

template matching-component-1
Component 1

Deze verschijnt vier keer:

template matching-component-2
Component 2

En deze derde verschijnt zes keer:

template matching-component-3
Component 3

ten Slotte kiezen we deze drie afbeeldingen als sjablonen. Hierdoor wordt de complexiteit van deze use case verminderd: we zullen op zijn minst de objecten die als sjablonen zijn gekozen gemakkelijk detecteren.

Basisobjectdetectie met template matching

Defining template

Ten eerste definiëren we templates van:

  • een afbeeldingspad,
  • een label,
  • een kleur (voor resultaatweergave-bounding boxes en labels color),
  • en een overeenkomende drempel.

ten tweede zijn we van mening dat alle pixels met een vergelijkingsmetriek boven deze drempel een detectie voor deze sjabloon aangeven.

hier is de code die sjablonen definieert:

sjablonen

object detecteren met template matching

vervolgens lus je sjablonen om objectdetectie uit te voeren met template matching voor elke sjabloon. Omdat we een drempel gebruiken, selecteren we een genormaliseerde similarity metric (TM_CCOEFF_NORMED) bij het toepassen van template matching. Daarom kunnen we een drempel tussen 0 en 1 kiezen:

objectdetectie met template matching

wij beschouwen elke pixel met een gelijkvormigheidsscore boven de template drempel als de linkerbovenhoek van een object (met de hoogte, breedte en label van de template).

gedetecteerde objecten visualiseren

vervolgens plotten we de voorspelde bounding boxes van deze objectdetectie met template matching op de invoerafbeelding:

objectdetectieresultaten

ten slotte krijgen we de volgende resultaten:

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

zoals aangegeven door de dikte van de vakken (in groen, geel en rood), is elk object meerdere malen gedetecteerd.

duplicaten verwijderen

Waarom hebben we Dubbele detecties verkregen? Zoals hierboven uitgelegd, geeft OpenCV template matching een 2-D matrix terug met de dimensie van de invoerafbeelding (één cel— en dus één gelijkvormigheidsscore— voor elke invoerafbeeldpixel).

daarom, als een object wordt gedetecteerd op één locatie, zullen alle omliggende pixels waarschijnlijk dezelfde gelijkvormigheidsscore hebben, en dus beschouwd worden als een ander object linkerbovenhoek.

om dit probleem aan te pakken, zullen we alle detecties sorteren door overeenkomende waarden te verlagen. Dan zullen we kiezen of we elke detectie al dan niet valideren. We valideren de detectie als deze niet te veel overlapt met een van de reeds gevalideerde detecties. Tot slot stellen we vast dat twee detecties elkaar overlappen als de kruising over de Vereniging van hun bounding boxes boven een bepaalde drempel ligt. Dit proces wordt niet-maximale onderdrukking genoemd.

hier is een visuele verklaring van wat snijpunt over Unie (IoU) is:

snijpunt over Unie

hier is hoe ik het geà mplementeerd (compute IoU methode samen met meer uitleg kan hier gevonden worden):

niet-maximale onderdrukking

en vervolgens heb ik deze twee regels toegevoegd na de detectielus:

pas NMS

toe.:

gededupliceerde-gedetecteerde-objecten
gededupliceerde gedetecteerde objecten

veel schoner! We zien nu duidelijk dat alle eerste en derde componenten worden gedetecteerd zonder vals-positief (precisie en recall van 1).

we willen nu het aantal false positieven voor component 2 verminderen. De makkelijkste manier is om de overeenkomende drempel te verhogen voor de sjabloon die voor dit label wordt gebruikt.

het kiezen van hyperparameters

het is natuurlijk beter om objectdetectiegegevens te berekenen op verschillende afbeeldingen om hyperparameters te kiezen (template matching threshold en Non-Maximum Suppression threshold). Voor nu kunnen we gewoon de drempel voor component verhogen 2:

kies template matching drempels

en we verkrijgen:

last-output
Final output

we hebben nu slechts twee valse positieven voor component 2, in plaats van tientallen (precisie van 2/3, terugroepen van 1)! Bovendien worden componenten 1 en 2 nog perfect gedetecteerd (precisie en terugroepen van 1).

om onze resultaten te verbeteren konden we:

  • omvatten sjablonen voor de componenten verward met component 2.
  • Probeer verschillende gelijkvormigheidsmetingen
  • annoteer enkele afbeeldingen om detectiemetingen te berekenen en voer een rasterzoekopdracht uit op deze parameters.

samenvatting

we hebben objectdetectie bereikt met template matching door:

  • definiëren van ten minste één sjabloon voor elk object (de meer sjablonen die u hebt voor een object het meer de recall zal worden hoge en je lage precisie)
  • het gebruik van OpenCV template matching methode op de afbeelding voor elke template
  • gezien het feit dat elke pixel een gelijkenis score boven een sjabloon drempel is de linkerbovenhoek van een object (met dit sjabloon hoogte, breedte en het label)
  • de toepassing van Niet-Maximale Onderdrukking van de detecties verkregen
  • sjabloon selecteren drempels te verbeteren detectie nauwkeurigheid!

dat is het!

bent u op zoek naar Beeldherkenningsexperts? Aarzel niet om ons te contacteren!

You might also like

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.