Eines der interessantesten Projekte, an denen ich in den letzten Jahren gearbeitet habe, war ein Projekt zur Bildverarbeitung . Das Ziel war es, ein System zu entwickeln, mit dem Coca-Cola -Dosen erkannt werden können (beachten Sie, dass ich das Wort "Dosen" betone, Sie werden gleich sehen, warum). Unten sehen Sie ein Beispiel, wobei die Dose im grünen Rechteck mit Skalierung und Drehung erkannt wird .
Einige Einschränkungen für das Projekt:
- Der Hintergrund kann sehr laut sein.
- Die Dose könnte jede Skala oder Rotation oder sogar Ausrichtung (in Grenzen).
- Das Bild kann einen gewissen Grad an Unschärfe aufweisen (Konturen sind möglicherweise nicht ganz gerade).
- Das Bild könnte Coca-Cola-Flaschen enthalten, 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 und möglicherweise teilweise hinter einer Flasche versteckt sein.
- Das Bild konnte überhaupt keine Dose enthalten. In diesem Fall musste man nichts finden und eine entsprechende Nachricht schreiben.
Sie könnten also mit solchen kniffligen Dingen enden (bei denen mein Algorithmus in diesem Fall völlig versagt hat):
Ich habe dieses Projekt vor einiger Zeit gemacht und hatte viel Spaß dabei, und ich hatte eine anständige Implementierung. Hier einige Details zu meiner Implementierung:
Sprache : Fertig in C ++ mit OpenCV- Bibliothek.
Vorverarbeitung : Für die Bildvorverarbeitung, dh die Umwandlung des Bildes in eine rohere Form, um sie dem Algorithmus zu geben, habe ich zwei Methoden verwendet:
- Ändern des Farbbereichs von RGB zu HSV und Filtern basierend auf dem "roten" Farbton, Sättigung über einem bestimmten Schwellenwert, um orangefarbene Farben zu vermeiden, und Filtern eines niedrigen Werts, um dunkle Töne zu vermeiden. Das Endergebnis war ein binäres Schwarzweißbild, bei dem alle weißen Pixel die Pixel darstellen, die diesem Schwellenwert entsprechen. Natürlich ist immer noch viel Mist im Bild, aber dies reduziert die Anzahl der Dimensionen, mit denen Sie arbeiten müssen.
- Rauschfilterung mithilfe der Medianfilterung (wobei der mittlere Pixelwert aller Nachbarn verwendet und das Pixel durch diesen Wert ersetzt wird), um das Rauschen zu reduzieren.
- Verwenden des Canny Edge Detection-Filters , um die Konturen aller Elemente nach zwei vorhergehenden Schritten abzurufen.
Algorithmus : Der Algorithmus selbst, den ich für diese Aufgabe ausgewählt habe, stammt aus diesem großartigen Buch über Feature-Extraktion und heißt Generalized Hough Transform (ziemlich anders als die reguläre Hough Transform). 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 beständig gegen Bildverformungen wie Skalierung und Drehung, da es Ihr Bild grundsätzlich für jede Kombination aus Skalierungsfaktor und Rotationsfaktor testet.
- Es verwendet ein Basismodell (eine Vorlage), das der Algorithmus "lernt".
- Jedes im Konturbild verbleibende Pixel stimmt für ein anderes Pixel, das angeblich der Mittelpunkt (in Bezug auf die Schwerkraft) Ihres Objekts ist, basierend auf dem, was es aus dem Modell gelernt hat.
Am Ende erhalten Sie eine Heatmap der Stimmen. Hier stimmen beispielsweise alle Pixel der Kontur der Dose für ihr Gravitationszentrum ab, sodass Sie viele Stimmen in demselben Pixel haben, das dem entspricht Mitte, und wird einen Peak in der Heatmap wie folgt sehen:
Sobald Sie das haben, kann eine einfache schwellenwertbasierte Heuristik Ihnen die Position des mittleren Pixels geben, aus der Sie die Skalierung und Drehung ableiten und dann Ihr kleines Rechteck darum zeichnen können (die endgültige Skalierung und der Rotationsfaktor sind offensichtlich relativ zu Ihrer Originalvorlage). Zumindest theoretisch ...
Ergebnisse : Während dieser Ansatz in den Grundfällen funktionierte, fehlte er in einigen Bereichen erheblich:
- Es ist extrem langsam ! Ich betone das nicht genug. Es wurde fast ein ganzer Tag benötigt, 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 ging völlig verloren, als Flaschen im Bild waren, und aus irgendeinem Grund fand man fast immer die Flasche anstelle der Dose (vielleicht weil die Flaschen größer waren, also mehr Pixel hatten, also mehr Stimmen)
- Fuzzy-Bilder waren auch nicht gut, da die Stimmen an zufälligen Stellen in der Mitte in Pixel endeten und somit mit einer sehr verrauschten Wärmekarte endeten.
- Eine Abweichung in Bezug auf Translation und Rotation wurde erreicht, jedoch nicht in Bezug auf die Ausrichtung, was bedeutet, dass eine Dose, die nicht direkt auf das Kameraobjektiv gerichtet war, nicht erkannt wurde.
Können Sie mir helfen, meinen spezifischen Algorithmus zu verbessern , indem ich ausschließlich OpenCV- Funktionen verwende, 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. :) :)
quelle
Antworten:
Ein alternativer Ansatz wäre das Extrahieren von Features (Schlüsselpunkten) mithilfe der skalierungsinvarianten Feature-Transformation (SIFT) oder der beschleunigten robusten Features (SURF).
Es ist in OpenCV 2.3.1 implementiert .
Sie finden ein schönes Codebeispiel mit Funktionen in Features2D + Homography, um ein bekanntes Objekt zu finden
Beide Algorithmen sind für Skalierung und Rotation unveränderlich. Da sie mit Features arbeiten, können Sie auch mit Okklusion umgehen (solange genügend Schlüsselpunkte sichtbar sind).
Bildquelle: Tutorial-Beispiel
Die Verarbeitung dauert für SIFT einige hundert ms, SURF ist etwas schneller, aber nicht für Echtzeitanwendungen geeignet. ORB verwendet FAST, was hinsichtlich der Rotationsinvarianz schwächer ist.
Die Originalpapiere
quelle
Um die Dinge zu beschleunigen, würde ich die Tatsache ausnutzen, dass Sie nicht aufgefordert werden, ein beliebiges Bild / Objekt zu finden, sondern speziell eines mit dem Coca-Cola-Logo. Dies ist insofern von Bedeutung, als dieses Logo sehr charakteristisch ist und im Frequenzbereich, insbesondere im roten Kanal von RGB, eine charakteristische, skalierungsinvariante Signatur aufweisen sollte. Das heißt, das abwechselnde Muster von Rot zu Weiß zu Rot, das von einer horizontalen Scanlinie (trainiert auf einem horizontal ausgerichteten Logo) angetroffen wird, hat einen charakteristischen "Rhythmus", wenn es durch die Mittelachse des Logos verläuft. Dieser Rhythmus wird in verschiedenen Maßstäben und Ausrichtungen "beschleunigt" oder "verlangsamt", bleibt aber proportional gleichwertig. Sie können ein paar Dutzend solcher Scanlinien sowohl horizontal als auch vertikal durch das Logo und mehrere weitere diagonal identifizieren / definieren. in einem Starburst-Muster. Nennen Sie diese die "Signatur-Scan-Zeilen".
Das Suchen nach dieser Signatur im Zielbild ist eine einfache Sache des Scannens des Bildes in horizontalen Streifen. Suchen Sie im roten Kanal nach einer Hochfrequenz (was darauf hinweist, dass Sie von einem roten zu einem weißen Bereich wechseln), und prüfen Sie nach dem Auffinden, ob auf einen der in der Trainingseinheit identifizierten Frequenzrhythmen folgt. Sobald eine Übereinstimmung gefunden wurde, erkennen Sie sofort die Ausrichtung und Position der Scanlinie im Logo (wenn Sie diese Dinge während des Trainings verfolgen), sodass es trivial ist, die Grenzen des Logos von dort aus zu identifizieren.
Es würde mich wundern, wenn dies kein linear effizienter Algorithmus wäre oder fast. Es geht offensichtlich nicht um Ihre Diskriminierung aufgrund der Dosenflasche, aber zumindest haben Sie Ihre Logos.
(Update: Für die Flaschenerkennung würde ich neben dem Logo nach Cola (der braunen Flüssigkeit) suchen - also innerhalb der Flasche. Bei einer leeren Flasche würde ich nach einem Verschluss suchen , der immer den hat gleiche Grundform, Größe und Abstand von dem logo und werden in der Regel alle weiß oder rot sein. suchen Sie nach einer soliden Farbe eliptical Form , wo eine Kappe soll , bezogen auf das logo sein. Nicht narrensicher natürlich, aber Ihr Ziel soll hier sein, finde die einfach diejenigen schnell .)
(Es ist ein paar Jahre her, seit ich Bilder verarbeitet habe, also habe ich diesen Vorschlag auf hohem Niveau und konzeptionell gehalten. Ich denke, er könnte sich leicht der Funktionsweise eines menschlichen Auges annähern - oder zumindest der Funktionsweise meines Gehirns!)
quelle
Lustiges Problem: Als ich auf dein Flaschenbild schaute, dachte ich, es sei auch eine Dose. Aber als Mensch habe ich den Unterschied festgestellt, als ich bemerkte, dass es sich auch um eine Flasche handelte ...
Um Dosen und Flaschen voneinander zu unterscheiden, wie wäre es, zuerst einfach nach Flaschen zu suchen? Wenn Sie eine 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 sich Ihre Verarbeitungszeit verdoppelt. (Aber wenn Sie an reale Anwendungen denken, werden Sie am Ende sowieso Flaschen machen wollen ;-)
quelle
Ist es nicht auch für Menschen schwierig, im zweiten Bild zwischen einer Flasche und einer Dose zu unterscheiden (vorausgesetzt, der transparente Bereich der Flasche ist verborgen)?
Sie sind bis auf einen sehr kleinen Bereich fast gleich (dh die Breite am oberen Rand der Dose ist etwas klein, während die Verpackung der Flasche durchgehend gleich breit ist, aber eine geringfügige Änderung, oder?)
Das erste, was mir in den Sinn kam, war, nach dem roten Flaschenverschluss zu suchen. Es ist jedoch immer noch ein Problem, wenn kein Deckel für die Flasche vorhanden ist oder wenn sie teilweise verborgen ist (wie oben erwähnt).
Das zweite, was ich dachte, war über die Transparenz der Flasche. OpenCV hat einige Arbeiten zum Auffinden transparenter Objekte in einem Bild. Überprüfen Sie die folgenden Links.
OpenCV Meeting Notes Minutes 2012-03-19
OpenCV Meeting Notes Minutes 2012-02-28
Schauen Sie sich dies besonders an, um zu sehen, wie genau sie Glas erkennen:
Siehe das Implementierungsergebnis:
Sie sagen, es sei die Implementierung des Papiers "A Geodesic Active Contour Framework for Finding Glass" von K. McHenry und J. Ponce, CVPR 2006 .
Es kann in Ihrem Fall ein wenig hilfreich sein, aber das Problem tritt erneut auf, wenn die Flasche gefüllt ist.
Ich denke, 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, bei denen es sich offensichtlich um die Flasche handelt. (Wenn Sie ideal arbeiten, erhalten Sie ein Bild wie folgt.)
Jetzt können Sie den gelben Bereich, dh das Etikett der Flasche, entfernen und Ihren Algorithmus ausführen, um die Dose zu finden.
Wie auch immer, diese Lösung hat auch andere Probleme als die anderen Lösungen.
Aber trotzdem, wenn es keines der oben genannten Probleme in den Bildern gibt, scheint dies ein besserer Weg zu sein.
quelle
Ich mag die Antworten von Darren Cook und Stacker auf dieses Problem sehr. Ich war gerade dabei, meine Gedanken in einen Kommentar zu diesen zu werfen, aber ich glaube, mein Ansatz ist zu antwortorientiert, um hier nicht abzureisen.
Kurz gesagt, Sie haben einen Algorithmus identifiziert, mit dem festgestellt werden kann, dass ein Coca-Cola-Logo an einer bestimmten Stelle im Weltraum vorhanden ist. Sie versuchen nun, für willkürliche Ausrichtungen und willkürliche Skalierungsfaktoren eine Heuristik zu bestimmen, die zur Unterscheidung von Coca-Cola- Dosen von anderen Objekten geeignet ist , einschließlich: Flaschen , Werbetafeln , Werbung und Coca-Cola-Utensilien, die alle mit diesem ikonischen Logo verbunden sind. Sie haben in Ihrer Problemstellung nicht viele dieser zusätzlichen Fälle genannt, aber ich bin der Meinung, dass sie für den Erfolg Ihres Algorithmus von entscheidender Bedeutung sind.
Das Geheimnis hierbei ist zu bestimmen, welche visuellen Merkmale eine Dose enthält oder durch den negativen Raum, welche Merkmale für andere Cola-Produkte vorhanden sind, die für Dosen nicht vorhanden sind. Zu diesem Zweck skizziert die aktuelle Top-Antwort einen grundlegenden Ansatz für die Auswahl von "kann", wenn und nur wenn "Flasche" nicht identifiziert wird, entweder durch das Vorhandensein eines Flaschenverschlusses, einer Flüssigkeit oder anderer ähnlicher visueller Heuristiken.
Das Problem ist, dass dies zusammenbricht. Eine Flasche kann beispielsweise leer sein und keine Kappe haben, was zu einem falsch positiven Ergebnis führt. Oder es könnte sich um eine Teilflasche handeln, deren zusätzliche Merkmale verstümmelt sind, was wiederum zu einer falschen Erkennung führt. Unnötig zu erwähnen, dass dies weder elegant noch für unsere Zwecke wirksam ist.
Zu diesem Zweck scheinen die korrektesten Auswahlkriterien für Dosen die folgenden zu sein:
Ihre Klassifizierung könnte dann wie folgt aussehen:
Dies hebt den Benutzer visuell hervor, was erkannt wurde, und hebt schwache Positive hervor, die korrekt als verstümmelte Dosen erkannt werden können.
Die Erkennung jeder Eigenschaft ist mit einer sehr unterschiedlichen zeitlichen und räumlichen Komplexität verbunden. Für jeden Ansatz ist ein schneller Durchlauf durch http://dsp.stackexchange.com mehr als sinnvoll, um den korrektesten und effizientesten Algorithmus für Ihre Zwecke zu ermitteln. Ich möchte hier schlicht und einfach betonen, dass das Erkennen, ob etwas eine Dose ist, indem ein kleiner Teil des Kandidatenerkennungsraums ungültig gemacht wird, nicht die robusteste oder effektivste Lösung für dieses Problem ist. Idealerweise sollten Sie die entsprechenden Maßnahmen ergreifen entsprechend.
Und hey, herzlichen Glückwunsch zum Hacker News Posting! Im Großen und Ganzen ist dies eine ziemlich großartige Frage, die der Öffentlichkeit, die sie erhalten hat, würdig ist. :) :)
quelle
Form betrachten
Nehmen Sie einen Blick auf die Form des roten Teils der Dose / Flasche. Beachten Sie, wie 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 die Länge 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 Aluminiummetall besteht. In ausreichend gut beleuchteten Situationen wäre ein Blick auf die Spiegelung eine Möglichkeit, ein Flaschenetikett von einem Dosenetikett zu unterscheiden.
Soweit ich das beurteilen kann, würde ein Mensch auf diese Weise den Unterschied zwischen den beiden Arten von Etiketten erkennen. Wenn die Lichtverhältnisse schlecht sind, besteht mit Sicherheit eine gewisse Unsicherheit bei der Unterscheidung der beiden. In diesem Fall müssten Sie in der Lage sein, das Vorhandensein der transparenten / durchscheinenden Flasche selbst zu erkennen.
quelle
Bitte werfen Sie einen Blick auf Zdenek Kalals Predator Tracker . Es erfordert etwas Training, kann aber aktiv lernen, wie das verfolgte Objekt in verschiedenen Ausrichtungen und Maßstäben aussieht, und dies in Echtzeit!
Der Quellcode ist auf seiner Website verfügbar. Es ist in MATLAB , aber vielleicht gibt es eine Java-Implementierung, die bereits von einem Community-Mitglied durchgeführt wurde. Ich habe den Tracker-Teil von TLD in C # erfolgreich neu implementiert. Wenn ich mich richtig erinnere, verwendet TLD Farne als Schlüsselpunktdetektor. Ich verwende stattdessen entweder SURF oder SIFT (bereits von @stacker vorgeschlagen), um das Objekt erneut abzurufen, wenn es vom Tracker verloren gegangen ist. Das Feedback des Trackers macht es einfach, mit der Zeit eine dynamische Liste von Sieb- / Surfvorlagen zu erstellen, die es mit der Zeit ermöglichen, das Objekt mit sehr hoher Präzision wieder zu erfassen.
Wenn Sie an meiner C # -Implementierung des Trackers interessiert sind, können Sie gerne fragen.
quelle
Wenn Sie sich nicht nur auf eine Kamera beschränken, die nicht zu Ihren Einschränkungen gehört, können Sie möglicherweise einen Entfernungssensor wie die Xbox Kinect verwenden . Damit können Sie eine tiefen- und farbbasierte abgestimmte Segmentierung des Bildes durchführen. Dies ermöglicht eine schnellere Trennung von Objekten im Bild. Sie können dann ICP-Matching oder ähnliche Techniken verwenden, um sogar die Form der Dose und nicht nur deren Umriss oder Farbe anzupassen. Da sie zylindrisch ist, kann dies eine gültige Option für jede Ausrichtung sein, wenn Sie zuvor einen 3D-Scan des Ziels durchgeführt haben. Diese Techniken sind oft recht schnell, insbesondere wenn sie für einen bestimmten Zweck verwendet werden, der Ihr Geschwindigkeitsproblem lösen sollte.
Ich könnte auch vorschlagen, nicht unbedingt aus Gründen der Genauigkeit oder Geschwindigkeit, aber zum Spaß könnten Sie ein trainiertes neuronales Netzwerk auf Ihrem farblich 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 wäre jedoch ein langwieriger Prozess, da Sie die Dose in jedem Bild manuell identifizieren müssten.
quelle
Ich würde rote Rechtecke erkennen: RGB -> HSV, rot filtern -> Binärbild, schließen (erweitern, dann erodieren, bekannt als
imclose
in matlab)Schauen Sie dann durch Rechtecke vom größten zum kleinsten. Rechtecke mit kleineren Rechtecken an einer bekannten Position / Skala können beide entfernt werden (unter der Annahme, dass die Flaschenproportionen konstant sind, wäre das kleinere Rechteck ein Flaschenverschluss).
Dies würde Sie mit roten Rechtecken zurücklassen, dann müssen Sie die Logos irgendwie erkennen, um festzustellen, ob es sich um ein rotes Rechteck oder eine Coladose handelt. Wie OCR, aber mit einem bekannten Logo?
quelle
Dies mag eine sehr naive Idee sein (oder überhaupt nicht funktionieren), aber die Abmessungen aller Koksdosen sind festgelegt. Wenn also dasselbe Bild sowohl eine Dose als auch eine Flasche enthält, können Sie diese anhand von Größenüberlegungen unterscheiden (Flaschen werden größer). Aufgrund der fehlenden Tiefe (dh 3D-Zuordnung zu 2D-Zuordnung) ist es nun möglich, dass eine Flasche geschrumpft erscheint und es keinen Größenunterschied gibt. Sie können einige Tiefeninformationen mithilfe von Stereobildern wiederherstellen und dann die ursprüngliche Größe wiederherstellen.
quelle
Hmm, ich glaube tatsächlich, ich bin auf etwas fixiert (dies ist die interessanteste Frage aller Zeiten - es wäre also eine Schande, nicht weiter zu versuchen, die "perfekte" Antwort zu finden, obwohl eine akzeptable gefunden wurde). .
Sobald Sie das Logo gefunden haben, sind Ihre Probleme zur Hälfte erledigt. Dann müssen Sie nur noch die Unterschiede zwischen den Elementen rund um das Logo herausfinden . Außerdem möchten wir so wenig wie möglich extra tun. Ich denke, das ist eigentlich so einfach ...
Was ist um das Logo herum? Für eine Dose können wir Metall sehen, das sich trotz der Lichteffekte in seiner Grundfarbe überhaupt nicht ändert. Solange wir den Winkel des Etiketts kennen, können wir erkennen, was direkt darüber liegt, also betrachten wir den Unterschied zwischen diesen:
Hier ist das, was über und unter dem Logo liegt, völlig dunkel und farblich konsistent. In dieser Hinsicht relativ einfach.
Hier ist das, was oben und unten ist, hell, aber immer noch farblich konsistent. Es ist alles Silber, und alles Silber Metall scheint ziemlich selten zu sein, ebenso wie Silberfarben im Allgemeinen. Darüber hinaus ist es dünn und nahe genug an dem bereits identifizierten Rot, sodass Sie seine Form über die gesamte Länge verfolgen können, um einen Prozentsatz dessen zu berechnen, was als Metallring der Dose angesehen werden kann. Wirklich, Sie brauchen nur einen kleinen Bruchteil davon irgendwo entlang der Dose, um zu erkennen, dass es Teil davon ist, aber Sie müssen immer noch ein Gleichgewicht finden, das sicherstellt, dass es nicht nur eine leere Flasche mit etwas Metall dahinter ist.
Und schließlich die knifflige. Aber nicht so knifflig, wenn wir uns nur an dem orientieren, was wir direkt über (und unter) der roten Hülle sehen können. Es ist transparent, was bedeutet, dass es zeigt, was dahinter steckt. Das ist gut so, denn Dinge, die dahinter stehen, sind wahrscheinlich nicht so farblich wie das silberne kreisförmige Metall der Dose. Es könnte viele verschiedene Dinge dahinter geben, die uns sagen würden, dass es sich um eine leere (oder mit klarer Flüssigkeit gefüllte) Flasche handelt oder um eine einheitliche Farbe, was entweder bedeuten könnte, dass sie mit Flüssigkeit gefüllt ist oder dass sich die Flasche einfach vor einer befindet einfarbig. Wir arbeiten mit dem, was oben und unten am nächsten ist, und die Chancen, dass die richtigen Farben am richtigen Ort sind, sind relativ gering. Wir wissen, dass es eine Flasche ist, weil sie nicht das visuelle Schlüsselelement der Dose hat.
(Das letzte war das Beste, was ich von einer leeren großen Coca-Cola-Flasche finden konnte - interessanterweise sind die Kappe UND der Ring gelb, was darauf hinweist, dass man sich wahrscheinlich nicht auf die Rötung der Kappe verlassen sollte.)
In dem seltenen Fall, dass sich ein ähnlicher Silberton hinter der Flasche befindet, selbst nach der Abstraktion des Kunststoffs, oder die Flasche irgendwie mit dem gleichen Farbton Silberflüssigkeit gefüllt ist, können wir auf das zurückgreifen, was wir grob als das schätzen können Form des Silbers - das, wie ich bereits erwähnte, kreisförmig ist und der Form der Dose folgt. Aber obwohl mir bestimmte Kenntnisse in der Bildverarbeitung fehlen, klingt das langsam. Besser noch, warum nicht daraus schließen, indem Sie einmal die Seiten des Logos überprüfen, um sicherzustellen, dass dort nichts von der gleichen silbernen Farbe ist? Ah, aber was ist, wenn sich hinter einer Dose der gleiche Silberton befindet? Dann müssen wir tatsächlich mehr auf Formen achten und wieder auf die Ober- und Unterseite der Dose schauen.
Je nachdem, wie fehlerfrei dies alles sein muss, kann es sehr langsam sein, aber ich denke, mein Grundkonzept besteht darin, zuerst die einfachsten und engsten Dinge zu überprüfen. Gehen Sie anhand von Farbunterschieden um die bereits übereinstimmende Form (was ohnehin der trivialste Teil davon zu sein scheint), bevor Sie sich die Mühe machen, die Form der anderen Elemente zu ermitteln. Um es aufzulisten, geht es:
Falls Sie dies nicht tun können, bedeutet dies wahrscheinlich, dass die Ober- und Unterseite der Dose abgedeckt sind und die einzig möglichen Dinge, die ein Mensch hätte verwenden können, um zuverlässig zwischen der Dose und der Flasche zu unterscheiden, die Okklusion und Reflexion sind von der Dose, was ein viel schwieriger zu kämpfender Kampf wäre . Um noch weiter zu gehen, können Sie dem Winkel der Dose / Flasche folgen, um mithilfe der in den anderen Antworten genannten halbtransparenten Scan-Techniken nach flaschenähnlichen Merkmalen zu suchen.
Interessante zusätzliche Albträume könnten eine Dose sein, die bequem in einem solchen Abstand hinter der Flasche sitzt, dass das Metall zufällig über und unter dem Etikett sichtbar ist, was immer noch fehlschlagen würde, solange Sie über die gesamte Länge des Rotes scannen Etikett - was eigentlich eher ein Problem ist, weil Sie eine Dose nicht dort entdecken, wo Sie sie haben könnten, anstatt zu bedenken, dass Sie tatsächlich eine Flasche erkennen, einschließlich der Dose aus Versehen. In diesem Fall ist das Glas halb leer!
Als Haftungsausschluss habe ich keine Erfahrung mit Bildverarbeitung außerhalb dieser Frage und habe auch nie darüber nachgedacht, aber es ist so interessant, dass ich ziemlich tief darüber nachgedacht habe, und nachdem ich alle anderen Antworten gelesen habe, halte ich dies für möglicherweise der einfachste und effizienteste Weg, dies zu erreichen. Persönlich bin ich nur froh, dass ich nicht wirklich darüber nachdenken muss, dies zu programmieren!
BEARBEITEN
Schauen Sie sich außerdem diese Zeichnung an, die ich in MS Paint gemacht habe ... Sie ist absolut schrecklich und ziemlich unvollständig, aber allein aufgrund der Form und der Farben können Sie erraten, wie sie wahrscheinlich aussehen wird. Im Wesentlichen sind dies die einzigen Dinge, nach denen man suchen muss. Wenn Sie sich diese sehr charakteristische Form und Farbkombination so genau ansehen, was könnte es sonst noch sein? Das Stück, das ich nicht gemalt habe, der weiße Hintergrund, sollte als "alles Inkonsistente" betrachtet werden. Wenn es einen transparenten Hintergrund hätte, könnte es über fast jedes andere Bild gehen und Sie könnten es immer noch sehen.
quelle
Ich bin mir OpenCVs nicht bewusst, aber wenn ich das Problem logisch betrachte, denke ich, dass Sie zwischen Flasche und Dose unterscheiden können, indem Sie das gesuchte Bild ändern, z. B. Coca Cola. Sie sollten bis zum oberen Teil der Dose einarbeiten, da sich bei der Dose oben auf der Coca Cola ein Silberstreifen befindet und bei einer Flasche kein solcher Silberstreifen vorhanden ist.
Aber offensichtlich schlägt dieser Algorithmus in Fällen fehl, in denen die Oberseite der Dose verborgen ist, aber in diesem Fall kann selbst der Mensch nicht zwischen den beiden unterscheiden (wenn nur der Coca-Cola-Teil der Flasche / Dose sichtbar ist).
quelle
Ich mag die Herausforderung und wollte eine Antwort geben, die das Problem löst, denke ich.
Das Erkennen der Kappe ist ein weiteres Problem. Es kann entweder kompliziert oder einfach sein. Wenn ich Sie wäre, würde ich einfach das Farbhistogramm im ROI überprüfen, um eine einfache Entscheidung zu treffen.
Bitte geben Sie das Feedback, wenn ich falsch liege. Vielen Dank.
quelle
Bin ein paar Jahre zu spät bei der Beantwortung dieser Frage. Da der Stand der Technik in den letzten 5 Jahren von CNNs an seine Grenzen gestoßen wurde, würde ich OpenCV jetzt nicht mehr für diese Aufgabe verwenden! ( Ich weiß, dass Sie in dieser Frage speziell OpenCv-Funktionen wollten. ) Ich bin der Meinung, dass Objekterkennungsalgorithmen wie Faster-RCNNs, YOLO, SSD usw. dieses Problem im Vergleich zu OpenCV-Funktionen mit einem erheblichen Spielraum lösen würden. Wenn ich dieses Problem jetzt angehen würde (nach 6 Jahren !!), würde ich definitiv Faster-RCNN verwenden .
quelle
Ich mag Ihre Frage, unabhängig davon, ob sie nicht zum Thema gehört oder nicht: P.
Eine interessante Seite; Ich habe gerade ein Fach in meinem Studium abgeschlossen, in dem wir uns mit Robotik und Computer Vision befassten. Unser Projekt für das Semester war dem von Ihnen beschriebenen unglaublich ähnlich.
Wir mussten einen Roboter entwickeln, der eine Xbox Kinect verwendete, um Colaflaschen und Dosen in jeder Ausrichtung unter verschiedenen Licht- und Umgebungsbedingungen zu erkennen. Unsere Lösung bestand darin, ein Bandpassfilter auf dem Hue-Kanal in Kombination mit der Hough-Circle-Transformation zu verwenden. Wir konnten die Umgebung etwas einschränken (wir konnten wählen, wo und wie der Roboter und der Kinect-Sensor positioniert werden sollen), andernfalls würden wir die SIFT- oder SURF-Transformationen verwenden.
Sie können über unseren Ansatz in meinem Blog-Beitrag zum Thema lesen :)
quelle
Es gibt eine Reihe von Farbdeskriptoren, mit denen Objekte erkannt werden. Das folgende Papier vergleicht viele davon. Sie sind besonders leistungsstark, wenn sie mit SIFT oder SURF kombiniert werden. SURF oder SIFT allein sind in einem Coca-Cola-Dosenbild nicht sehr nützlich, da sie nicht viele interessante Punkte erkennen. Sie benötigen die Farbinformationen, um zu helfen. Ich verwende BIC (Border / Interior Pixel Classification) mit SURF in einem Projekt und es hat großartig funktioniert, Objekte zu erkennen.
Farbdeskriptoren für das Abrufen von Webbildern: eine vergleichende Studie
quelle
Tiefes Lernen
Sammeln Sie mindestens einige hundert Bilder mit Cola-Dosen, kennzeichnen Sie den Begrenzungsrahmen um sie herum als positive Klassen, schließen Sie Cola-Flaschen ein und andere Cola-Produkte kennzeichnen sie als negative Klassen sowie als zufällige Objekte.
Führen Sie den Trick aus, Deep-Learning-Funktionen für kleine Datensätze zu verwenden, es sei denn, Sie erfassen einen sehr großen Datensatz. Idealerweise mit einer Kombination von Support Vector Machines (SVM) mit tiefen neuronalen Netzen.
Wenn Sie die Bilder einem zuvor trainierten Deep-Learning-Modell (z. B. GoogleNet) zugeführt haben, verwenden Sie die Daten der vorherigen Ebene (n) als Funktionen, um Ihren Klassifizierer zu trainieren, anstatt die Entscheidungsebene (endgültige Ebene) des neuronalen Netzwerks für Klassifizierungen zu verwenden.
OpenCV und Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV und SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
quelle
Sie benötigen ein Programm, das die Klassifizierungsgenauigkeit aus Erfahrung organisch lernt und verbessert.
Ich werde tiefes Lernen vorschlagen, mit tiefem Lernen wird dies ein triviales Problem.
Sie können das Inception v3-Modell in Tensorflow neu trainieren:
So trainieren Sie die letzte Ebene von Inception für neue Kategorien neu .
In diesem Fall trainieren Sie ein Faltungs-Neuronales Netzwerk, um ein Objekt als Coca-Cola zu klassifizieren oder nicht.
quelle
Als Alternative zu all diesen netten Lösungen können Sie Ihren eigenen Klassifikator trainieren und Ihre Anwendung fehleranfällig machen. Als Beispiel können Sie Haar Training verwenden , um eine gute Anzahl positiver und negativer Bilder Ihres Ziels bereitzustellen.
Es kann nützlich sein, nur Dosen zu extrahieren und kann mit der Erkennung transparenter Objekte kombiniert werden.
quelle
Es gibt ein Computer-Vision-Paket namens HALCON von MVTec, dessen Demos Ihnen gute Algorithmus-Ideen liefern könnten. Es gibt viele ähnliche Beispiele für Ihr Problem, die Sie im Demo-Modus ausführen und dann die Operatoren im Code betrachten und sehen können, wie Sie sie von vorhandenen OpenCV-Operatoren implementieren können.
Ich habe dieses Paket verwendet, um komplexe Algorithmen für solche Probleme schnell zu prototypisieren und dann herauszufinden, wie sie mithilfe vorhandener OpenCV-Funktionen implementiert werden können. Insbesondere für Ihren Fall könnten Sie versuchen, die im Operator find_scaled_shape_model eingebettete Funktionalität in OpenCV zu implementieren . Einige Betreiber verweisen auf das wissenschaftliche Papier zur Implementierung von Algorithmen, mit dessen Hilfe herausgefunden werden kann, wie in OpenCV etwas Ähnliches getan werden kann. Hoffe das hilft...
quelle
Wenn Sie daran interessiert sind, dass es Echtzeit ist, müssen Sie einen Vorverarbeitungsfilter hinzufügen, um zu bestimmen, was mit dem Hochleistungsmaterial gescannt wird. Ein guter schneller Vorverarbeitungsfilter in Echtzeit, mit dem Sie Dinge scannen können, bei denen es sich eher um eine Coca-Cola-Dose handelt, bevor Sie zu fragwürdigeren Dingen übergehen, ist ungefähr so: Durchsuchen Sie das Bild nach den größten Patches von Farbe, die eine gewisse Toleranz von der
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
Ihrer Coca-Cola-Dose entfernt sind. Beginnen Sie mit einer sehr strengen Farbtoleranz und arbeiten Sie sich bis zu milderen Farbtoleranzen vor. Wenn Ihrem Roboter dann die für die Verarbeitung des aktuellen Rahmens zugewiesene Zeit ausgeht, verwendet er die aktuell gefundenen Flaschen für Ihre Zwecke. Bitte beachten Sie, dass Sie die RGB-Farben in anpassen müssensqrt(pow(red,2) + pow(blue,2) + pow(green,2))
, um sie genau richtig zu machen.Auch das scheint wirklich dumm zu sein, aber haben Sie sichergestellt, dass
-oFast
Compiler-Optimierungen aktiviert sind, wenn Sie Ihren C-Code kompiliert haben?quelle
Vielleicht zu viele Jahre zu spät, aber dennoch eine Theorie zum Ausprobieren.
Das Verhältnis des Begrenzungsrechtecks des roten Logobereichs zur Gesamtabmessung der Flasche / Dose ist unterschiedlich. Im Fall von Can sollte 1: 1 sein, während sich in der Flasche (mit oder ohne Verschluss) unterscheidet. Dies sollte es einfach machen, zwischen den beiden zu unterscheiden.
Update: Die horizontale Krümmung des Logo-Bereichs unterscheidet sich zwischen Dose und Flasche aufgrund des jeweiligen Größenunterschieds. Dies kann besonders nützlich sein, wenn Ihr Roboter eine Dose / Flasche aufnehmen muss und Sie den Griff entsprechend festlegen.
quelle
Die ersten Dinge, nach denen ich suchen würde, sind Farben - wie ROT, wenn ich rote Augen in einem Bild erkenne - es gibt einen bestimmten Farbbereich zu erkennen, einige Eigenschaften in Bezug auf die Umgebung und wie den Abstand zum anderen Auge, wenn dies der Fall ist ist in der Tat im Bild sichtbar.
1: Das erste Merkmal ist die Farbe und Rot ist sehr dominant. Nach dem Erkennen des Coca Cola Red gibt es mehrere interessante Punkte 1A: Wie groß ist dieser rote Bereich (ist er ausreichend groß, um eine echte Dose zu bestimmen oder nicht - 10 Pixel sind wahrscheinlich nicht genug), 1B: Enthält er die Farbe des Etiketts - "Coca-Cola" oder Welle. 1B1: Gibt es genug, um eine hohe Wahrscheinlichkeit zu berücksichtigen, dass es sich um ein Etikett handelt?
Punkt 1 ist eine Art Abkürzung - Vorverarbeitung, wenn dieser Rotz im Bild vorhanden ist - fahren Sie fort.
Wenn dies der Fall ist, kann ich dieses Segment meines Bildes verwenden und ein wenig mehr aus dem fraglichen Bereich herauszoomen - schauen Sie sich im Grunde die umgebenden Regionen / Kanten an ...
2: Überprüfen Sie anhand der in 1 angegebenen ID des obigen Bildbereichs die umgebenden Punkte [Kanten] des betreffenden Elements. A: Gibt es eine Dose oben oder unten - Silber? B: Eine Flasche mag transparent erscheinen, aber auch ein Glastisch - gibt es einen Glastisch / ein Glasregal oder einen transparenten Bereich - wenn ja, gibt es mehrere mögliche Ergebnisse. Eine Flasche KANN eine rote Kappe haben, vielleicht nicht, aber sie sollte entweder die Form der Flaschenverschluss- / Gewindeschrauben oder eine Kappe haben. C: Selbst wenn dies A und B fehlschlägt, kann es immer noch eine Dose sein - teilweise. Dies ist komplexer, wenn es partiell ist, da eine teilweise Flasche / teilweise Dose möglicherweise gleich aussieht, so dass die Messung der Kante des roten Bereichs etwas weiter verarbeitet wird zum Rand .. kleine Flasche könnte in der Größe ähnlich sein ..
3: Nach der obigen Analyse würde ich mir dann den Schriftzug und das Wellenlogo ansehen - weil ich meine Suche nach einigen Buchstaben in den Wörtern ausrichten kann, da Sie möglicherweise nicht den gesamten Text haben, weil Sie nicht alle haben kann, würde sich die Welle an bestimmten Punkten des Textes ausrichten (in Bezug auf die Entfernung), so dass ich nach dieser Wahrscheinlichkeit suchen und wissen könnte, welche Buchstaben an diesem Punkt der Welle in der Entfernung x existieren sollten.
quelle
Dies ist ein altes Projekt, an dem ich gearbeitet habe. MAP-Bilder sind mit Javascript sehr einfach zu verwenden. Ich biete Ihnen das Objekt an, Sie lesen es und wissen, wie man es benutzt. Wir benötigen JQuery und andere Systeme nicht, um MAP-Images zu verwenden.
quelle