Comment trouver Wally avec Python?

sautant sans vergogne dans le train en marche: -)

inspiré par Comment trouver Waldo avec Mathematica et la suite Comment trouver Waldo avec R , en tant que nouvel utilisateur de python, j'aimerais voir comment cela pourrait être fait. Il semble que python serait mieux adapté à cela que R, et nous n'avons pas à nous soucier des licences comme nous le ferions avec Mathematica ou Matlab.

Dans un exemple comme celui ci-dessous évidemment, le simple fait d'utiliser des rayures ne marcherait pas. Il serait intéressant qu'une approche simple fondée sur des règles puisse être utilisée pour des exemples difficiles comme celui-ci.

At the beach

j'ai ajouté la balise [machine-learning] car je pense que la bonne réponse devra utiliser des techniques ML, telles que L'approche restreinte Boltzmann Machine (RBM) prônée par Gregory Klopper dans le thread original. Il y a un certain code RBM disponible en python qui pourrait être un bon endroit pour commencer, mais évidemment des données de formation sont nécessaires pour cette approche.

At the 2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING (MLSP 2009) they ran a Data Analysis Competition: Wally? . Les données sur la formation sont fournies dans le format matlab. Notez que les liens sur ce site web sont morts, mais les données (avec la source d'une approche pris par Sean McLoone et ses collègues se trouvent ici (voir lien SCM). Semble comme un endroit pour commencer.

77
demandé sur Community 2012-01-13 15:28:14

6 réponses

Voici une implémentation avec 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))

divisé en canaux rouge, vert et bleu. Il est préférable d'utiliser l'arithmétique flottante ci-dessous, donc nous convertissons au sommet.

w = wfloat.mean(2)

w est la Manche blanche.

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

Construire un modèle de +1,+1,-1,-1 sur l'axe vertical. C'est la chemise de wally.

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

de Convolution avec signe moins rouge blanc. Cela donnera une réponse forte où la chemise est.

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

rechercher la valeur maximale et la dilater pour la rendre visible. Maintenant, nous atténuons toute l'image, sauf la région ou l'intérêt:

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

et on a waldo !

54
répondu luispedro 2013-05-10 11:43:59

vous pourriez essayer l'appariement de modèle, et puis enlever qui a produit la ressemblance la plus élevée, et ensuite l'utilisation de la formation de machine pour rétrécir plus. C'est aussi très difficile, et avec l'exactitude de l'appariement de template, il peut simplement retourner chaque visage ou image semblable à un visage. Je pense que vous aurez besoin de plus que l'apprentissage automatique si vous espérez faire ceci de manière cohérente.

2
répondu a sandwhich 2012-01-13 13:45:43

peut-être devriez-vous commencer par briser le problème en deux plus petits:

  1. créer un algorithme qui sépare les gens de l'arrière-plan.
  2. former un réseau neuronal classificateur avec autant d'exemples positifs et négatifs que possible.

ce sont encore deux très gros problèmes à résoudre...

BTW, je choisirais c++ et open CV, il semble beaucoup plus adapté pour cela.

1
répondu WeaselFox 2012-01-16 09:12:32

ce n'est pas impossible mais très difficile car vous n'avez vraiment aucun exemple de match réussi. Il y a souvent plusieurs états (dans ce cas, plus d'exemples de dessins de find walleys), vous pouvez alors alimenter plusieurs images dans un programme de reconisation d'image et le traiter comme un modèle markov caché et utiliser quelque chose comme l'algorithme de viterbi pour l'inférence ( http://en.wikipedia.org/wiki/Viterbi_algorithm ).

c'est la façon dont je voudrais approchez-vous, mais en supposant que vous avez plusieurs images que vous pouvez lui donner des exemples de la bonne réponse afin qu'il puisse apprendre. Si vous n'avez qu'une photo, alors je suis désolé qu'il y ait une autre approche que vous devez prendre.

1
répondu Lostsoul 2012-01-17 21:25:11

j'ai reconnu qu'il y a deux caractéristiques principales qui sont presque toujours visibles:

  1. le rouge-blanc chemise rayée
  2. les cheveux brun foncé, en vertu de la fantaisie de la pac

alors je le ferais de la façon suivante:

recherche de chemises rayées:

  • filtrez la couleur rouge et blanche (avec des seuils sur l'image convertie HSV). Ça donne deux images de masque.
  • ajouter -> c'est le masque principal pour la recherche de chemises à rayures.
  • crée une nouvelle image avec tout le rouge filtré converti en rouge pur (#FF0000) et tout le blanc filtré converti en blanc pur (#ffffff).
  • corrélez maintenant cette image rouge-blanc pur avec une image de motif rayé (je pense que tous les waldo ont des rayures horizontales tout à fait parfaites, donc la rotation du motif ne devrait pas être nécessaire). De faire la corrélation seulement à l'intérieur de l'mentionnés ci-dessus masque principal.
  • essayer de grouper les grappes qui auraient pu être le résultat de une" chemise 1519250920".

S'il y a plus d'une 'chemise', c'est-à-dire plus d'un groupe de corrélation positive, cherchez d'autres caractéristiques, comme les cheveux Bruns foncés:

recherche de cheveux bruns

  • filtrer la couleur brune spécifique des cheveux en utilisant l'image convertie HSV et certains seuils.
  • recherche d'une certaine zone dans cette image masquée - pas trop grande et pas trop petite.
  • maintenant rechercher un poil de zone " qui est juste au-dessus (avant) détecté chemise rayée et a une certaine distance au centre de la chemise.
1
répondu Cyril 2012-11-07 13:05:25

Voici une solution à l'aide de réseaux de neurones qui fonctionne très bien.

le réseau neuronal est formé sur plusieurs exemples résolus qui sont marqués avec des boîtes de délimitation indiquant où Wally apparaît dans l'image. Le but du réseau est de minimiser l'erreur entre la case prévue et la case réelle à partir des données de formation/validation.

le réseau ci-dessus utilise L'API de détection D'objets Tensorflow prédiction.

1
répondu Tadej Magajna 2017-12-12 17:17:56