aangepaste objectdetectie met template matching implementeren. Geen geannoteerde gegevens nodig!
tegenwoordig maken state-of-the-art algoritmes voor objectdetectie (algoritmes die objecten in afbeeldingen willen detecteren) gebruik van neurale netwerken zoals Yolov4.
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:
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:
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:
Deze verschijnt vier keer:
En deze derde verschijnt zes keer:
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:
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:
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:
ten slotte krijgen we de volgende resultaten:
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:
hier is hoe ik het geà mplementeerd (compute IoU methode samen met meer uitleg kan hier gevonden worden):
en vervolgens heb ik deze twee regels toegevoegd na de detectielus:
toe.:
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:
en we verkrijgen:
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!