c++ - example - opencv tutorial python




Bildverarbeitung: Algorithmus Verbesserung für "Coca-Cola Can" Anerkennung (16)

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.

https://code.i-harness.com

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


Bitte schauen Sie sich den Predator-Tracker von Zdenek Kalal an. 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 wurde 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-Vorlagen 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.


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.


Ein alternativer Ansatz wäre das Extrahieren von Merkmalen (Schlüsselpunkten) unter Verwendung der skaleninvarianten Merkmaltransformation (SIFT) oder der beschleunigten beschleunigten Merkmale (SURF).

Es ist in OpenCV 2.3.1 implementiert.

Sie können ein nettes Codebeispiel mit Features in Features2D + Homography finden, um ein bekanntes Objekt zu finden

Beide Algorithmen sind gegenüber Skalierung und Rotation invariant. Da sie mit Features arbeiten, können Sie auch mit occlusion umgehen (solange genug Keypoints sichtbar sind).

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


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


Hmm, ich denke eigentlich, ich bin auf etwas (das ist wie die interessanteste Frage aller Zeiten - also wäre es eine Schande, nicht weiter zu versuchen, die "perfekte" Antwort zu finden, obwohl eine akzeptable Frage gefunden wurde). .

Sobald Sie das Logo finden, sind Ihre Probleme zur Hälfte erledigt. Dann müssen Sie nur die Unterschiede zwischen dem, was um das Logo herum ist , herausfinden. Außerdem möchten wir so wenig wie möglich machen. Ich denke, das ist eigentlich dieser einfache Teil ...

Was ist um das Logo herum? Für eine Dose sehen wir Metall, das sich trotz der Lichtwirkung in seiner Grundfarbe überhaupt nicht verändert. Solange wir den Winkel des Etiketts kennen, können wir sagen, was direkt über ihm liegt, also betrachten wir den Unterschied zwischen diesen:

Hier ist das, was über und unter dem Logo ist, komplett dunkel und farblich einheitlich. In dieser Hinsicht relativ einfach.

Hier ist, was oben und unten ist, hell, aber immer noch konsistent in der Farbe. Es ist alles-Silber, und Ganz-Silber-Metall scheint eigentlich ziemlich selten, sowie Silberfarben im Allgemeinen. Außerdem befindet es sich in einem dünnen Schlicker und nahe genug an dem Rot, das bereits identifiziert wurde, sodass Sie seine Form über die gesamte Länge verfolgen können, um einen Prozentsatz dessen zu berechnen, was als der Metallring der Dose angesehen werden kann. Wirklich, Sie brauchen nur einen kleinen Teil davon irgendwo entlang der Dose, um zu sehen, dass es ein Teil davon ist, aber Sie müssen immer noch eine Balance finden, die sicherstellt, dass es nicht nur eine leere Flasche mit etwas Metall dahinter ist.

Und schließlich der heikle. Aber nicht so knifflig, wenn wir nur durchgehen, was wir direkt über (und unter) dem roten Wrapper sehen können. Es ist transparent, was bedeutet, dass es zeigen wird, was auch immer dahinter steckt. Das ist gut, denn die Dinge, die dahinter stehen, sind wahrscheinlich nicht so konsistent in der Farbe wie das silberne runde Metall der Dose. Es könnte viele verschiedene Dinge hinter sich haben, die uns sagen würden, dass es eine leere (oder mit einer klaren Flüssigkeit gefüllte) Flasche oder eine konsistente Farbe ist, was entweder bedeuten könnte, dass sie mit Flüssigkeit gefüllt ist oder dass die Flasche einfach vor einer liegt einfarbig. Wir arbeiten mit dem, was der Ober- und Unterseite 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 es nicht das wichtigste visuelle Element der Dose hat, das im Vergleich zu dem, was hinter einer Flasche sein könnte, relativ einfach ist.

(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 nicht auf die Rötung der Kappe verlassen sollte)

In dem seltenen Fall, dass ein ähnlicher Silberton hinter der Flasche ist, selbst nach der Abstraktion des Plastiks, oder die Flasche ist irgendwie mit der gleichen Schattierung von Silberflüssigkeit gefüllt, können wir auf das zurückgreifen, was wir grob als das schätzen können Form des Silbers - die, wie ich bereits erwähnte, kreisförmig ist und der Form der Dose folgt. Aber auch wenn mir bestimmte Kenntnisse in der Bildverarbeitung fehlen, klingt das langsam. Besser noch, warum nicht ableiten, indem Sie einmal um die Seiten des Logos herum überprüfen, um sicherzustellen, dass dort nichts von der gleichen silbernen Farbe dort ist? Ah, aber was ist, wenn hinter einer Dose der gleiche Silberton ist? Dann müssen wir den Formen tatsächlich mehr Aufmerksamkeit schenken, indem wir wieder oben und unten auf die Dose blicken.

Je nachdem, wie makellos das alles sein muss, könnte es sehr langsam sein, aber ich denke, mein Grundkonzept besteht darin, zuerst die einfachsten und engsten Dinge zu überprüfen. Gehen Sie nach Farbunterschieden um die bereits angeglichene Form (was sowieso der triviale Teil davon zu sein scheint), bevor Sie sich die Mühe machen, die Form der anderen Elemente zu berechnen. Um es aufzulisten, geht es:

  • Finden Sie die Hauptattraktion (roter Logo-Hintergrund und möglicherweise das Logo selbst zur Orientierung, aber wenn die Dose weggedreht wird, müssen Sie sich auf das Rot allein konzentrieren)
  • Überprüfen Sie die Form und Ausrichtung erneut anhand der sehr deutlichen Rötung
  • Überprüfen Sie die Farben um die Form (da es schnell und schmerzlos ist)
  • Schließlich, wenn nötig, überprüfen Sie die Form dieser Farben um die Hauptattraktion für die richtige Rundheit.

Für den Fall, dass dies nicht möglich ist, bedeutet dies wahrscheinlich, dass die Ober- und Unterseite der Dose bedeckt sind, und die einzige Möglichkeit, die ein Mensch verwendet haben könnte, um zuverlässig zwischen der Dose und der Flasche zu unterscheiden, ist die Okklusion und Reflexion von der Dose, die eine viel härtere Schlacht zu verarbeiten wäre. Um jedoch noch weiter zu gehen, könnten Sie dem Winkel der Dose / Flasche folgen, um nach flaschenähnlichen Eigenschaften zu suchen, wobei Sie die halbtransparenten Scan-Techniken verwenden, die in den anderen Antworten erwähnt werden.

Interessante zusätzliche Albträume könnten eine Dose sein, die bequem hinter der Flasche in solch einer Entfernung sitzt, dass das Metall davon zufällig über und unter dem Etikett erscheint, was immer noch fehlschlagen würde, solange man über die gesamte Länge des Rots scannt Etikett - das ist eigentlich eher ein Problem, weil Sie nicht eine Dose erkennen, wo Sie haben könnten, im Gegensatz zu der Annahme, dass Sie tatsächlich eine Flasche, einschließlich der Dose, durch Zufall entdecken. Das Glas ist halb leer, in diesem Fall!

Als Disclaimer habe ich keine Erfahrung in der Bildverarbeitung außerhalb dieser Frage, noch habe ich jemals darüber nachgedacht, aber es ist so interessant, dass ich ziemlich genau darüber nachgedacht habe und nachdem ich alle anderen Antworten gelesen habe, halte ich das für möglich der einfachste und effizienteste Weg, um es zu erledigen. Persönlich bin ich nur froh, dass ich nicht wirklich darüber nachdenken muss, dies zu programmieren!

BEARBEITEN

Sehen Sie sich diese Zeichnung an, die ich in MS Paint gemacht habe ... Es ist absolut schrecklich und ziemlich unvollständig, aber basierend auf der Form und den Farben allein, können Sie raten, was es wahrscheinlich sein wird. Im Wesentlichen sind dies die einzigen Dinge, nach denen man suchen muss. Wenn Sie diese sehr charakteristische Form und Farbkombination so nah betrachten, was könnte es sonst noch sein? Das Bit, das ich nicht gemalt habe, der weiße Hintergrund, sollte als "etwas inkonsistent" betrachtet werden. Wenn es einen transparenten Hintergrund hätte, könnte es über fast jedes andere Bild gehen und man könnte es immer noch sehen.


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)


Ich mag Darren Cooks und Stapler die Antworten auf dieses 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 geeignet ist, Coca-Cola- Dosen von anderen Objekten zu unterscheiden, einschließlich: Flaschen , Werbetafeln , Werbungen und Coca-Cola-Utensilien, die alle mit diesem ikonischen Logo verbunden sind. 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 besteht hier darin, zu bestimmen, welche visuellen Merkmale eine Dose enthält, oder durch den negativen Raum, welche Merkmale für andere Coke-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 einer Flaschendeckel, 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 es könnte eine teilweise Flasche mit zusätzlichen Funktionen gemangelt werden, 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 der Objekt-Silhouette, wie Sie in Ihrer Frage skizziert haben , korrekt? 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 Spiegeleigenschaften des Objekts im Verhältnis zu unseren Lichtquellen korrekt sind ( illustrativer Video-Link zur 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 ist ein schneller Durchlauf durch http://dsp.stackexchange.com mehr als sinnvoll, um den für Ihre Zwecke am besten geeigneten und effizientesten Algorithmus zu ermitteln. Meine Absicht hier ist, rein und einfach zu 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, und idealerweise sollten Sie die geeigneten Maßnahmen ergreifen entsprechend.

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


Ich mag die Herausforderung und wollte eine Antwort geben, die das Problem löst, denke ich.

  1. Extrahieren Sie Features (Schlüsselpunkte, Deskriptoren wie SIFT, SURF) des Logos
  2. Passe die Punkte mit einem Modellbild des Logos an (mit Matcher wie Brute Force)
  3. Schätzen Sie die Koordinaten des starren Körpers ab (PnP-Problem - SolvePnP)
  4. Schätzen Sie die Kappenposition nach dem starren Körper
  5. Projizieren Sie Rückprojektion und berechnen Sie die Bildpixelposition (ROI) des Flaschenverschlusses (ich nehme an, Sie haben die intrinsischen Parameter der Kamera)
  6. Überprüfen Sie mit einer Methode, ob die Kappe vorhanden ist oder nicht. Wenn da, dann ist das die Flasche

Die Erkennung der Kappe ist ein anderes Problem. Es kann entweder kompliziert oder einfach sein. Wenn ich Sie wäre, würde ich einfach das Farbhistogramm in der ROI für eine einfache Entscheidung überprüfen.

Bitte geben Sie das Feedback, wenn ich falsch liege. Vielen Dank.


Ich würde rote Rechtecke erkennen: RGB -> HSV, Filter rot -> binäres Bild, close (dilatieren und erodieren, bekannt als imclose )

Dann durch die Rechtecke vom Größten zum Kleinsten schauen. 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?


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.


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 tun. Der eigentliche Nachteil ist, dass es Ihre Bearbeitungszeit verdoppelt. (Aber wenn man an reale Anwendungen denkt, wirst du am Ende sowieso Flaschen machen wollen ;-)


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.


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?


Maybe too many years late, but nevertheless a theory to try.

The ratio of bounding rectangle of red logo region to the overall dimension of the bottle/can is different. In the case of Can, should be 1:1, whereas will be different in that of bottle (with or without cap). This should make it easy to distinguish between the two.

Update: The horizontal curvature of the logo region will be different between the Can and Bottle due their respective size difference. This could be specifically useful if your robot needs to pick up can/bottle, and you decide the grip accordingly.







opencv