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 python utilisateur J'adore 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, le simple fait d'utiliser des rayures ne fonctionnerait évidemment pas. Il serait intéressant qu'une approche simple basée sur des règles puisse être mise en œuvre pour des exemples difficiles comme celui-ci.
J'ai ajouté la balise [machine-learning] car je pense que la bonne réponse devra utiliser des techniques de ML, telles que l'approche RBM (Restricted Boltzmann Machine) préconisée par Gregory Klopper dans le fil d'origine. Il y a le code RBM est disponible en python qui pourrait être un bon point de départ, mais des données de formation sont évidemment nécessaires pour cette approche.
Lors du Atelier international IEEE 2009 sur L'APPRENTISSAGE DES MACHINES POUR LE TRAITEMENT DES SIGNAUX (MLSP 2009) ils ont organisé un Concours d'analyse 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 lien SCM) Semble être un point de départ.
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))
Divisez en canaux rouge, vert et bleu. Il est préférable d'utiliser l'arithmétique à 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
Construisez un motif de + 1, + 1, -1, -1 sur l'axe vertical. Ceci est la chemise de Wally.
v = mahotas.convolve(r-w, pattern)
Convolve avec du rouge moins blanc. Cela donnera une réponse forte où se trouve la chemise.
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 !
Vous pouvez essayer la correspondance de modèles, puis supprimer ce qui produit la ressemblance la plus élevée, puis utiliser l'apprentissage automatique pour affiner davantage. C'est également très difficile, et avec la précision de la correspondance des modèles, cela peut simplement renvoyer chaque visage ou image semblable à un visage. Je pense que vous aurez besoin de plus que du simple apprentissage automatique si vous espérez le faire de manière cohérente.
vous devriez peut-être commencer par diviser le problème en deux plus petits:
ce sont encore deux très gros problèmes à résoudre ...
BTW, je choisirais c ++ et ouvrir CV, cela semble beaucoup plus adapté à cela.
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 recherche de walleys), vous pouvez ensuite alimenter plusieurs images dans un programme de reconstitution d'image et le traiter comme un modèle markov caché et utiliser quelque chose comme l'algorithme 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, vous pouvez lui donner des exemples de la bonne réponse pour qu'il puisse apprendre. Si vous n'avez qu'une seule photo, je suis désolé, il y a peut-être une autre approche que vous devez adopter.
Voici une solution en utilisant des réseaux de neurones qui fonctionnent bien.
Le réseau de neurones est formé sur plusieurs exemples résolus qui sont marqués par des cadres de délimitation indiquant où Wally apparaît dans l'image. Le but du réseau est de minimiser l'erreur entre la boîte prédite et la boîte réelle à partir des données de formation/validation.
Le réseau ci-dessus utilise l'API de détection d'objets Tensorflow pour effectuer des formations et des prévisions.
J'ai reconnu qu'il y a deux caractéristiques principales qui sont presque toujours visibles:
Je le ferais donc de la manière suivante:
recherche de chemises rayées:
S'il y a plus d'une "chemise", c'est-à-dire plus d'une grappe de corrélation positive, recherchez d'autres caractéristiques, comme les cheveux brun foncé:
recherche de cheveux bruns