[c++] Bildverarbeitung: Algorithmus Verbesserung für "Coca-Cola Can" Anerkennung


Answers

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".

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. Es geht offensichtlich nicht um Ihre Dosenflaschen-Diskriminierung, aber zumindest werden Sie Ihre Logos haben.

(Update: Für die Flaschenerkennung würde ich nach Koks (die braune Flüssigkeit) neben dem Logo - also in der Flasche - suchen, oder, im Falle einer leeren Flasche, würde ich nach einer Kappe suchen , die immer die hat gleiche Grundform, Größe und Abstand vom Logo und werden in der Regel alle weiß oder rot. Suche nach einer soliden Farbe elliptische Form, wo eine Kappe sollte relativ zum Logo sein.Nicht idiotensicher natürlich, aber Ihr Ziel sollte hier sein finde die einfachen 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!)

Question

Eines der interessantesten Projekte, an denen ich in den letzten Jahren gearbeitet habe, war ein Projekt über Bildverarbeitung . Das Ziel war, ein System zu entwickeln, um Coca-Cola -Dosen erkennen zu können (beachten Sie, dass ich das Wort "Dosen" betone, Sie werden sehen, warum in einer Minute). Unten sehen Sie ein Beispiel, in dem die Dose im grünen Rechteck mit Skalierung und Drehung erkannt wird.

Einige Einschränkungen für das Projekt:

  • Der Hintergrund könnte sehr laut sein.
  • Die Dose könnte irgendeine Skalierung oder Rotation oder sogar Orientierung (innerhalb vernünftiger Grenzen) haben.
  • 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 Dose erkennen !
  • Die Helligkeit des Bildes kann stark variieren (Sie können sich also nicht zu sehr auf die Farberkennung verlassen).
  • Die Dose könnte teilweise an den Seiten oder in der Mitte versteckt sein und möglicherweise teilweise hinter einer Flasche verborgen sein.
  • Es konnte überhaupt keine Dose in dem Bild geben, in diesem Fall musste man nichts finden und eine Nachricht schreiben, die das sagte.

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

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.

Pre-processing : Für die Bildvorverarbeitung, dh für die Umwandlung des Bildes in eine rohere Form, um den Algorithmus zu verwenden, habe ich 2 Methoden verwendet:

  1. Ändern der Farbdomäne von RGB zu 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.
  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 Sie Canny Edge Detection Filter , um die Konturen aller Elemente nach 2 vorhergehenden Schritten zu erhalten.

Algorithmus : Der Algorithmus selbst, den ich für diese Aufgabe gewählt habe, stammt aus this genialen Buch über die Merkmalsextraktion und heißt verallgemeinerte Hough-Transformation (ziemlich verschieden von der regulären 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:

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 ...

Ergebnisse : Während dieser Ansatz in den grundlegenden Fällen funktionierte, fehlte er 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.

Können Sie mir helfen, meinen speziellen Algorithmus zu verbessern, indem Sie ausschließlich OpenCV- Funktionen verwenden, um die vier genannten spezifischen Probleme zu lösen?

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




Es gibt eine Reihe von Farbdeskriptoren, die zum Erkennen von Objekten verwendet werden. Das folgende Papier vergleicht viele davon. Sie sind besonders leistungsstark, wenn sie mit SIFT oder SURF kombiniert werden. SURF oder SIFT allein sind nicht sehr nützlich in einer Coca Cola Dose Bild, weil sie nicht viele interessante Punkte erkennen, benötigen Sie die Farbinformationen zu helfen. Ich benutze BIC (Border / Interior Pixel Classification) mit SURF in einem Projekt und es hat gut funktioniert, um Objekte zu erkennen.

Farbdeskriptoren für die Web-Bildsuche: eine vergleichende Studie




Als Alternative zu all diesen netten Lösungen können Sie Ihren eigenen Klassifikator trainieren und Ihre Anwendung robust gegenüber Fehlern machen. Als Beispiel können Sie Haar Training verwenden , das eine gute Anzahl positiver und negativer Bilder Ihres Ziels liefert.

Es kann nützlich sein, nur Dosen zu extrahieren und kann mit der Erkennung von transparenten Objekten kombiniert werden.




Sie benötigen ein Programm, das die Klassifizierungsgenauigkeit aus Erfahrung organisch lernt und verbessert.

Ich werde tiefes Lernen vorschlagen, mit tiefem Lernen wird das ein triviales Problem.

Sie können das Einführungsmodell v3 auf Tensorflow neu trainieren:

Wie man Inceptions letzte Ebene für neue Kategorien zurückholt .

In diesem Fall trainieren Sie ein konvolutionelles neuronales Netzwerk, um ein Objekt entweder als Coca-Cola-Dose zu klassifizieren oder nicht.




Dies kann eine sehr naive Idee sein (oder gar nicht funktionieren), aber die Abmessungen aller Koksdosen sind festgelegt. Wenn also das gleiche Bild sowohl eine Dose als auch eine Flasche enthält, dann können Sie sie nach Größenbetrachtungen unterscheiden (Flaschen werden größer). Aufgrund fehlender Tiefe (dh 3D-Mapping auf 2D-Mapping) ist es möglich, dass eine Flasche schrumpft und es keinen Größenunterschied gibt. Sie können einige Tiefeninformationen mithilfe von stereo-imaging wiederherstellen und dann die Originalgröße wiederherstellen.




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 gleich, abgesehen von einem sehr kleinen Bereich (das heißt, die Breite oben auf der Dose ist ein wenig klein, während die Umhüllung der Flasche überall die gleiche Breite hat, aber eine kleine Änderung, richtig?).

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:

Sie sagen, es ist die Umsetzung des Papiers "A Geodesic Active Contour Framework for Finding Glass" by K. McHenry and J. Ponce, CVPR 2006. . (Download Papier) .

Es könnte in Ihrem Fall ein wenig hilfreich sein, aber das Problem tritt wieder auf, wenn die Flasche gefüllt ist.

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.)

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.




The first things I would look for are color - like RED , when doing Red eye detection in an image - there is a certain color range to detect , some characteristics about it considering the surrounding area and such as distance apart from the other eye if it is indeed visible in the image.

1: First characteristic is color and Red is very dominant. After detecting the Coca Cola Red there are several items of interest 1A: How big is this red area (is it of sufficient quantity to make a determination of a true can or not - 10 pixels is probably not enough), 1B: Does it contain the color of the Label - "Coca-Cola" or wave. 1B1: Is there enough to consider a high probability that it is a label.

Item 1 is kind of a short cut - pre-process if that doe snot exist in the image - move on.

So if that is the case I can then utilize that segment of my image and start looking more zoom out of the area in question a little bit - basically look at the surrounding region / edges...

2: Given the above image area ID'd in 1 - verify the surrounding points [edges] of the item in question. A: Is there what appears to be a can top or bottom - silver? B: A bottle might appear transparent , but so might a glass table - so is there a glass table/shelf or a transparent area - if so there are multiple possible out comes. A Bottle MIGHT have a red cap, it might not, but it should have either the shape of the bottle top / thread screws, or a cap. C: Even if this fails A and B it still can be a can - partial.. This is more complex when it is partial because a partial bottle / partial can might look the same , so some more processing of measurement of the Red region edge to edge.. small bottle might be similar in size ..

3: Nach der obigen Analyse würde ich dann den Schriftzug und das Wellenlogo betrachten - weil ich meine Suche nach einigen der Buchstaben in den Wörtern orientieren kann, da Sie vielleicht nicht den ganzen Text haben, weil Sie nicht alle haben Kann die Welle an bestimmten Punkten auf den Text ausgerichtet werden (distanzweise), so könnte ich nach dieser Wahrscheinlichkeit suchen und wissen, welche Buchstaben an diesem Punkt der Welle in Abstand x existieren sollen.




Ich bin ein paar Jahre zu spät bei der Beantwortung dieser Frage. Mit dem Stand der Technik, der von CNNs in den letzten 5 Jahren an seine Grenzen getrieben wurde, würde ich OpenCV jetzt nicht für diese Aufgabe nutzen! ( Ich weiß, dass Sie speziell OpenCv-Funktionen in der Frage gesucht haben ) Ich denke, Objekterkennungsalgorithmen wie Faster-RCNNs, YOLO, SSD usw. würden dieses Problem mit einem signifikanten Abstand im Vergleich zu OpenCV-Funktionen aufnehmen. Wenn ich dieses Problem nun (nach 6 Jahren !!) angehen würde, würde ich definitiv Faster-RCNN verwenden .




If you are interested in it being realtime, then what you need is to add in a pre-processing filter to determine what gets scanned with the heavy-duty stuff. A good fast, very real time, pre-processing filter that will allow you to scan things that are more likely to be a coca-cola can than not before moving onto more iffy things is something like this: search the image for the biggest patches of color that are a certain tolerance away from the sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) of your coca-cola can. Start with a very strict color tolerance, and work your way down to more lenient color tolerances. Then, when your robot runs out of an allotted time to process the current frame, it uses the currently found bottles for your purposes. Please note that you will have to tweak the RGB colors in the sqrt(pow(red,2) + pow(blue,2) + pow(green,2)) to get them just right.

Also, this is gona seem really dumb, but did you make sure to turn on -oFast compiler optimizations when you compiled your C code?




Wenn Sie nicht nur auf eine Kamera beschränkt sind, die sich nicht in einer Ihrer Beschränkungen befand, können Sie vielleicht einen Entfernungssensor wie die Xbox 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 jede Ausrichtung 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 hue 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.




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.




Ich kenne OpenCV nicht, aber wenn ich das Problem logisch betrachte, denke ich, dass man zwischen Flasche und Dose unterscheiden kann, indem man das Bild, nach dem man sucht, zB Coca Cola, ändert. Sie sollten bis zum oberen Teil der Dose integrieren, denn im Falle der Dose gibt es Silberfutter oben auf der Coca Cola und im Falle der Flasche wird es kein solches Silberfutter geben.

Aber offensichtlich wird dieser Algorithmus in Fällen fehlschlagen, in denen die Oberseite der Dose versteckt ist, aber in einem solchen Fall wird auch ein Mensch nicht in der Lage sein, zwischen den beiden zu unterscheiden (wenn nur Coca Cola-Teil der Flasche / Dose sichtbar ist)




Links