So implementieren Sie eine benutzerdefinierte Objekterkennung mit Template Matching. Keine kommentierten Daten erforderlich!
Moderne Objekterkennungsalgorithmen (Algorithmen zur Erkennung von Objekten in Bildern) verwenden heute neuronale Netze wie Yolov4.
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:
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:
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:
Dieser erscheint viermal:
Und dieser dritte erscheint sechsmal:
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:
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:
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:
Schließlich erhalten wir die folgenden Ergebnisse:
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:
So habe ich es implementiert (compute IoU-Methode zusammen mit weiteren Erklärungen finden Sie hier):
Und dann habe ich diese beiden Zeilen nach der Erkennungsschleife hinzugefügt:
Als Ergebnis erhalten wir:
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:
Und wir erhalten:
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!