¿Cómo encuentro a Wally con Python?

83

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.

En la playa

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.

tdc
fuente
7
Lo siento ... ¿hay algún programa que encuentre a Wally en esta foto? No parece haber ninguna característica distintiva del Wally "real". Yo solía tener el mismo libro de Wally, y por lo que recuerdo, había alguna pista en lenguaje natural que tenía que usarse, tal vez que el verdadero Wally no estaba sosteniendo un bastón o algo así. No veo cómo se podría encontrar a Wally mediante programación sin antes poder hacer que su programa comprenda la pista del lenguaje natural.
AdamKG
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
Si bien esta pregunta es interesante, lo que pide no está claro. ¿Es una implementación de una solución? ¿Una pista sobre qué biblioteca ML debe usar Python para esto?
Simon Bergot
@Simon, una implementación completa probablemente sería demasiado pedir, pero un esqueleto de una respuesta (es decir, algunas funciones faltan definiciones) sería genial. Ni siquiera estoy seguro de cargar la imagen en (aunque he visto esto: stackoverflow.com/questions/94875/image-processing-in-python )
tdc

Respuestas:

63

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.

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

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 waldo!

luispedro
fuente
3
Probé la imagen de la playa y no funcionó muy bien :( Wally estaba entre los 6 o 7 primeros éxitos, pero no era la mejor coincidencia. El procesamiento ayudó, porque no pude encontrarlo por mi cuenta (con mi ojos) mientras que cuando solo tenía un montón de regiones pequeñas, era fácil.
luispedro
¿Tienes el código fuente completo para esto? obtengo np no está definido
codifica
2

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.

un sándwich
fuente
2

tal vez debería comenzar dividiendo el problema en dos más pequeños:

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

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.

WeaselFox
fuente
1
Si usara C ++ y OpenCV, entonces una solución en Python es lo más posible. OpenCV se puede utilizar en Python.
Unapiedra
1

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.

Alma perdida
fuente
1

Reconocí que hay dos características principales que casi siempre son visibles:

  1. la camisa a rayas rojo-blanco
  2. cabello castaño oscuro debajo de la gorra elegante

Entonces lo haría de la siguiente manera:

buscar camisas a rayas:

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

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

  • Filtre el color específico del cabello castaño utilizando la imagen convertida de HSV y algunos umbrales.
  • busque un área determinada en esta imagen enmascarada, ni demasiado grande ni demasiado pequeña.
  • ahora busque un 'área de cabello' que esté justo encima de una camisa a rayas detectada (antes) y que tenga una cierta distancia al centro de la camisa.
Cirilo
fuente
1

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.

Tadej Magajna
fuente