Bildverarbeitung: Algorithmusverbesserung für die Erkennung von Coca-Cola-Dosen


1658

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 .

Vorlagenübereinstimmung

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

Total fehlgeschlagen

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:

  1. Ä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. Binarisiertes Bild
  2. Rauschfilterung mithilfe der Medianfilterung (wobei der mittlere Pixelwert aller Nachbarn verwendet und das Pixel durch diesen Wert ersetzt wird), um das Rauschen zu reduzieren.
  3. Verwenden des Canny Edge Detection-Filters , um die Konturen aller Elemente nach zwei vorhergehenden Schritten abzurufen. Konturerkennung

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:

GHT

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


45
Man könnte sagen, dass diese Frage unter dsp.stackexchange.com oder stats.stackexchange.com besser geeignet ist, und Sie sollten auf jeden Fall in Betracht ziehen, diese Fragen auch auf diesen Websites erneut zu stellen.
ely

49
Das erste, was Sie hier tun müssen, ist zu analysieren, warum die verschiedenen Fehlerfälle auftreten. Isolieren Sie beispielsweise Beispiele für Orte, an denen Flaschen gewinnen, an denen die Bilder unscharf sind usw., und führen Sie statistische Analysen durch, um den Unterschied zwischen ihren Hough-Darstellungen und denen zu ermitteln, die Sie erkennen möchten. Einige großartige Orte, um alternative Ansätze
kennenzulernen,

7
@stacker macht einen guten Punkt. Aus Gründen der Geschwindigkeit möchten Sie kostengünstige Funktionen wie Histogramme orientierter Verläufe erhalten. Ein wirklich naiver erster Ansatz wäre, eine Reihe von Dosenrechtecken in einigen Trainingsbildern manuell zu beschriften und diese plus zufällige negative Beispiele zu verwenden, um einen SVM- oder Entscheidungsbaumklassifikator zu trainieren. Das Training wird länger dauern, aber die Ausführung auf neuartigen Bildern wird viel schneller sein. Ich habe vor, diese Methode aufzuschreiben, wenn ich mehr Zeit habe, um die richtigen Referenzen aufzunehmen.
ely

9
Wie wäre es mit einem ähnlichen Ansatz wie reCAPTCHA ? ;)
George Duckett

39
Warum wurde dies von dsp.stackexchange.com verschoben ? Es scheint, dass diese Seite noch besser passt als Stackoverflow o_O
BlueRaja - Danny Pflughoeft

Antworten:


672

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

Geben Sie hier die Bildbeschreibung ein

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


6
Ich stimme @stacker zu - SIFT ist eine ausgezeichnete Wahl. Es ist sehr robust gegen Skalierungs- und Rotationsvorgänge. Es ist etwas robust gegen perspektivische Verformungen (dies kann verbessert werden, wie vom Stapler vorgeschlagen: eine Vorlagendatenbank mit verschiedenen perspektivischen Ansichten des gewünschten Objekts). Die Achillesferse wäre meiner Erfahrung nach starke Beleuchtungsschwankungen und sehr teure Berechnungen. Ich kenne keine Java-Implementierungen. Mir ist eine OpenCV-Implementierung bekannt, und ich habe eine GPU c ++ / Windows- Implementierung ( SiftGPU ) verwendet, die für die Echtzeitleistung geeignet ist.

31
Ein Hinweis zur Warnung: So sehr ich SIFT / SURF liebe und was sie mir angetan haben, sind sie patentbelastet. Dies könnte ein Problem sein, abhängig von einer Reihe von Bedingungen , einschließlich geografische Lage AFAIK.
Agos

12
Probieren Sie also OpenCVs ORB oder FREAK aus, die keine Patentprobleme haben. ORB ist viel schneller als SIFT. ORB es ist ein bisschen schlecht mit Skalierungs- und Lichtschwankungen in meiner Erfahrung, aber testen Sie es selbst.
Rui Marques

66
Wie können Sie dies als Antwort akzeptieren? Keiner der Feature-Deskriptoren kann Flaschen von Dosen unterscheiden. Alle zeigen nur invariante lokale Musterdeskriptoren an. Ich bin damit einverstanden, dass SIFT, SURF, ORB, FREAK usw. Ihnen beim Feature-Matching helfen können, aber .. Was ist mit Ihren anderen Teilen der Frage wie Okklusionen, Flasche gegen Dose usw. Ich hoffe, dass dies tatsächlich keine vollständige Lösung ist, wenn Sie dies tun würden Habe dein Problem gegoogelt, wahrscheinlich wäre das erste Ergebnis nur diese Antwort.
G453

11
@ G453 du hast absolut recht! Wahrscheinlich war er von der Leistung von SHIFT fasziniert und vergaß, dass das Extrahieren und
Anpassen von Features

383

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

Signatur-Scanlinie

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


24
Das ist ein großartiger Vorschlag, ich mag besonders die Tatsache, dass dieser Algorithmus ziemlich schnell sein sollte, auch wenn er wahrscheinlich viele falsche Negative haben wird. Eines meiner versteckten Ziele ist es, diese Erkennung in Echtzeit für die Robotik zu verwenden. Das könnte also ein guter Kompromiss sein!
Charles Menguy

42
Ja, es wird oft vergessen (in einem Bereich, der durch Präzision gekennzeichnet ist), dass Approximationsalgorithmen für die meisten Echtzeit-Modellierungsaufgaben in der realen Welt wesentlich sind. (Ich habe meine These auf dieses Konzept gestützt .) Speichern Sie Ihre zeitaufwändigen Algorithmen für begrenzte Regionen (um falsch positive Ergebnisse zu entfernen). Und denken Sie daran: In der Robotik sind Sie normalerweise nicht auf ein einzelnes Bild beschränkt. Unter der Annahme eines mobilen Roboters kann eine schnelle Alge Dutzende von Bildern aus verschiedenen Winkeln in kürzerer Zeit durchsuchen, als hochentwickelte Algen für eines ausgeben, wodurch falsche Negative erheblich reduziert werden.
kmote

29
Ich mag die Idee, einen Barcode-Scanner zu verwenden, um Coca-Cola-Logos extrem schnell zu erkennen . +1!
Li-aung Yip

8
Das Problem bei der Suche nach Signaturen besteht in diesem Fall darin, dass der Algorithmus die Dose nicht erkennt, wenn wir die Dose auf die andere Seite drehen, dh die Signatur ausblenden.
Karlphillip

34
@karlphillip: Wenn Sie die Signatur, dh das Logo, ausblenden, schlägt jede Methode fehl, die auf der Suche nach dem Logo basiert.
Li-aung Yip

162

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


5
Ja, ich habe auch darüber nachgedacht, aber nicht viel Zeit dafür gehabt. Wie würden Sie eine Flasche erkennen, da ihr Hauptteil wie eine skalierte Dose aussieht? Ich habe darüber nachgedacht, auch nach dem roten Stecker zu suchen und zu prüfen, ob er mit der abgefüllten Mitte übereinstimmt, aber das scheint nicht sehr robust zu sein.
Charles Menguy

42
Wenn sich parallel zur "Coca Cola" eine rote Kappe (oder ein roter Ring) befindet, handelt es sich höchstwahrscheinlich um eine Flasche.
Lukasz Madon

@linker Wie haben Sie Ihren Algorithmus für Dosen trainiert? Hatten Sie Beispiele für Dosen? Wie wäre es mit einem Training mit Flaschenbeispielen?
Siamii

1
Die Stärke dieses Algorithmus besteht darin, dass Sie nur eine Vorlage zum Trainieren benötigen und dann alle Transformationen anwenden, um sie mit anderen potenziellen Dosen abzugleichen. Ich habe eine binärisierte und konturbasierte Version dieser Vorlage zum Trainieren verwendet, daher wäre der einzige Unterschied zwischen Dose und Flasche der Stecker, aber ich befürchte, dass dies zu mehr Fehlalarmen führen würde, da der Schwerpunkt irgendwo am Rand liegen würde oder außerhalb der Flasche. Es lohnt sich, es auszuprobieren, denke ich. Aber das wird meine Bearbeitungszeit verdoppeln und ich werde weinen;)
Charles Menguy

7
Im Wesentlichen ist dies eine vernünftige Richtung. Ich würde es etwas anders formulieren: Finden Sie zuerst alle Kandidaten und bestimmen Sie dann für jeden Kandidaten, ob es sich um eine Flasche, eine Dose oder etwas anderes handelt.
MSalters

131

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.

Schauen Sie sich dies besonders an, um zu sehen, wie genau sie Glas erkennen:

Siehe das Implementierungsergebnis:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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.

  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 transparente Teile abgedeckt sind.

Aber trotzdem, wenn es keines der oben genannten Probleme in den Bildern gibt, scheint dies ein besserer Weg zu sein.


+1 Ich habe darüber nachgedacht und war auf dem Weg, diesen Ansatz umzusetzen. @Linker sollte jedoch seine Bilder freigeben, damit wir versuchen können, fundiertere Vermutungen anzustellen.
Karlphillip

Ja, ich denke auch, dass es gut war, wenn es mehr Bilder gab.
Abid Rahman K

Überlegen Sie, ob wir nur die Etiketten für Flaschen / Dosen haben und keinen der anderen Unterscheidungsmerkmale für Flaschenverschluss oder Transparenz oder Dose oben / unten - Die Breite der Flasche unterscheidet sich von der Breite der Dose.
Ken

Was ist, wenn eine Dose vor dem Logo für die Flasche platziert wird?
AlgoRythm

51

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:

  • Ist die Form der Objektsilhouette, wie Sie sie in Ihrer Frage skizziert haben , korrekt? Wenn ja, +1.
  • Wenn wir das Vorhandensein von natürlichem oder künstlichem Licht annehmen, erkennen wir einen Chromumriss an der Flasche, der anzeigt, ob diese aus Aluminium besteht? Wenn ja, +1.
  • Stellen wir fest, dass die Spiegeleigenschaften des Objekts im Verhältnis zu unseren Lichtquellen korrekt sind ( illustrativer Videolink zur Erkennung von Lichtquellen )? Wenn ja, +1.
  • Können wir andere Eigenschaften des Objekts bestimmen, die es als Dose identifizieren, einschließlich, aber nicht beschränkt auf den topologischen Bildversatz des Logos, die Ausrichtung des Objekts, das Nebeneinander des Objekts (z. B. auf einer ebenen Fläche)? wie ein Tisch oder im Zusammenhang mit anderen Dosen) und das Vorhandensein einer Aufreißlasche? Wenn ja, jeweils +1.

Ihre Klassifizierung könnte dann wie folgt aussehen:

  • Zeichnen Sie für jedes Kandidaten-Match einen grauen Rand, wenn das Vorhandensein eines Coca-Cola-Logos festgestellt wurde.
  • Zeichnen Sie für jedes Spiel über +2 einen roten Rand.

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


2
Das ist ein interessanter Ansatz, der zumindest einen Versuch wert ist. Ich mag Ihre Argumentation zu diesem Problem sehr
Charles Menguy

Das habe ich mir gedacht: Schließen Sie bestimmte Arten von Fehlalarmen nicht aus. Regel in mehr Funktionen, was eine Cola-Dose macht. Aber ich frage mich: Was machst du mit einer zerquetschten Dose? Ich meine, wenn Sie auf eine Cola-Dose treten, ist es immer noch eine Cola-Dose. Aber es wird nicht mehr die gleiche Form haben. Oder ist das Problem AI-Complete?
Ian

41

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.


Ich mag die Idee, aber es scheint, als würden Sie einige wirklich sehr gute Lichtverhältnisse brauchen. In dem Beispielbild, in dem sich zum Beispiel sowohl Dose als auch Flasche befinden, scheint es etwas schwierig zu sein, die Unterscheidung zu treffen.
Charles Menguy

Beachten Sie in Ihrem Beispiel, dass die Spiegelung des Kunststoffetiketts viel diffuser ist als die sehr hellen Flecken auf der Dose. So kann man es erkennen.
Tskuzzy

Ich sehe, welche Art von Farbraumdarstellung würden Sie in diesem Fall verwenden, um die Spekularität in Ihrem Algorithmus zu erfassen? Dies scheint ziemlich schwer in RGB oder HSV zu bekommen
Charles Menguy

3
Was wäre, wenn sich die Lichtquelle hinter der Dose befände? Ich denke, Sie würden das Highlight nicht sehen.
Rui Marques

37

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.


Danke für den Link, der interessant aussieht. Welche Größe des Trainingssatzes ist in Bezug auf das Training angemessen, um angemessene Ergebnisse zu erzielen? Wenn Sie eine Implementierung auch in c # haben, wäre das auch sehr hilfreich!
Charles Menguy

Bei der Untersuchung von TLD habe ich einen anderen Benutzer gefunden, der nach einer C # -Implementierung sucht. Gibt es einen Grund, Ihre Arbeit nicht auf Github zu übertragen? stackoverflow.com/questions/29436719/…
Spillner

2
NB Jahre später ist Link jetzt tot
J Evans

33

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.


3
Eigentlich habe ich das in der Post nicht erklärt, aber für diese Aufgabe erhielt ich einen Satz von ungefähr 30 Bildern und musste einen Algorithmus ausführen, der sie alle in verschiedenen Situationen wie beschrieben abgleichen würde. Natürlich wurden am Ende einige Bilder herausgehalten, um den Algorithmus zu testen. Aber ich mag die Idee von Kinect-Sensoren und würde gerne mehr zu diesem Thema lesen!
Charles Menguy

Wie groß wäre ungefähr das Trainingsset mit einem neuronalen Netzwerk, um zufriedenstellende Ergebnisse zu erzielen? Das Schöne an dieser Methode ist auch, dass ich nur eine Vorlage brauche, die zu fast allem passt.
Charles Menguy

2
Wenn Ihr Satz von Bildern vordefiniert und begrenzt ist, führt nur hardcore perfekte Ergebnisse in Ihrem Prog;)
sne11ius

Ja, wenn ich mit dem Datensatz trainiere, gegen den ich den Algorithmus ausführen werde, bekomme ich sicher perfekte Ergebnisse :) Aber zum Beispiel für diese Aufgabe wurde das Programm am Ende vom Lehrer an einer Reihe von Bildern getestet . Ich möchte etwas tun, das robust ist und nicht zu den Trainingsdaten passt.
Charles Menguy

Die Anzahl der Trainingssätze variiert, Sie müssen jedoch einige Dinge beachten: Trainieren Sie nicht zu viel, Sie möchten wahrscheinlich einen Testsatz, der zeigt, wie genau Ihre Genauigkeit ist. Die Anzahl der Trainingssätze hängt auch von der Anzahl der verwendeten Ebenen ab.
Fantastischer Herr Fox

24

Ich würde rote Rechtecke erkennen: RGB -> HSV, rot filtern -> Binärbild, schließen (erweitern, dann erodieren, bekannt als imclosein 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?


2
So wie dies in der kurzen Zeit, in der es bewegt wurde, auf DSP diskutiert wurde, haben einige Flaschen möglicherweise keine Stopfen;) oder der Stopfen könnte teilweise versteckt sein.
Charles Menguy

22

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.


3
Eigentlich nein: Es gibt keine Einschränkung hinsichtlich Größe oder Ausrichtung (oder Ausrichtung, aber ich habe das nicht wirklich gehandhabt), so dass Sie eine Flasche sehr weit im Hintergrund und eine Dose im Vordergrund haben können und die Dose viel größer wäre als die Flasche.
Charles Menguy

Ich habe auch überprüft, dass das Verhältnis von Breite zu Höhe für Flaschen und Dosen ziemlich ähnlich ist, daher ist dies auch keine Option.
Charles Menguy

Das Etikettenverhältnis (da es sich um eine Marke handelt) ist das gleiche. Wenn sich die (größere) Flasche auf dem Bild etwas weiter entfernt befindet, entspricht ihre Größe genau der der Dose.
littleadv

3
Um ein bisschen mehr zu erklären. Angenommen, die Dose ist bei z = 0 und die Flasche bei z = -100. Da die Flasche weit hinten ist, sieht sie kleiner aus. Aber wenn ich weiß, dass die Flasche bei z = -100 und die Dose bei z = 0 ist, kann ich die erwartete Größe der Dose / Flasche berechnen, wenn beide in z = 0 übersetzt werden. Jetzt sind sie also in der gleichen Tiefe und daher kann ich Entscheidungen basierend auf der Größe treffen.
Sharad

2
Dies ist nur ein Kommentar, keine Antwort, aber es ist viel näher daran, eine Antwort zu sein als der Kommentar als Antwort oben mit 120 Stimmen.
Fattie

22

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:

  • Finden Sie die Hauptattraktion (roter Logo-Hintergrund und möglicherweise das Logo selbst zur Orientierung, falls Sie die Dose abwenden müssen, müssen Sie sich nur auf das rote konzentrieren)
  • Überprüfen Sie die Form und Ausrichtung erneut anhand der sehr ausgeprägten Rötung
  • Überprüfen Sie die Farben um die Form (da es schnell und schmerzlos ist)
  • Überprüfen Sie schließlich bei Bedarf die Form dieser Farben um die Hauptattraktion herum auf die richtige Rundheit.

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

schlechtes Zeichnen einer Dose in MS-Farbe 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.


10
Der jeweilige Rotton ist meist subjektiv und wird stark von Beleuchtungsaspekten und Weißabgleich beeinflusst. Sie könnten überrascht sein, wie sehr sich diese ändern können. Betrachten Sie zum Beispiel diese Schachbrettillusion .
Octopus

2
Ein Update des von @Octopus geposteten Links
Hat

Eine Wahrnehmungsillusion hat keinen Einfluss darauf, was Ihre Webcam sieht - dh was Ihr Code erhält -, sondern nur darauf, wie ein menschliches Auge das Gehirn hilfreich (?) Täuscht.
Scheune

17

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


1
Ich hatte den gleichen Gedanken, aber ich denke, der Silberstreifen auf der Dose ändert sich dramatisch, abhängig vom Winkel der Dose auf dem Bild. Es kann eine gerade Linie oder ein Kreis sein. Vielleicht könnte er beides als Referenz verwenden?
Alexis Dufrenoy

15

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

  1. Extrahieren Sie Merkmale (Schlüsselpunkte, Deskriptoren wie SIFT, SURF) des Logos
  2. Ordnen Sie die Punkte einem Modellbild des Logos zu (mithilfe von Matcher wie Brute Force).
  3. Schätzen Sie die Koordinaten des starren Körpers (PnP-Problem - SolvePnP)
  4. Schätzen Sie die Kappenposition anhand des starren Körpers
  5. Führen Sie eine Rückprojektion durch und berechnen Sie die Bildpixelposition (ROI) des Flaschenverschlusses (ich gehe davon aus, dass Sie die intrinsischen Parameter der Kamera haben).
  6. Überprüfen Sie mit einer Methode, ob die Kappe vorhanden ist oder nicht. Wenn da, dann ist dies die Flasche

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.


13

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 .


5
Laut OP gab es 30 hochauflösende Bilder, was wahrscheinlich nicht das beste Szenario für das Training von ConvNets ist. Sie sind nicht nur zu wenig (sogar erweitert), der hochauflösende Teil würde ConvNets zerstören.
Kostas Mouratidis

11

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


2
Interessantes Projekt, das jedoch nur für Ihr spezielles Setup gilt.
Rui Marques

10

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


10

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


9

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.


2
Hot Dog oder nicht Hot Dog?
YellowPillow

6

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.


3

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


0

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üssen sqrt(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 -oFastCompiler-Optimierungen aktiviert sind, wenn Sie Ihren C-Code kompiliert haben?


0

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.


-1

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.


-9

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.

    //Copyright Cherif yahiaoui, by ELEBAN.FR

//variables de flottement.
var myInstOne = null;
var globalize = null;

var eleban_preload_images = function (name, imgs, url){
try{
    var oThis = this;
    this.images = new Array();
    this.imageshover = new Array();
    this.imagesNames = new Array(imgs.split(";"));


        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i] = new Image();
            this.imageshover[i] = new Image();
        }

    this.url = url;

    this.GetAbsoluteurl = function () {

    var img = new Image(); img.src = url;
    url = img.src; img = null; 
        this.url = url; 

    };

    this.Preload = function () {

        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i].src = this.url+("btn-"+this.imagesNames[0][i]+".png");
            this.imageshover[i].src = this.url+("btn-"+this.imagesNames[0][i]+"-hover.png");
        }

    };
    this.GetAbsoluteurl();
    this.Preload();
}
finally {return;}
}

var g_preloaderhover = new eleban_preload_images("loaderhover","menu;malette;reservation;cabine;facebook;map;amis","./images/");


//variable arret flottement
var g_stopflo = false;

var myObjfloater = function(name, idname, itop, differ ) {
var oThis = this; // création d'une référence vers l'objet courant
this.name = name;
this.id =idname;
this.xstep= 0.3;
this.itime = 30;
this.obj = null;
this.y = itop;
this.yadd = 0;
this.up = true;
this.pause = false;
this.differ = differ;
this.coordsimage = null;
this.objimg = null;
this.initimages = false;
this.compteur = 0;
this.over = false;
this.timeoutstop = null;
try{
this.initimage = function(){
var img = this.obj.getElementsByTagName('img')[0];
this.coordsimage = new Array(img.width, img.height);
this.objimg = img;
this.initimages = true;
};


this.myMethod = function() {
if(!g_stopflo){
    if(this.differ != 0){ 
this.differ=this.differ-0.1; 
}else{

if(this.obj){
if(this.over == false){
    this.yadd=this.yadd+0.1; this.itime = this.itime + 10;
this.obj.style.visibility = "hidden";
this.y = ((this.up)? this.y - this.yadd : this.y + this.yadd);
this.obj.style.marginTop = this.y +"%" ;
this.obj.style.visibility = "visible";

if (this.yadd > this.xstep){ 
    this.up = (this.up)? false : true;
    this.yadd = -0.1; this.itime=180;
}
}
}else{
    if (document){
        if(document.getElementById) {
         this.obj = document.getElementById(this.id); 
        //this.y = this.obj.offsetTop;
        }else{
        if(document.getElementByTagName) { this.obj = document.getElementByTagName(this.id); this.y = this.obj.offsetTop;}
        }

    }
}
}
this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}    
};

this.callDelayed = function() {
    // utilisation de la référence vers l'objet
if(!g_stopflo){
    this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}
};
}
finally {return;}
};

// special creation des zones AREA
function eleban_createallarea(){
try{
var measur = new Array("w", "h");
measur["w"] = new Array(330,570,185,300,115,390,225);
measur["h"] = new Array(460,570,295,450,100,190,115);
var ititle = new Array("Voir les menus  et nos suggestions","Repas &agrave; emporter","R&eacute;servation d&rsquo;une table","Nous contacter","Nous rejoindre sur FaceBook","Calculer votre trajet","liste des amis");
var ihref = new Array("menus.html","emporter.html","reservation.html","contact.html","likebox.html","google.html","amis.html");
var b_map = new Array(0,1,2,3,4,5,6);
b_map[0] = "71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38";
b_map[1] = "66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92";
b_map[2] = "19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90";
b_map[3] = "60,0,216,1,226,20,225,403,168,421,42,410,45,10";
b_map[4] = "31,7,72,10,82,18,88,45,88,71,76,81,29,80,17,68,16,18";
b_map[5] = "91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94";
b_map[6] = "6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65";

if (document.getElementById){
for (var i=0; i<b_map.length;i++){
var obj = document.getElementById("pc_menu"+i);
    if(obj){
    var ct = '<img class=\"pc_menu\" src=\"'+g_preloaderhover.images[i].src+'\" alt=\"\" width=\"'+measur["w"][i]+'\" height=\"'+measur["h"][i]+'\" usemap=\"#MAP_INDEX'+i+'\" \/>';
    ct+='<map name=\"MAP_INDEX'+i+'\">';
    ct+='<area shape=\"poly\" coords=\"'+b_map[i]+'\" title=\"'+ititle[i]+'\" href=\"'+ihref[i]+'\" \/>';
    ct+='<\/map>';
    obj.innerHTML = ct;
    }
}
}
}
finally {return;}
}

//preload, creation et gestion de tous les evenements


var image_resizer = function(g_layer){


    b_org_elm = new Array("w",  "h");
    b_org_elm["w"] = new Array(330,570,185,300,115,390,225);
    b_org_elm["h"] = new Array(460,570,295,450,100,190,115);

    b_map = new Array(0,1,2,3,4,5,6);
    b_map[0] = new Array(71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38);
    b_map[1] = new Array(66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92);
    b_map[2] = new Array(19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90);
    b_map[3] = new Array(60,0,216,1,226,20,225,403,168,421,42,410,45,10);
    b_map[4] = new Array(31,6,70,10,78,18,84,23,88,44,88,70,78,80,75,81,33,82,23,76,18,69,16,22,21,13);
    b_map[5] = new Array(91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94);
    b_map[6] = new Array(6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65);


    b_layer = g_layer;

//gere mouseover
    this.mouseover = function(e){
        if (!e) var e = window.event;
        var tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                var divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.imageshover[ii].src;
                                }
                        }
                    }
                }
            }
    };

//gere mouseout
    this.mouseout = function(e){
        if (!e) var e = window.event;
        tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.images[ii].src;
                                }
                        }
                    }
                }
            }
    };

//ajout evenements entree sortie à la page web lors du chargement de la page
    this.init = function () {

        for(var i=0; i<b_org_elm["w"].length;i++){
            w = document.getElementById("pc_menu"+i).offsetWidth;
            h = document.getElementById("pc_menu"+i).offsetHeight;

            xa = w/parseFloat(b_org_elm["w"][i]);
            ya = h/parseFloat(b_org_elm["h"][i]);

            area = document.getElementById("pc_menu"+i).getElementsByTagName('area')[0];

            b_map2 = area.coords.split(",");
            yswitch = true;
                for(m=0; m<b_map2.length;m++){
                b_map2[m] = Math.round(parseFloat(b_map[i][m]) * ((yswitch)? xa: ya));
                yswitch = (yswitch)? false :  true;
                }
            area.coords = b_map2.join(',');
        }
    }; 


    this.resize = function () {
    clearTimeout(myInstOne.timeoutstop);
    g_stopflo=true;

    globalize.init();
    g_stopflo=false;
    myInstOne.obj = null;
    myInstOne.callDelayed();
    };


    nar = document.getElementsByTagName('area').length;

        for(var i=0; i<nar;i++){
            var elem = document.getElementsByTagName('area')[i];
            if (elem.addEventListener){
                    elem.addEventListener("onmouseover",this.mouseover,true);
                elem.addEventListener("onmouseout",this.mouseout,true);
            }else if (elem.attachEvent) {
                    elem.attachEvent("onmouseover", this.mouseover);
                    elem.attachEvent("onmouseout", this.mouseout);
            }else{
                    elem["onmouseover"] = this.mouseover;
                    elem["onmouseout"] = this.mouseout;
            }
        }

            window.onresize = this.resize;
        window.onmouseover = this.mouseover;
        window.onmouseout = this.mouseout;
}


//permet de temporiser et éviter les erreurs de chargement des objets
function temporise_Init(Lastdiv){
if(document.getElementById){
    if(document.getElementById(Lastdiv)){

    eleban_createallarea();

    myInstOne = new myObjfloater('b_menumap11', 'pc_menu1', 1, 0);

    globalize = new image_resizer(document.getElementById('pc_redim'));
    globalize.init();
        globalize.resize();



    }else{
    setTimeout(temporise_Init(Lastdiv), 30);
    }
}
}


window.onload = function () {
temporise_Init("pc_bandeau");
}

3
was macht das
user8408080
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.