82 votes

Comment trouver Wally avec Python ?

Je prends le train en marche sans vergogne :-)

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 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 qui suit, il est évident que la simple utilisation de bandes ne fonctionnerait pas. Il serait intéressant qu'une approche simple basée sur des règles puisse fonctionner pour des exemples difficiles comme celui-ci.

At the beach

J'ai ajouté la balise [machine-learning] car je pense que la réponse correcte devra utiliser des techniques ML, comme l'approche RBM (Restricted Boltzmann Machine) préconisée par Gregory Klopper dans le fil de discussion original. Il y a quelques Code RBM disponible en python ce qui pourrait être un bon point de départ, mais il est évident que des données d'entraînement sont nécessaires pour cette approche.

Au Atelier international 2009 de l'IEEE sur l'apprentissage automatique pour le traitement des signaux (MLSP 2009) ils ont fait un Concours d'analyse de données : Où est Wally ? . Les données d'entraînement sont fournies au format matlab. Notez que les liens sur ce site web sont morts, mais les données (ainsi que la source d'une approche prise par Sean McLoone et les collègues peuvent être trouvés ici (voir le lien SCM). Cela semble être un bon point de départ.

61voto

luispedro Points 3266

Voici une mise en œuvre 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))

Diviser en canaux rouge, vert et bleu. Il est préférable d'utiliser l'arithmétique à virgule flottante en dessous, donc nous convertissons 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

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

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

Convoluer avec le rouge moins le blanc. Cela donnera une réponse forte à l'endroit où se trouve la chemise.

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

Cherchez la valeur maximale et dilatez-la pour la rendre visible. Maintenant, nous atténuons toute l'image, sauf la région d'intérêt :

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

Et on obtient waldo !

2voto

a sandwhich Points 1231

Vous pourriez essayer de faire correspondre des modèles, puis de noter ceux qui présentent la plus grande ressemblance et d'utiliser l'apprentissage automatique pour les réduire davantage. C'est également très difficile, et avec la précision de la correspondance des modèles, il se peut qu'elle renvoie tous les visages ou toutes les images ressemblant à un visage. Je pense que vous aurez besoin de plus que l'apprentissage automatique si vous espérez faire cela de manière cohérente.

2voto

WeaselFox Points 3283

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

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

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

BTW, j'opterais pour c++ et open CV, cela semble beaucoup plus adapté à ce genre de situation.

1voto

Cyril Points 21

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

  1. la chemise à rayures rouges et blanches
  2. cheveux châtain foncé sous le bonnet fantaisie

Je procéderais donc de la manière suivante :

chercher des chemises à rayures :

  • filtre les couleurs rouge et blanche (avec des seuils sur l'image convertie en HSV). Cela vous donne deux images de masque.
  • ajoutez-les ensemble -> c'est le masque principal pour la recherche de chemises à rayures.
  • créer 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 pure avec une image de motif à rayures (je pense que tous les Waldo ont des rayures horizontales assez parfaites, donc la rotation du motif ne devrait pas être nécessaire). Faites la corrélation uniquement à l'intérieur du masque principal mentionné ci-dessus.
  • essayer de regrouper les clusters qui pourraient être le résultat de un chemise.

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 :

recherche de cheveux bruns

  • filtrer la couleur spécifique des cheveux bruns en utilisant l'image convertie en HSV et certains seuils.
  • recherchez une certaine zone dans cette image masquée - ni trop grande ni trop petite.
  • recherchez maintenant une "zone de cheveux" qui se trouve juste au-dessus d'une chemise à rayures détectée (avant) et qui se trouve à une certaine distance du centre de la chemise.

1voto

Lostsoul Points 5465

Ce n'est pas impossible mais très difficile car vous n'avez pas vraiment d'exemple de correspondance réussie. Il y a souvent plusieurs états (dans ce cas, plus d'exemples de recherche de dessins de galeries), vous pouvez alors introduire plusieurs images dans un programme de reconnaissance d'images et le traiter comme un modèle de 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 l'aborderais, 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 seule image, alors je suis désolé, il y a peut-être une autre approche que vous devez prendre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X