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




12 Answers

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

image processing

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




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




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




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.




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?




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 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 mag Ihre Frage, unabhängig davon, ob es sich um ein Thema handelt oder nicht: P

Eine interessante Seite; Ich habe gerade ein Fach in meinem Abschluss abgeschlossen, wo wir Robotik und Computer Vision behandelt haben. Unser Projekt für das Semester war dem von Ihnen beschriebenen sehr ähnlich.

Wir mussten einen Roboter entwickeln, der mit einer Xbox Kinect Cola-Flaschen und -Dosen bei jeder Orientierung in einer Vielzahl von Licht- und Umgebungsbedingungen erkennt. Unsere Lösung beinhaltete die Verwendung eines Bandpassfilters auf dem Hue-Kanal in Kombination mit der Hough-Circle-Transformation. Wir konnten die Umgebung ein wenig einschränken (wir konnten wählen, wo und wie wir den Roboter und den Kinect-Sensor positionieren), sonst würden wir die SIFT- oder SURF-Transformationen verwenden.

Sie können über unseren Ansatz in meinem Blogbeitrag zum Thema lesen :)




Tiefes Lernen

Sammeln Sie mindestens ein paar hundert Bilder mit Cola-Dosen, kommentieren Sie die Bounding Box um sie herum als positive Klassen, enthalten Sie Cola-Flaschen und andere Cola-Produkte beschriften Sie negative Klassen sowie zufällige Objekte.

Wenn Sie nicht einen sehr großen Datensatz sammeln, sollten Sie den tiefen Einsatz von Deep Learning-Funktionen für kleine Datenmengen durchführen. Idealerweise eine Kombination von Support Vector Machines (SVM) mit tiefen neuronalen Netzen.

Sobald Sie die Bilder einem zuvor trainierten Deep-Learning-Modell (z. B. GoogleNet) zugeführt haben, verwenden Sie statt der Entscheidungsschicht (final) des neuronalen Netzwerks Klassifizierungen und verwenden Sie die Daten der vorherigen Ebene (n) als Funktionen zum Trainieren Ihres Klassifikators.

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




Es gibt ein Computer-Vision-Paket namens HALCON von MVTec, dessen Demos Ihnen gute Algorithmen-Ideen geben könnten. Es gibt viele ähnliche Beispiele für Ihr Problem, die Sie im Demo-Modus ausführen könnten, und dann die Operatoren im Code betrachten und sehen, wie Sie sie von vorhandenen OpenCV-Operatoren implementieren.

Ich habe dieses Paket verwendet, um komplexe Algorithmen für solche Probleme schnell zu entwickeln und dann zu finden, wie man sie unter Verwendung der vorhandenen OpenCV-Funktionen implementiert. Insbesondere könnten Sie in Ihrem Fall versuchen, die in den Operator find_scaled_shape_model eingebettete Funktionalität in OpenCV zu implementieren. Einige Betreiber weisen auf die wissenschaftliche Arbeit zur Implementierung des Algorithmus hin, die helfen könnte, etwas Ähnliches in OpenCV zu finden. Hoffe das hilft...




Die Antworten auf dieser Seite lauten:

  • "SIFT benutzen"

  • "Verwenden Sie einen Kinect"

Wenn Sie sich nicht für die eigentliche Computerwissenschaft der Bilderkennung interessieren und nur etwas (wie SIFT oder Kinect) "benutzen" wollen,

Es ist heutzutage allgegenwärtig, nur die allgemein verfügbaren Bilderkennungssysteme zu verwenden.

Ab 2017 und seit Jahren ist die Bilderkennung weit und trivial verfügbar .

Sie würden sich nicht mehr hinsetzen und versuchen, die Bilderkennung von Grund auf neu zu erstellen, als wenn Sie sich hinsetzen und anfangen, Karten zu sammeln und anzuzeigen, oder HTML von Grund auf neu zu erstellen oder eine SQL-Datenbank von Grund auf neu zu schreiben.

Sie verwenden einfach den Tensorflow von Google (sie haben den Punkt erreicht, Chips zu bauen, um den Tensorfluss schneller zu verarbeiten), Clarifai, Bluemix oder was auch immer.

AWS hat gerade eine gute Bilderkennung (2018) veröffentlicht.

Um zum Beispiel einen dieser Dienste zu benutzen, sind es ein paar Zeilen Code ....

func isItACokeCan() {

    jds.headers = ["Accept-Language":"en"]
    let h = JustOf<HTTP> ...use your favorite http library

    let u: String =
        "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify"
        + "?api_key= ... your API key ..."
        + "&version=2016-05-20"
        + "&classifier_ids= ... your Classifier name ..."

    h.post( u,
        files: ["x.jpeg": .data("x.jpeg", liveImageData!, "image/jpeg")]

    ) { r in
        if r.ok { DispatchQueue.main.async { self.processResult(r.json) } }
        else { DispatchQueue.main.async { self.doResults("network woe?") } }
    }
}

func processResult(_ rr: Any?){
    let json = JSON(rr!)
    print("\(json)")
}

Das wird Ihnen im wahrsten Sinne des Wortes die beste existierende Koks-Dosen-Erkennung auf der Erde geben .

Ab 2018 kann man sich nicht mehr hinsetzen und "bessere Cola-Dosen-Erkennung als Bluemix schreiben", als wenn man sich "hinsetzen und ein besseres Go-Programm schreiben könnte als AlphaGo".

Systeme wie Siri, Google Maps, BAAS, die großen Bildverarbeitungsbemühungen - und natürlich die Google-Textsuche selbst - sind bahnbrechend.

Beachten Sie den unglaublichen Unterschied, seit diese Frage vor sechs Jahren gestellt wurde.

Auf jeden Fall, wenn Sie in der eigentlichen Computerwissenschaft der Bilderkennung sind , gehen Sie dafür.

Aber diese QA scheint eher eine Überprüfung der Technologie zu sein.

Insofern die Antworten hier lauten: "Benutze eine SIFT-Bibliothek" - das würdest du wirklich nicht tun. (Noch einmal - nicht mehr als Sie aus irgendeinem Grund mühevoll einen Webserver oder eine SQL-Datenbank von Grund auf neu programmieren!)

Sie verbinden sich einfach mit den bekannten, allgegenwärtigen "BAAS" -Systemen zur Bilderkennung - das ist eine Codezeile.




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.




Related

c++ algorithm image-processing opencv