End-to-End-Objekterkennung mit Template Matching mit Python

So implementieren Sie eine benutzerdefinierte Objekterkennung mit Template Matching. Keine kommentierten Daten erforderlich!

object-detection-template-Matching
Objekterkennung mit Template-Matching zur Erkennung von Komponenten

Moderne Objekterkennungsalgorithmen (Algorithmen zur Erkennung von Objekten in Bildern) verwenden heute neuronale Netze wie Yolov4.

Objekterkennungsausgabe
Eine Objekterkennungsausgabe

Template Matching ist eine Technik in der digitalen Bildverarbeitung zum Auffinden kleiner Teile eines Bildes, die mit einem Vorlagenbild übereinstimmen. Es ist eine viel einfachere Lösung als ein neuronales Netzwerk, um die Objekterkennung durchzuführen. Darüber hinaus bietet es folgende Vorteile:

  • keine Notwendigkeit, Daten zu kommentieren (eine zeitaufwändige und obligatorische Aufgabe zum Trainieren neuronaler Netze)
  • Begrenzungsrahmen sind genauer
  • keine GPU erforderlich

Meiner Erfahrung nach ist die Kombination eines neuronalen Netzwerks wie Yolov4 und der Objekterkennung mit dem Template-Matching hier eine gute Möglichkeit, die Leistung Ihres neuronalen Netzwerks erheblich zu verbessern!

Was ist Template Matching?

Wenn Sie den OpenCV-Vorlagenabgleich verwenden, wird Ihre Vorlage Pixel für Pixel auf Ihrem Bild verschoben. Für jede Position wird eine Ähnlichkeitsmetrik zwischen Ihrem Vorlagenbild und dem wiederhergestellten Teil des Bildes berechnet:

 template-matching-example
Verwenden des Template-Matchings zum Erkennen der französischen ID in gescannten Dokumenten

Wenn die Ähnlichkeitsmetrik für ein Pixel hoch genug ist, ist dieses Pixel wahrscheinlich die obere linke Ecke eines Objekts, das Ihrer Vorlage entspricht!

Folglich können Sie die Objekterkennung mit Template Matching nur erreichen, wenn die Objekte, die Sie zu erkennen versuchen, innerhalb einer Klasse ähnlich genug — fast identisch — sind. Sie können noch weitere Vorlagen hinzufügen, um Objektvariationen (Größe, Farbe, Ausrichtung) zu bewältigen. Aber es wird die Vorhersagezeit erhöhen.

Auf den ersten Blick scheint es sehr restriktiv. Viele Anwendungsfälle der Objekterkennung können jedoch mit Template Matching angegangen werden:

  • ID in gescannten Dokumenten
  • leerer Parkplatz von einer stationären Kamera
  • Komponenten am Fließband…

Ein praktisches Beispiel

Ein guter Anwendungsfall für die Objekterkennung mit Template Matching ist die Erkennung von Komponenten auf gedruckten Schaltungen, wie dieser:

printed-circuit-unsplash
Ein gedrucktes Schaltungsfoto von Umberto auf Unsplash

Wir könnten uns eine Montagelinie vorstellen, die solche Schaltungen herstellt. Stellen wir uns vor, dass bei einigen hergestellten Schaltungen Komponenten fehlen und somit defekt sind. Wir könnten vorschlagen, am Ende des Weges eine Kamera zu installieren und jede Schaltung zu fotografieren, um fehlerhafte Produkte herauszufiltern. Wir können dies mit Objekterkennung mit Template Matching erreichen!

Der Einfachheit halber konzentrieren wir uns auf die Erkennung einiger Komponenten.

Eine erste Komponente erscheint zweimal:

 template-matching-component-1
Komponente 1

Dieser erscheint viermal:

 template-matching-component-2
Komponente 2

Und dieser dritte erscheint sechsmal:

 template-matching-component-3
Komponente 3

Schließlich wählen wir diese drei Bilder als Vorlagen. Folglich wird die Komplexität dieses Anwendungsfalls reduziert: Wir werden zumindest die als Vorlagen ausgewählten Objekte leicht erkennen.

Grundlegende Objekterkennung mit Template Matching

Template definieren

Zunächst definieren wir Templates aus:

  • ein Bildpfad,
  • eine Beschriftung,
  • eine Farbe (für die Ergebnisvisualisierung — Begrenzungsrahmen und Beschriftungsfarbe),
  • und ein übereinstimmender Schwellenwert.

Zweitens gehen wir davon aus, dass alle Pixel mit einer Ähnlichkeitsmetrik oberhalb dieses Schwellenwerts eine Erkennung für diese Vorlage anzeigen.

Hier ist der Code, der Vorlagen definiert:

Definieren von Vorlagen

Erkennen von Objekten mit Vorlagenübereinstimmung

Anschließend durchlaufen wir Vorlagen, um die Objekterkennung mit Vorlagenübereinstimmung für jede Vorlage durchzuführen. Da wir einen Schwellenwert verwenden, wählen wir beim Anwenden des Vorlagenabgleichs eine normalisierte Ähnlichkeitsmetrik (TM_CCOEFF_NORMED) aus. Daher können wir einen Schwellenwert zwischen 0 und 1 auswählen:

Objekterkennung mit Template Matching

Wir gehen davon aus, dass jedes Pixel mit einem Ähnlichkeitswert über dem Template-Schwellenwert die obere linke Ecke eines Objekts ist (mit der Höhe, Breite und Beschriftung der Vorlage).

Erkannte Objekte visualisieren

Dann zeichnen wir die vorhergesagten Begrenzungsrahmen dieser Objekterkennung mit Template Matching auf das Eingabebild:

Ergebnisse der Objekterkennung anzeigen

Schließlich erhalten wir die folgenden Ergebnisse:

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

Wie durch die Dicke der Kästchen (in grün, gelb und rot) angezeigt, wurde jedes Objekt mehrmals erkannt.

Duplikate entfernen

Warum haben wir doppelte Erkennungen erhalten? Wie oben erläutert, gibt OpenCV Template Matching eine 2D-Matrix mit der Dimension des Eingabebildes zurück (eine Zelle — und damit eine Ähnlichkeitsbewertung — für jedes Eingabebildpixel).

Wenn also ein Objekt an einem Ort erkannt wird, haben alle umgebenden Pixel höchstwahrscheinlich den gleichen Ähnlichkeitswert und werden daher als andere Ecken des Objekts oben links betrachtet.

Um dieses Problem zu beheben, werden wir alle Erkennungen sortieren, indem wir die übereinstimmenden Werte verringern. Anschließend entscheiden wir, ob jede Erkennung validiert werden soll oder nicht. Wir validieren die Erkennung, wenn sie sich nicht zu stark mit einer der bereits validierten Erkennungen überlappt. Schließlich stellen wir fest, dass sich zwei Erkennungen überlappen, wenn der Schnittpunkt über der Vereinigung ihrer Begrenzungsrahmen über einem bestimmten Schwellenwert liegt. Dieser Vorgang wird als nicht maximale Unterdrückung bezeichnet.

Hier ist eine visuelle Erklärung, was Intersection over Union (IoU) ist:

Schnittpunkt über Union

So habe ich es implementiert (compute IoU-Methode zusammen mit weiteren Erklärungen finden Sie hier):

Nicht maximale Unterdrückung

Und dann habe ich diese beiden Zeilen nach der Erkennungsschleife hinzugefügt:

NMS anwenden

Als Ergebnis erhalten wir:

Deduplizierte-erkannte-Objekte
Deduplizierte erkannte Objekte

Viel sauberer! Wir sehen jetzt deutlich, dass alle ersten und dritten Komponenten ohne falsch positives Ergebnis erkannt werden (Genauigkeit und Rückruf von 1).

Wir möchten nun die Anzahl der Fehlalarme für Komponente 2 reduzieren. Am einfachsten ist es, den Übereinstimmungsschwellenwert für die für dieses Label verwendete Vorlage zu erhöhen.

Auswahl von Hyperparametern

Es ist natürlich besser, Objekterkennungsmetriken für verschiedene Bilder zu berechnen, um Hyperparameter auszuwählen (Template matching threshold und Non-Maximum Suppression threshold). Im Moment können wir einfach den Schwellenwert für die Komponente erhöhen 2:

Wählen Sie template matching:

Und wir erhalten:

 last-output
Final output

Wir haben jetzt nur noch zwei Fehlalarme für Komponente 2 anstelle von Dutzenden (Genauigkeit von 2/3, Rückruf von 1)! Darüber hinaus werden die Komponenten 1 und 2 immer noch perfekt erkannt (Präzision und Rückruf von 1).

Um unsere Ergebnisse zu verbessern, könnten wir:

  • fügen Sie Vorlagen für die mit Komponente 2 verknüpften Komponenten hinzu.
  • versuchen Sie mehrere Ähnlichkeitsmetriken
  • Kommentieren Sie einige Bilder, um Erkennungsmetriken zu berechnen, und führen Sie eine Rastersuche für diese Parameter durch.

Zusammenfassung

Wir haben die Objekterkennung mit Template Matching erreicht durch:

  • Definieren von mindestens einer Vorlage für jedes Objekt (je mehr Vorlagen Sie für ein Objekt haben, desto höher ist Ihre Genauigkeit — und desto geringer ist Ihre Genauigkeit)
  • Verwenden der OpenCV-Vorlagenanpassungsmethode für das Bild für jede Vorlage
  • Wenn man bedenkt, dass jedes Pixel mit einem Ähnlichkeitswert über einem Vorlagenschwellenwert die obere linke Ecke eines Objekts ist (mit der Höhe, Breite und Beschriftung dieser Vorlage)
  • Anwenden einer nicht maximalen Unterdrückung der erhaltenen Erkennungen
  • Auswahl von Template-Schwellenwerten zur Verbesserung der Erkennungsgenauigkeit!

Das war’s!

Sie suchen Experten für Bilderkennung? Zögern Sie nicht, uns zu kontaktieren!

You might also like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.