Frage Bildverarbeitung: Algorithmus Verbesserung für "Coca-Cola Can" Anerkennung


Eines der interessantesten Projekte, an denen ich in den letzten Jahren gearbeitet habe, war ein Projekt über Bildverarbeitung. Ziel war es, ein System zu entwickeln, um Coca-Cola erkennen zu können 'Büchsen' (Beachten Sie, dass ich das Wort "Dosen" betone, Sie werden sehen, warum in einer Minute). Unten sehen Sie ein Beispiel, in dem die Dose erkannt wird grünes Rechteck mit Maßstab und Rotation.

Template matching

Einige Einschränkungen für das Projekt:

  • Der Hintergrund könnte sehr laut sein.
  • Das kann könnte irgendwas haben Rahmen oder Drehung oder sogar Orientierung (innerhalb angemessener Grenzen).
  • Das Bild könnte ein gewisses Maß an Unschärfe aufweisen (Konturen sind möglicherweise nicht ganz gerade).
  • Es könnte Coca-Cola-Flaschen im Bild sein, und der Algorithmus sollte nur die kann!
  • Die Helligkeit des Bildes kann stark variieren (Sie können sich also nicht zu sehr auf die Farberkennung verlassen).
  • Das kann könnte teilweise an den Seiten oder in der Mitte versteckt und möglicherweise teilweise hinter einer Flasche versteckt sein.
  • Es könnte nein sein kann überhaupt in dem Bild, in welchem ​​Fall Sie nichts finden mussten und eine Nachricht schreiben, die so sagt.

Sie könnten also knifflige Dinge wie diesen haben (was in diesem Fall mein Algorithmus total gescheitert hat):

Total fail

Ich habe dieses Projekt vor einer Weile gemacht und hatte eine Menge Spaß dabei, und ich hatte eine anständige Implementierung. Hier sind einige Details zu meiner Implementierung:

Sprache: Fertig in C ++ mit OpenCV Bibliothek.

VorverarbeitungFür die Bildvorverarbeitung, d. H. Das Transformieren des Bildes in eine rohere Form, die dem Algorithmus gegeben wird, verwendete ich zwei Methoden:

  1. Ändern der Farbdomäne von RGB in HSV und Filtern basierend auf "rotem" Farbton, Sättigung über einem bestimmten Schwellenwert, um orangefarbene Farben zu vermeiden, und Filtern mit niedrigem Wert, um dunkle Töne zu vermeiden. Das Endergebnis war ein binäres Schwarzweißbild, bei dem alle weißen Pixel die Pixel darstellten, die diesem Schwellenwert entsprachen. Offensichtlich gibt es immer noch eine Menge Mist im Bild, aber das reduziert die Anzahl der Dimensionen, mit denen Sie arbeiten müssen. Binarized image 
  2. Rauschfilterung unter Verwendung der Medianfilterung (wobei der mittlere Pixelwert aller Nachbarn genommen wird und das Pixel durch diesen Wert ersetzt wird), um Rauschen zu reduzieren.
  3. Verwenden Canny Kantenerkennung Filter um die Konturen aller Gegenstände nach 2 vorhergehenden Schritten zu erhalten. Contour detection

Algorithmus: Der Algorithmus selbst, den ich für diese Aufgabe gewählt habe, stammt aus Dies Tolles Buch über Feature Extraction und aufgerufen Generalisierte Hough-Transformation (ziemlich anders als die normale Hough Transformation). Es sagt im Grunde ein paar Dinge:

  • Sie können ein Objekt im Raum beschreiben, ohne seine analytische Gleichung zu kennen (was hier der Fall ist).
  • Es ist resistent gegen Bildverformungen wie Skalierung und Rotation, da es Ihr Bild grundsätzlich auf jede Kombination aus Skalierungsfaktor und Rotationsfaktor testet.
  • Es verwendet ein Basismodell (eine Vorlage), das der Algorithmus "lernt".
  • Jedes Pixel, das im Konturbild verbleibt, wird für ein anderes Pixel stimmen, das vermutlich das Zentrum (in Bezug auf die Schwerkraft) Ihres Objekts sein wird, basierend auf dem, was es aus dem Modell gelernt hat.

Am Ende erhält man eine Heatmap der Stimmen, zum Beispiel werden hier alle Pixel der Kontur der Dose für ihr Gravitationszentrum stimmen, also wirst du viele Stimmen in dem gleichen Pixel haben, das dem entspricht zentrieren und sehen einen Peak in der Heatmap wie folgt:

GHT

Sobald Sie das haben, kann Ihnen eine einfache threshold-basierte Heuristik die Position des zentralen Pixels geben, aus der Sie die Skalierung und Rotation ableiten und dann Ihr kleines Rechteck um sie zeichnen können (Endwert und Rotationsfaktor sind natürlich relativ zu Ihrem Originalvorlage). In der Theorie zumindest ...

ErgebnisseNun, während dieser Ansatz in den grundlegenden Fällen funktionierte, fehlte es in einigen Bereichen stark:

  • Es ist extrem langsam! Ich betone das nicht genug. Fast ein ganzer Tag war nötig, um die 30 Testbilder zu verarbeiten, offensichtlich weil ich einen sehr hohen Skalierungsfaktor für Rotation und Translation hatte, da einige der Dosen sehr klein waren.
  • Es war völlig verloren, wenn Flaschen im Bild waren, und aus irgendeinem Grund fand fast immer die Flasche statt der Dose (vielleicht weil Flaschen größer waren, hatte also mehr Pixel, also mehr Stimmen)
  • Fuzzy-Bilder waren auch nicht gut, da die Stimmen in Pixeln an zufälligen Orten um das Zentrum herum landeten und so mit einer sehr lauten Heat Map endeten.
  • Invarianz in Translation und Rotation wurde erreicht, aber nicht in Ausrichtung, was bedeutet, dass eine Dose, die nicht direkt auf das Kameraobjektiv gerichtet war, nicht erkannt wurde.

Kannst du mir helfen mein zu verbessern? Spezifisch Algorithmus, mit ausschließlich OpenCV Funktionen, um das zu lösen vier spezifisch Probleme erwähnt?

Ich hoffe, dass einige Leute auch etwas daraus lernen werden, schließlich denke ich, dass nicht nur Leute, die Fragen stellen, lernen sollten. :)


1390
2018-04-16 04:23


Ursprung


Antworten:


Ein alternativer Ansatz wäre das Extrahieren von Merkmalen (Schlüsselpunkten) unter Verwendung des skaleninvariante Feature-Transformation (SIFT) oder Beschleunigte robuste Funktionen (SURFEN).

Es ist implementiert in OpenCV 2.3.1.

Sie können ein nettes Codebeispiel mit Funktionen in finden Features2D + Homographie um ein bekanntes Objekt zu finden

Beide Algorithmen sind gegenüber Skalierung und Rotation invariant. Da sie mit Features arbeiten, können Sie auch damit umgehen Okklusion (solange genügend Schlüsselpunkte sichtbar sind).

Enter image description here

Bildquelle: Tutorial-Beispiel

Die Verarbeitung dauert einige hundert ms für SIFT, SURF ist etwas schneller, aber nicht für Echtzeitanwendungen geeignet. ORB verwendet FAST, was hinsichtlich der Rotationsinvarianz schwächer ist.

Die Original-Papiere


563
2018-04-16 05:17



Um die Dinge zu beschleunigen, würde ich die Tatsache nutzen, dass Sie nicht nach einem beliebigen Bild / Objekt gefragt werden, sondern speziell nach dem Coca-Cola-Logo. Dies ist von Bedeutung, da dieses Logo sehr markant ist und eine charakteristische, skaleninvariante Signatur im Frequenzbereich, insbesondere im roten Kanal von RGB, aufweisen sollte. Das heißt, das abwechselnde Rot-zu-Weiß-zu-Rot-Muster, das von einer horizontalen Abtastzeile (die auf einem horizontal ausgerichteten Logo trainiert wird) getroffen wird, wird einen charakteristischen "Rhythmus" haben, wenn es durch die zentrale Achse des Logos verläuft. Dieser Rhythmus wird bei verschiedenen Maßstäben und Orientierungen "beschleunigt" oder "verlangsamt", bleibt aber proportional gleich. Sie konnten ein paar Dutzend solcher Scanlinien identifizieren und definieren, sowohl horizontal als auch vertikal durch das Logo und einige weitere diagonal in einem Starburst-Muster. Nennen Sie diese die "Signatur-Scan-Linien".

Signature scan line

Die Suche nach dieser Signatur im Zielbild erfolgt einfach durch Scannen des Bildes in horizontalen Streifen. Suchen Sie im roten Kanal nach einer Hochfrequenz (die anzeigt, dass Sie von einer roten in eine weiße Region wechseln). Wenn Sie einmal gefunden haben, prüfen Sie, ob einer der in der Trainingseinheit identifizierten Frequenzrhythmen folgt. Sobald eine Übereinstimmung gefunden wurde, werden Sie sofort die Ausrichtung und Position der Scanlinie im Logo kennen (wenn Sie diese Dinge während des Trainings verfolgen), so dass die Grenzen des Logos von dort aus trivial sind.

Ich wäre überrascht, wenn dies kein linear effizienter Algorithmus wäre. Offensichtlich geht es nicht um Ihre Dosenflaschen-Diskriminierung, aber zumindest haben Sie Ihre Logos.

(Update: Für die Flaschenerkennung würde ich nach Koks (der braunen Flüssigkeit) neben dem Logo suchen - das heißt, Innerhalb die Flasche. Oder, im Fall einer leeren Flasche, würde ich nach einem suchen Deckel Diese haben immer die gleiche Grundform, Größe und Entfernung zum Logo und sind in der Regel alle weiß oder rot. Suchen Sie nach einer elliptischen Form mit einer Farbe, bei der eine Kappe vorhanden ist sollte sein, relativ zum Logo. Natürlich nicht narrensicher, aber Ihr Ziel sollte hier sein, das zu finden einfach Einsen schnell.)

(Es sind ein paar Jahre seit meinen Tagen der Bildverarbeitung vergangen, daher habe ich diesen Vorschlag auf hohem Niveau und konzeptionell gehalten. Ich denke, er könnte sich leicht annähern, wie ein menschliches Auge operieren könnte - oder zumindest wie mein Gehirn funktioniert!)


331
2018-04-17 21:06



Spaßiges Problem: Als ich auf dein Flaschenbild geschaut habe, dachte ich, es wäre auch eine Dose. Aber als Mensch, was ich getan habe, um den Unterschied zu erkennen, ist mir aufgefallen, dass es auch eine Flasche war ...

Also, um Dosen und Flaschen auseinander zu halten, wie wäre es damit, zuerst nach Flaschen zu suchen? Wenn Sie einen finden, maskieren Sie das Etikett, bevor Sie nach Dosen suchen.

Nicht zu schwer zu implementieren, wenn Sie bereits Dosen machen. Der eigentliche Nachteil ist, dass es Ihre Bearbeitungszeit verdoppelt. (Aber wenn man an reale Anwendungen denkt, wirst du am Ende sowieso Flaschen machen wollen ;-)


132
2018-04-16 05:03



Ist es nicht einmal für den Menschen schwierig, im zweiten Bild zwischen einer Flasche und einer Dose zu unterscheiden (vorausgesetzt, der transparente Bereich der Flasche ist verdeckt)?

Sie sind fast die gleichen außer für eine sehr kleine Region (das heißt, die Breite an der Oberseite der Dose ist ein wenig klein, während die Umhüllung der Flasche die gleiche Breite durchgehend ist, aber eine geringfügige Änderung rechts?)

Das erste, was mir in den Sinn kam, war, nach der roten Flasche zu suchen. Aber es ist immer noch ein Problem, wenn es kein Oberteil für die Flasche gibt, oder wenn es teilweise versteckt ist (wie oben erwähnt).

Das zweite, was ich dachte, war die Transparenz der Flasche. OpenCV hat einige Arbeiten, um transparente Objekte in einem Bild zu finden. Überprüfen Sie die folgenden Links.

Schauen Sie sich insbesondere an, wie genau sie Glas erkennen:

Sehen Sie ihr Implementationsergebnis:

Enter image description here

Sie sagen, es ist die Umsetzung des Papiers "Ein Geodätisches Active Contour Framework zum Finden von Glas" von K. McHenry und J. Ponce, CVPR 2006.

Es könnte in deinem Fall ein wenig hilfreich sein, Aber wenn die Flasche gefüllt ist, tritt erneut ein Problem auf.

Ich denke also, hier können Sie zuerst nach dem transparenten Körper der Flaschen suchen oder nach einem roten Bereich, der seitlich mit zwei transparenten Objekten verbunden ist, was offensichtlich die Flasche ist. (Wenn Sie im Idealfall arbeiten, ein Bild wie folgt.)

Enter image description here

Jetzt können Sie den gelben Bereich, also die Beschriftung der Flasche, entfernen und Ihren Algorithmus ausführen, um die Dose zu finden.

Wie auch immer, diese Lösung hat auch andere Probleme als bei den anderen Lösungen.

  1. Es funktioniert nur, wenn Ihre Flasche leer ist. In diesem Fall müssen Sie nach dem roten Bereich zwischen den beiden schwarzen Farben suchen (wenn die Coca-Cola-Flüssigkeit schwarz ist).
  2. Ein weiteres Problem, wenn das transparente Teil abgedeckt ist.

Aber wenn es keines der oben genannten Probleme in den Bildern gibt, scheint dies zu einem besseren Weg zu sein.


101
2018-04-18 23:02



ich mag wirklich Darren Cooks und Stapler-Antworten zu diesem Problem. Ich war gerade dabei, meine Gedanken in einen Kommentar zu diesen zu stecken, aber ich glaube, mein Ansatz ist zu antworthaft, um nicht hier zu bleiben.

Kurz zusammengefasst haben Sie einen Algorithmus identifiziert, mit dem Sie feststellen können, dass ein Coca-Cola-Logo an einer bestimmten Stelle im Raum vorhanden ist. Sie versuchen nun, für beliebige Orientierungen und willkürliche Skalierungsfaktoren eine Heuristik zu finden, die zur Unterscheidung von Coca-Cola geeignet ist Büchsen von anderen Objekten, einschließlich: Flaschen, Werbetafeln, Werbung, und Coca-Cola-Utensilien alles mit diesem ikonischen Logo verbunden. Sie haben nicht viele dieser zusätzlichen Fälle in Ihrer Problembeschreibung genannt, aber ich denke, sie sind entscheidend für den Erfolg Ihres Algorithmus.

Das Geheimnis hier ist zu bestimmen, welche visuellen Merkmale a kann enthält oder durch den negativen Raum, welche Merkmale für andere Coke-Produkte vorhanden sind, die nicht für Dosen vorhanden sind. Zu diesem Zweck, die aktuelle Top-Antwort skizziert einen grundlegenden Ansatz für die Auswahl von "kann", wenn und nur wenn "Flasche" nicht identifiziert wird, entweder durch das Vorhandensein einer Flaschenkapsel, Flüssigkeit oder andere ähnliche visuelle Heuristiken.

Das Problem ist, dass dies zusammenbricht. Eine Flasche könnte beispielsweise leer sein und keine Kappe aufweisen, was zu einem falschen Positiv führt. Oder könnte es sein eine Teilflasche mit zusätzlichen Funktionen gemangelt, was wiederum zu einer falschen Erkennung führt. Es ist unnötig zu sagen, dass dies weder elegant ist, noch für unsere Zwecke effektiv ist.

Zu diesem Zweck scheinen die richtigsten Auswahlkriterien für Dosen folgende zu sein:

  • Ist die Form des Objekts Silhouette, wie Sie haben in Ihrer Frage skizziert, richtig? Wenn ja, +1.
  • Wenn wir annehmen, dass natürliches oder künstliches Licht vorhanden ist, erkennen wir einen Chromumriss an der Flasche, der anzeigt, ob dieser aus Aluminium besteht? Wenn ja, +1.
  • Stellen wir fest, dass die spiegelnde Eigenschaften des Objekts sind korrekt, relativ zu unseren Lichtquellen (Illustrative Videoverbindung auf Lichtquellenerkennung) Wenn ja, +1.
  • Können wir andere Eigenschaften über das Objekt bestimmen, die es als eine Dose identifizieren, einschließlich, aber nicht beschränkt auf die topologische Bildschrägstellung des Logos, die Ausrichtung des Objekts, die Gegenüberstellung des Objekts (z. B. auf einer ebenen Oberfläche) wie ein Tisch oder im Zusammenhang mit anderen Dosen), und das Vorhandensein einer Zuglasche? Wenn ja, für jeden, +1.

Ihre Klassifizierung könnte dann wie folgt aussehen:

  • Wenn bei jedem Kandidatenmatch ein Coca-Cola-Logo erkannt wurde, zeichnen Sie eine graue Umrandung.
  • Zeichnen Sie für jedes Match über +2 einen roten Rahmen.

Dies hebt den Benutzer visuell hervor, was entdeckt wurde, und hebt schwache Positive hervor, die korrekt als verstümmelte Dosen erkannt werden können.

Die Erkennung jeder Eigenschaft hat eine sehr unterschiedliche Zeit- und Raumkomplexität und für jeden Ansatz einen schnellen Durchlauf http://dsp.stackexchange.com ist mehr als sinnvoll, den richtigen und effizientesten Algorithmus für Ihre Zwecke zu bestimmen. Meine Absicht hier ist es, dies ganz einfach zu betonen Erkennen, ob etwas eine Dose ist, indem ein kleiner Teil des Kandidatenerkennungsraums ungültig gemacht wird ist nicht die robusteste oder effektivste Lösung für dieses Problem, und im Idealfall sollten Sie entsprechende Maßnahmen ergreifen.

Und hey, herzlichen Glückwunsch der Hacker Nachrichtenbeitrag! Im Großen und Ganzen ist dies eine ziemlich grandiose Frage, die der Bekanntheit würdig ist. :)


41
2018-04-22 22:56



Form betrachten

Werfen Sie einen Blick auf die Form des roten Teils der Dose / Flasche. Beachten Sie, dass sich die Dose ganz oben leicht verjüngt, während das Flaschenetikett gerade ist. Sie können zwischen diesen beiden unterscheiden, indem Sie die Breite des roten Teils über seine Länge hinweg vergleichen.

Höhepunkte betrachten

Eine Möglichkeit, zwischen Flaschen und Dosen zu unterscheiden, ist das Material. Eine Flasche besteht aus Kunststoff, während eine Dose aus Aluminium besteht. In ausreichend gut ausgeleuchteten Situationen wäre die Betrachtung der Spekularität eine Möglichkeit, ein Flaschenetikett von einem Dosenetikett zu unterscheiden.

Soviel ich sagen kann, würde ein Mensch den Unterschied zwischen den beiden Arten von Etiketten unterscheiden. Wenn die Lichtverhältnisse schlecht sind, ist die Unterscheidung zwischen den beiden wahrscheinlich unsicher. In diesem Fall müssten Sie in der Lage sein, das Vorhandensein der transparenten / transluzenten Flasche selbst zu erkennen.


35
2018-04-16 08:31



Bitte werfen Sie einen Blick auf Zdenek Kalal Predator Tracker. Es erfordert etwas Training, aber es kann aktiv lernen, wie das verfolgte Objekt verschiedene Orientierungen und Skalen betrachtet, und zwar in Echtzeit!

Der Quellcode ist auf seiner Website verfügbar. Es ist in MATLAB, aber vielleicht wird bereits eine Java-Implementierung von einem Community-Mitglied ausgeführt. Ich habe den Tracker-Teil von TLD erfolgreich in C # implementiert. Wenn ich mich richtig erinnere, benutzt TLD Farne als Schlüsselpunktdetektor. Ich benutze entweder SURF oder SIFT stattdessen (bereits von @ Stacker vorgeschlagen), um das Objekt wiederzuerlangen, wenn es vom Tracker verloren gegangen ist. Die Rückmeldung des Trackers macht es einfach, mit der Zeit eine dynamische Liste von Sift / Surf-Templates zu erstellen, die mit der Zeit es ermöglichen, das Objekt mit sehr hoher Genauigkeit wiederzuerlangen.

Wenn Sie an meiner C # -Implementierung des Trackers interessiert sind, zögern Sie nicht zu fragen.


31
2018-04-17 20:56



Wenn Sie nicht nur auf eine Kamera beschränkt sind, die nicht in einer Ihrer Einschränkungen war, können Sie vielleicht mit einem Entfernungssensor wie der Xbox arbeiten Kinect. Damit können Sie eine auf Tiefe und Farbe basierende angepasste Segmentierung des Bildes durchführen. Dies ermöglicht eine schnellere Trennung von Objekten in dem Bild. Sie können dann ICP-Matching- oder ähnliche Techniken verwenden, um die Form der Dose anzupassen, anstatt nur ihre Umrisse oder Farben, und wenn sie zylindrisch sind, kann dies eine gültige Option für eine Orientierung sein, wenn Sie eine vorherige 3D-Abtastung des Ziels haben. Diese Techniken sind oft ziemlich schnell, besonders wenn sie für einen bestimmten Zweck verwendet werden, der Ihr Geschwindigkeitsproblem lösen sollte.

Auch könnte ich vorschlagen, nicht unbedingt für Genauigkeit oder Geschwindigkeit, aber zum Spaß könnten Sie ein geschultes neuronales Netzwerk auf Ihrem Farbton segmentierten Bild verwenden, um die Form der Dose zu identifizieren. Diese sind sehr schnell und können oft bis zu 80/90% genau sein. Das Training ist jedoch ein wenig langwierig, da Sie die Dose in jedem Bild manuell identifizieren müssen.


25
2018-04-16 04:54



Ich würde rote Rechtecke erkennen: RGB -> HSV, Filter rot -> Binärbild, schließen (erweitern dann erodieren, bekannt als imclose in Matlab)

Dann schaue durch Rechtecke von den größten zu den kleinsten. Rechtecke mit kleineren Rechtecken in einer bekannten Position / Skala können beide entfernt werden (unter der Annahme, dass die Flaschenproportionen konstant sind, wäre das kleinere Rechteck eine Flaschenkapsel).

Das würde Sie mit roten Rechtecken belassen, dann müssen Sie irgendwie die Logos erkennen, um zu sagen, ob sie ein rotes Rechteck oder eine Cola-Dose sind. Wie OCR, aber mit einem bekannten Logo?


20
2018-04-16 06:34