2012-01-13 10 views
76

Desvergonzadamente de subirse al carro :-)¿Cómo encuentro a Wally con Python?

Inspirado por How do I find Waldo with Mathematica y el seguimiento How to find Waldo with R, como un nuevo usuario pitón Me encantaría ver cómo esto podría hacerse. Parece que Python sería más adecuado para 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 simplemente usar rayas no funcionaría. Sería interesante si se pudiera hacer un enfoque simple basado en reglas para trabajar con ejemplos difíciles como este.

At the beach

He añadido el [máquina de aprendizaje] etiqueta como creo que la respuesta correcta tendrá que utilizar técnicas de LD, tales como el enfoque restringido Máquina de Boltzmann (GBR) defendida por Gregory Klopper en el original hilo. Hay algunos RBM code available in python que podrían ser un buen lugar para comenzar, pero obviamente se necesitan datos de capacitación para ese enfoque.

En el 2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING (MLSP 2009) corrieron un Data Analysis Competition: Where's Wally?. Los datos de entrenamiento se proporcionan en formato de matlab. Tenga en cuenta que los enlaces en ese sitio web están muertos, pero los datos (junto con el origen de un enfoque adoptado por Sean McLoone y sus colegas se pueden encontrar here (consulte el enlace SCM). Parece un lugar para comenzar.

+5

Lo sentimos ... ¿hay algún programa que encuentre Waldo en esta foto? No parece haber ninguna característica distintiva del Waldo "real". Solía ​​tener ese mismo libro de Waldo, y por lo que recuerdo había una pista de lenguaje natural que debía usarse, tal vez el verdadero Waldo no estaba sosteniendo un bastón o algo así. No veo cómo podrías encontrar Waldo programáticamente sin antes poder hacer que tu programa comprenda la pista del lenguaje natural. – AdamKG

+0

Sí, tienes razón, lo siento ... ¡aunque también sería una tarea interesante! Cambié la imagen a la antigua "En la playa", que también tiene rayas ... (¡hay otra razón para elegir esta imagen también!) – tdc

+0

Si bien esta pregunta es interesante, lo que está preguntando no está claro. ¿Es una implementación de una solución? ¿Una pista sobre qué biblioteca ML para Python usar para esto? – Simon

Respuesta

54

Aquí es 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 utilizar la aritmética de coma 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 

Cree un patrón de + 1, + 1, -1, -1 en el eje vertical. Esta es la camisa de Wally.

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

Convolve with red minus white. Esto dará una fuerte respuesta donde está la camisa.

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

Busque el valor máximo y dilatarlo para que sea visible. Ahora, que bajar el tono de toda la imagen, a excepción de la región o de interés:

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

Y obtenemos waldo!

+2

Impresionante :-) ¿Lo has probado en otras imágenes? – tdc

+2

Probé la imagen de la playa y no funcionó muy bien :(Wally estaba entre los primeros 6 o 7 éxitos, pero no fue la mejor coincidencia. El procesamiento sí ayudó, porque no pude encontrarlo por mi cuenta (con mis ojos) mientras que cuando solo tenía un montón de pequeñas regiones, era fácil. – luispedro

+0

¿Tiene el código fuente completo para esto? Estoy obteniendo np no está definido – encodes

2

Puede intentarlo la coincidencia de plantillas, y luego el desmontaje que produjo el mayor parecido, y luego el uso de 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 todas las caras o imágenes faciales. Estoy pensando que va a necesitar algo más que solo aprendizaje automático si espera hacerlo de manera consistente.

1

tal vez debería comenzar con dividir el problema en dos pequeños:

  1. crea un algoritmo que separa a las personas del fondo.
  2. entrenan un clasificador de redes neuronales con tantos ejemplos positivos y negativos como sea posible.

los dos siguen siendo muy grandes problemas para hacer frente a ...

Por cierto, yo elegiría C++ y abierta CV, parece mucho más adecuado para esto.

+1

Si usaría C++ y OpenCV, entonces una solución en Python es lo más posible. OpenCV se puede usar en Python. – Unapiedra

1

Esto no es imposible, pero es muy difícil porque realmente no hay ningún ejemplo de una coincidencia exitosa. A menudo hay varios estados (en este caso, más ejemplos de dibujos de walleys), puede alimentar varias imágenes en un programa de reconización de imágenes y tratarlas 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 tiene varias imágenes que puede darle ejemplos de la respuesta correcta para que pueda aprender. Si solo tiene una imagen, lamento que tal vez sea necesario otro enfoque.

1

que reconoció que hay dos características principales que son casi siempre visible:

  1. la camisa roja y blanca a rayas
  2. cabello castaño oscuro bajo el casquillo de lujo

Así que lo haría de la siguiente manera:

búsqueda de camisas de rayas:

  • filtro de color rojo y blanco (con umbrales en la imagen convertida HSV). Eso te da dos imágenes de máscara.
  • agrégalos juntos -> esa es la máscara principal para buscar camisas a rayas.
  • crea una nueva imagen con todo el rojo filtrado convertido a rojo puro (# FF0000) y todo el blanco filtrado convertido a blanco puro (#FFFFFF).
  • correlacionamos ahora esta imagen en rojo-blanco puro con una imagen de patrón de franjas (creo que todos los waldo tienen franjas horizontales bastante perfectas, por lo que la rotación del patrón no debería ser necesaria). Haga la correlación solo dentro de la máscara principal mencionada anteriormente.
  • intente agrupar agrupaciones que podrían haber sido el resultado de una camisa.

Si hay más de una 'mercancía, que decir, más de un grupos de correlación positiva, la búsqueda de otras características, como el pelo marrón oscuro:

búsqueda de pelo castaño

  • filtrar el color de cabello marrón específico utilizando la imagen convertida HSV y algunos umbrales.
  • busca un área determinada en esta imagen enmascarada, no demasiado grande ni demasiado pequeña.
  • ahora busque una "zona del cabello" que esté justo encima de una camisa a rayas detectada (antes) y que tenga cierta distancia al centro de la camisa.
0

Here's a solution usando redes neuronales que funcionan bien.

La red neuronal está capacitada 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 utiliza la API de detección de objetos Tensorflow para realizar entrenamientos y predicciones.

Cuestiones relacionadas