Comment trouver Wally avec Python?

Sauter sans vergogne dans le train en marche 🙂

Inspiré par Comment trouver Waldo avec Mathematica et le suivi Comment trouver Waldo avec R , en tant que nouvel utilisateur de python, j’aimerais voir comment cela pourrait être fait. Il semble que python conviendrait mieux à 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, il est évident que l’utilisation de bandes ne fonctionnerait pas. Il serait intéressant de pouvoir utiliser une approche simple basée sur des règles pour des exemples difficiles comme celui-ci.

À la plage

J’ai ajouté la balise [machine-learning] car je crois que la bonne réponse devra utiliser les techniques ML, telles que l’approche RBM (Ressortingcted Boltzmann Machine) préconisée par Gregory Klopper dans le thread d’origine. Il existe un code RBM disponible dans python qui pourrait être un bon sharepoint départ, mais il est évident que des données de formation sont nécessaires pour cette approche.

Lors de l’ atelier international IEEE 2009 sur l’apprentissage des machines pour le traitement des signaux (MLSP 2009), ils ont organisé un concours d’parsing de données: Où est Wally? . Les données de formation sont fournies au format matlab. Notez que les liens sur ce site sont morts, mais les données (ainsi que la source d’une approche adoptée par Sean McLoone et ses collègues peuvent être trouvées ici (voir le lien SCM). On dirait un seul endroit pour commencer.

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 en virgule flottante ci-dessous, nous convertissons donc en haut.

 w = wfloat.mean(2) 

w est le canal blanc.

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

Construire un motif de + 1, + 1, -1, -1 sur l’axe vertical. C’est la chemise de wally.

 v = mahotas.convolve(rw, pattern) 

Convolve avec le rouge moins le blanc. Cela donnera une réponse forte là où la chemise est.

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

Recherchez la valeur maximale et dilatez-la pour la rendre visible. Maintenant, nous atténuons l’image entière, sauf la région ou l’intérêt:

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

Et nous obtenons Waldo !

Vous pouvez essayer la mise en correspondance des modèles, puis supprimer les résultats les plus proches, puis utiliser l’apprentissage automatique pour le réduire davantage. Cela est également très difficile et, avec la précision de la correspondance des modèles, il peut simplement renvoyer chaque image de visage ou de visage. Je pense que vous aurez besoin de plus que de l’apprentissage automatique si vous espérez faire cela régulièrement.