Subirse al carro descaradamente :-)
Inspirado por Cómo encuentro a Waldo con Mathematica y el seguimiento Cómo encontrar a Waldo con R , como nuevo usuario de Python, me encantaría ver cómo se puede hacer esto. Parece que Python se adaptaría mejor a esto que R, y no tenemos que preocuparnos por las licencias como lo haríamos con Mathematica o Matlab.
En un ejemplo como el siguiente, obviamente, el simple uso de rayas no funcionaría. Sería interesante si se pudiera hacer que un enfoque simple basado en reglas funcionara para ejemplos difíciles como este.
Agregué la etiqueta [aprendizaje automático] porque creo que la respuesta correcta tendrá que usar técnicas de aprendizaje automático, como el enfoque de máquina de Boltzmann restringida (RBM) defendido por Gregory Klopper en el hilo original. Hay algo de código RBM disponible en Python que podría ser un buen lugar para comenzar, pero obviamente se necesitan datos de entrenamiento para ese enfoque.
En el Taller Internacional de IEEE de 2009 sobre APRENDIZAJE MÁQUINAS PARA EL PROCESAMIENTO DE SEÑALES (MLSP 2009) , realizaron un Concurso de análisis de datos: ¿Dónde está Wally? . Los datos de entrenamiento se proporcionan en formato matlab. Tenga en cuenta que los enlaces en ese sitio web están inactivos, pero los datos (junto con la fuente de un enfoque adoptado por Sean McLoone y sus colegas se pueden encontrar aquí (consulte el enlace SCM). Parece un lugar para comenzar.
Respuestas:
Aquí hay una implementación con 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))
Dividir en canales rojo, verde y azul. Es mejor usar aritmética de punto flotante a continuación, por lo que convertimos en la parte superior.
w = wfloat.mean(2)
w
es el canal blanco.pattern = np.ones((24,16), float) for i in xrange(2): pattern[i::4] = -1
Construya un patrón de + 1, + 1, -1, -1 en el eje vertical. Esta es la camisa de Wally.
Convolucionar con rojo menos blanco. Esto dará una fuerte respuesta donde está la camiseta.
mask = (v == v.max()) mask = mahotas.dilate(mask, np.ones((48,24)))
Busca el valor máximo y dilata para que sea visible. Ahora, atenuamos toda la imagen, excepto la región o el interés:
wally -= .8*wally * ~mask[:,:,None] imshow(wally)
¡Y lo conseguimos !
fuente
Puede probar la coincidencia de plantillas y luego eliminar cuál produjo el mayor parecido y luego usar el aprendizaje automático para reducirlo más. Eso también es muy difícil y, con la precisión de la coincidencia de plantillas, puede devolver cada rostro o imagen similar a un rostro. Creo que necesitará más que solo aprendizaje automático si espera hacer esto de manera consistente.
fuente
tal vez debería comenzar dividiendo el problema en dos más pequeños:
esos son todavía dos problemas muy grandes que abordar ...
Por cierto, elegiría c ++ y abrir CV, parece mucho más adecuado para esto.
fuente
Esto no es imposible, pero sí muy difícil porque realmente no tienes ningún ejemplo de un partido exitoso. A menudo hay varios estados (en este caso, más ejemplos de dibujos de Find Walleys), luego puede alimentar varias imágenes en un programa de reconización de imágenes y tratarlo como un modelo de Markov oculto y usar algo como el algoritmo de viterbi para la inferencia ( http: / /en.wikipedia.org/wiki/Viterbi_algorithm ).
Esa es la forma en que lo abordaría, pero suponiendo que tenga varias imágenes, puede darle ejemplos de la respuesta correcta para que pueda aprender. Si solo tiene una foto, lamento que haya otro enfoque que deba tomar.
fuente
Reconocí que hay dos características principales que casi siempre son visibles:
Entonces lo haría de la siguiente manera:
buscar camisas a rayas:
Si hay más de una 'camisa', es decir, más de un grupo de correlación positiva, busque otras características, como el cabello castaño oscuro:
buscar cabello castaño
fuente
Aquí hay una solución usa redes neuronales que funciona muy bien.
La red neuronal se entrena en varios ejemplos resueltos que están marcados con cuadros delimitadores que indican dónde aparece Wally en la imagen. El objetivo de la red es minimizar el error entre el cuadro predicho y el cuadro real de los datos de entrenamiento / validación.
La red anterior usa la API de detección de objetos de Tensorflow para realizar entrenamientos y predicciones.
fuente