Wie finde ich Wally mit Python?


82

Schamlos auf den Zug springen :-)

Inspiriert von Wie finde ich Waldo mit Mathematica und dem Follow-up? Wie finde ich Waldo mit R ? Als neuer Python-Benutzer würde ich gerne sehen, wie dies gemacht werden kann. Es scheint, dass Python dafür besser geeignet wäre als R, und wir müssen uns keine Sorgen um Lizenzen machen, wie wir es bei Mathematica oder Matlab tun würden.

In einem Beispiel wie dem folgenden würde es offensichtlich nicht funktionieren, einfach Streifen zu verwenden. Es wäre interessant, wenn ein einfacher regelbasierter Ansatz für schwierige Beispiele wie dieses entwickelt werden könnte.

Am Strand

Ich habe das Tag [maschinelles Lernen] hinzugefügt, da ich glaube, dass für die richtige Antwort ML-Techniken verwendet werden müssen, wie beispielsweise der von Gregory Klopper im ursprünglichen Thread befürwortete RBM-Ansatz (Restricted Boltzmann Machine). In Python ist RBM-Code verfügbar, der möglicherweise ein guter Ausgangspunkt ist, für diesen Ansatz sind jedoch offensichtlich Trainingsdaten erforderlich.

Auf dem IEEE International Workshop 2009 zum LERNEN VON MASCHINEN FÜR DIE SIGNALVERARBEITUNG (MLSP 2009) veranstalteten sie einen Datenanalyse-Wettbewerb: Wo ist Wally? . Die Trainingsdaten werden im Matlab-Format bereitgestellt. Beachten Sie, dass die Links auf dieser Website tot sind, aber die Daten (zusammen mit der Quelle eines Ansatzes von Sean McLoone und Kollegen finden Sie hier (siehe SCM-Link). Scheint ein Ausgangspunkt zu sein.


6
Entschuldigung ... gibt es ein Programm, das Waldo auf diesem Foto erfolgreich findet? Es scheint keine Unterscheidungsmerkmale des "echten" Waldo zu geben. Früher hatte ich das gleiche Waldo-Buch, und soweit ich mich erinnere, musste ein Hinweis in natürlicher Sprache verwendet werden, vielleicht, dass der echte Waldo keinen Stock oder so etwas in der Hand hielt. Ich sehe nicht ein, wie Sie Waldo programmgesteuert finden könnten, ohne dass Ihr Programm zuerst den Hinweis in natürlicher Sprache verstehen könnte.
AdamKG

Ja, du hast recht, sorry ... obwohl das auch eine interessante Aufgabe wäre! Ich habe das Bild auf das alte "Am Strand" umgestellt, das auch Streifen hat ... (es gibt noch einen weiteren Grund, dieses Bild zu wählen!)
tdc

Obwohl diese Frage interessant ist, ist unklar, wonach Sie fragen. Ist es eine Implementierung einer Lösung? Ein Hinweis darauf, welche ML-Bibliothek für Python dafür verwendet werden soll?
Simon Bergot

@Simon eine vollständige Implementierung wäre wahrscheinlich ein bisschen viel zu fragen, aber ein Skelett einer Antwort (dh einige Funktionen ohne Definitionen) wäre großartig. Ich bin mir nicht mal sicher, ob ich das Bild laden würde (obwohl ich dies gesehen habe: stackoverflow.com/questions/94875/image-processing-in-python )
tdc

Antworten:


62

Hier ist eine Implementierung mit Mahotas

from pylab import imshow
import numpy as np
import mahotas
wally = mahotas.imread('DepartmentStore.jpg')

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))

In rote, grüne und blaue Kanäle aufteilen. Es ist besser, unten Gleitkomma-Arithmetik zu verwenden, also konvertieren wir oben.

w = wfloat.mean(2)

w ist der weiße Kanal.

pattern = np.ones((24,16), float)
for i in xrange(2):
    pattern[i::4] = -1

Bauen Sie ein Muster von + 1, + 1, -1, -1 auf der vertikalen Achse auf. Das ist Wallys Shirt.

v = mahotas.convolve(r-w, pattern)

Falten Sie sich mit Rot minus Weiß. Dies gibt eine starke Reaktion, wo sich das Shirt befindet.

mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))

Suchen Sie nach dem Maximalwert und erweitern Sie ihn, um ihn sichtbar zu machen. Jetzt reduzieren wir das gesamte Bild mit Ausnahme der Region oder des Interesses:

wally -= .8*wally * ~mask[:,:,None]
imshow(wally)

Und wir bekommen Waldo!


3
Ich habe das Strandbild ausprobiert und es hat nicht sehr gut funktioniert :( Wally war in den Top 6 oder 7 Hits, aber es war nicht das beste Matching. Die Verarbeitung hat geholfen, weil ich ihn nicht alleine finden konnte (mit meinem Augen) während, als ich nur ein paar kleine Regionen hatte, war es einfach.
luispedro

Hast du den vollständigen Quellcode dafür? Ich bekomme np ist nicht definiert
codiert

2

Sie können versuchen, Vorlagen anzupassen, und dann diejenige entfernen, die die höchste Ähnlichkeit erzeugt, und dann maschinelles Lernen verwenden, um sie weiter einzugrenzen. Das ist auch sehr schwierig, und mit der Genauigkeit des Vorlagenabgleichs kann es einfach jedes Gesicht oder jedes gesichtsähnliche Bild zurückgeben. Ich denke, Sie brauchen mehr als nur maschinelles Lernen, wenn Sie dies konsequent tun möchten.


2

Vielleicht sollten Sie damit beginnen, das Problem in zwei kleinere zu unterteilen:

  1. Erstellen Sie einen Algorithmus, der Personen vom Hintergrund trennt.
  2. Trainieren Sie einen Klassifikator für neuronale Netze mit so vielen positiven und negativen Beispielen wie möglich.

Das sind immer noch zwei sehr große Probleme ...

Übrigens würde ich c ++ wählen und den Lebenslauf öffnen, es scheint viel besser dafür geeignet zu sein.


1
Wenn Sie C ++ und OpenCV verwenden würden, wäre eine Lösung in Python genauso gut möglich. OpenCV kann unter Python verwendet werden.
Unapiedra

1

Dies ist nicht unmöglich, aber sehr schwierig, da Sie wirklich kein Beispiel für ein erfolgreiches Spiel haben. Es gibt häufig mehrere Zustände (in diesem Fall mehr Beispiele für Zeichnungen von Walleys). Sie können dann mehrere Bilder in ein Bildrekonstruktionsprogramm einspeisen und es als verstecktes Markov-Modell behandeln und so etwas wie den Viterbi-Algorithmus für die Inferenz verwenden ( http: / /en.wikipedia.org/wiki/Viterbi_algorithm ).

So würde ich es angehen, aber wenn Sie mehrere Bilder haben, können Sie ihm Beispiele für die richtige Antwort geben, damit es lernen kann. Wenn Sie nur ein Bild haben, tut es mir leid, dass Sie vielleicht einen anderen Ansatz wählen müssen.


1

Ich habe erkannt, dass es zwei Hauptmerkmale gibt, die fast immer sichtbar sind:

  1. das rot-weiß gestreifte Hemd
  2. dunkelbraunes Haar unter der schicken Mütze

Also würde ich es folgendermaßen machen:

Suche nach gestreiften Hemden:

  • Filterung der roten und weißen Farbe (mit Schwellenwerten für das HSV-konvertierte Bild). Das gibt Ihnen zwei Maskenbilder.
  • addiere sie -> das ist die Hauptmaske für die Suche nach gestreiften Hemden.
  • Erstellen Sie ein neues Bild, bei dem das gesamte herausgefilterte Rot in reines Rot (# FF0000) und das gesamte herausgefilterte Weiß in reines Weiß (#FFFFFF) umgewandelt wird.
  • Korrelieren Sie jetzt dieses reine Rot-Weiß-Bild mit einem Streifenmusterbild (ich denke, alle Waldos haben ganz perfekte horizontale Streifen, daher sollte eine Drehung des Musters nicht erforderlich sein). Führen Sie die Korrelation nur innerhalb der oben genannten Hauptmaske durch.
  • Versuchen Sie, Cluster zu gruppieren, die aus einem Hemd entstanden sein könnten .

Wenn es mehr als ein "Hemd" gibt, um mehr als eine Gruppe positiver Korrelationen zu finden, suchen Sie nach anderen Merkmalen wie dem dunkelbraunen Haar:

Suche nach braunen Haaren

  • Filtern Sie die spezifische braune Haarfarbe mithilfe des HSV-konvertierten Bildes und einiger Schwellenwerte heraus.
  • Suchen Sie in diesem maskierten Bild nach einem bestimmten Bereich - nicht zu groß und nicht zu klein.
  • Suchen Sie nun nach einem 'Haarbereich', der sich direkt über einem (zuvor) erkannten gestreiften Hemd befindet und einen bestimmten Abstand zur Mitte des Hemdes hat.

1

Hier ist eine Lösung mit neuronalen Netzen, die gut funktioniert.

Das neuronale Netzwerk wird an mehreren gelösten Beispielen trainiert, die mit Begrenzungsrahmen markiert sind, die angeben, wo Wally im Bild erscheint. Das Ziel des Netzwerks ist es, den Fehler zwischen der vorhergesagten Box und der tatsächlichen Box aus Trainings- / Validierungsdaten zu minimieren.

Das oben genannte Netzwerk verwendet die Tensorflow-Objekterkennungs-API, um Schulungen und Vorhersagen durchzuführen.

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.