Tag Archives: perception

Visión por computador: Tracking!

Head_Tracking_594_Kb

English Version

Resulta que  existen infinitas formas inteligentes de realizar el tracking the un objeto en una imagen: usando descriptores de características, flujo óptico, colores, filtro de Kalman etc. Puesto que no soy un genio, y aprovechando un tracking simplificado que he hecho hace poco para un proyecto de clase (código disponible AQUÍ), me gustaría comentaros algunas de las dificultades generales que hay que resolver.

Hoy empezarmeos la casa por el tejado: Resultados!. Gifs, gifs y más gifs. He aquí un pequeño gif del código funcionando.

prueba_904KB—————————-Cómo implementar esto?—————————-

Una aplicación completa de tracking no tiene que resolver únicamente el proceso de seguimiento en sí mismo, sino que tiene que lidiar con varios problemas que lo acompañan.

  • Cómo comenzar el seguimiento? Qué estoy buscando?
  • Seguimiento: conozco dónde estaba el objetivo en el instante anterior, dónde debería buscar ahora? puedo simplificar el proceso?
  • Y si pierdo el objeto en medio del seguimiento, qué hago?

Puede parecer fácil… sólo tres aspectos a resolver?… mejor no subestimemos a Murphy no vaya ser que se complique la cosa. El siguiente diagrama da una visión general del procedimiento que yo decidí plantear.

FlowChart_EN

Lo primero que tenemos que tener en mente es que conocemos exactamente el objeo que estamos persiguiendo!. Lo creas o no, no siempre pasa. Esto quiere decir que siempre que el objeto esté a la vista, podremos localizar su posición. Esto no suele ser cierto en condiciones no controladas por muchas razones. La más inmediata es el hecho de que es imposible caracterizar un objeto teniendo en cuenta todas las posibles iluminaciones a las que puede estar sometida. Entre otras cosas porque un ordenador no puede saber si un objeto a cambiado su color a causa de una iluminación desafortunada, o simplemente es un objeto diferente. Vale… y si consideramos que la iluminación es conocida? (Simplificaciones!!). El algoritmo que aquí se comenta es bastante simple así que necesitamos bastantes simplificaciones (sinceramente, algunas de ellas un tanto “groseras”), y considerar que las iluminación está controlada es la primera.

—————————-Objetivo—————————-

Dicho esto, hablemos sobre el objetivo. Vamos a considerar el objetivo más sencillo de rastrear que existe: “una forma negra sobre fondo blanco” o lo que es lo mismo, un trocito de cinta aislante en medio de un A3.

Target

—————————-Tracking—————————-

En esto de explicar algoritmos no suele aplicar eso de “lo primero es lo primero”, suele ser más útil entender el funcionamiento normal del algoritmo y luego ver excepciones, y transitorios de inicio y finalización; que es justo lo que haremos.

Asumamos primero que conocíamos la posición del objeto en el instante anterior. Esto nos da algo con lo que trabajar. Esta información nos permite colocar una “ventana de búsqueda” centrada en \hat{x}_t = x_t + v_t y de tamaño W_{t} = f(v_{t-1}) para no tener que buscar el objeto en toda la imagen. En otras palabras: el objeto se busca en torno al punto en el que suponemos que va a estar el objeto atendiendo a los datos pasados, y el tamaño de esa región de búsqueda dependerá de alguna forma de la incertidumbre de esa estimación. La siguiente imagen intenta mostrar por qué el tamaño de la ventana es una función de la velocidad.

Window_24Kb

Ok,ya tenemos la ventana de búsqueda bien situada, ahora qué? cómo refinamos la posición? esto suele ser complicado y normalmente requiere trabajo previo de caracterización del objeto a rastrear, por ejemplo, usando descriptores binarios invariantes… pero hoy no! Estamos buscando algo oscuro en un fondo blanco y esto facilita mucho el proceso. Nuestra solución particular consiste en: recortar la imagen para quedarnos sólo con la ventana de búsqueda, umbralizarla, invertirla, y calcular el centro de masa… eso es todo. Después de haber solucionado las cosas difíciles, esto es muy simple :).

Target_Location_17kB

—————————-Proceso de reenganche—————————-

Qué hacemos si no sabemos dónde está el objeto en el instante anterior? pues tenemos algunas alternativas, entre ellas:

  • Buscar actívamente el objeto. Esto consume tiempo y capacidad de cálculo puesto que habría que analizar la imagen completa sin saber si quiera si el objeto está a la vista.
  • Respuesta pasiva. Lo hemos perdido… pues nada, esperaremos justo en el sitio donde lo hemos perdido hasta que pase por aquí y nos reenganchamos.

La segunda alternativa es más simple por lo que, adivinas qué vamos a hacer? exactamente, ninguna de las anterior… nah, I’m kidding, la segunda xD. Para nosotros es suficiente esa opción puesto que no vamos a usar la aplicación para nada serio, en tal caso, seguramente la primera opción sería más adecuada.

Y se acabó! Esto ha sido todo por hoy. Os animo a que probéis el código, o mejor, a que implementéis vuestros propios algoritmos de seguimiento y los compartáis por aquí en los comentarios.

Hasta la próxima!

Tagged , , , , , , , ,

Percepción y Visión por Computador #0

ComputerVisionPerception
English Version
Resulta que utilizamos aplicaciones que usan herramientas y técnicas de “vision por computador” practicamente todos los días y no nos percatamos de ello. Le “precepción” como concepto general y la “visión por computador” como concepto concreto son altamente usados en la actualidad y me gustaría comenzar una serie de posts analizando aplicaciones de este campo. Apoyadas en estos conceptos podemos encontrar desde aplicaciones tan cotidianas como el lector de matrículas a la entrada de un aparcamiento hasta otras más sofisticadas como la detección asistida por visión por computador de células cancerosas.

La idea principal en este tipo de posts será presentar y analizar problemas que son resueltos actualmente aplicando visión por computador y, si la solución está disponible presentarla (y sino intentaremos discutir posibles soluciones). Sinceramente estoy ansioso por empezar a describir “casos de estudio” pero creo que sería conveniente presentar en primer lugar los conceptos fundamentales, por si hay alguien al otro lado que no esté familiarizado con la materia.

Qué es una imagen?

Una imagen es básicamente un montón de números! Números?? SÍ!. La imagen que vemos en la pantalla del pc se compone de cientos, miles o millones de diminutos cuadros (pixeles) con un número (o conjunto de números) asociado, donde cada número tiene asignada una intensidad. La forma más simple entender lo expuesto es usando una imagen en blanco y negro. En este caso, un valor de 255 (máximo valor permitido) corresponde a un pixel blanco puro, mientras que el valor de 0 corresponde a un pixel negro.

Mario

El caso de imágenes en color es un pelín más complicado (pero no mucho más, tranquilo). Antes de nada, es necesarios especificar el modelo que utilizaremos para describir los colores. Hay varios modelos de color: RGB, CMYK, HSV o HSL entre otros. Personalmente estoy más familiarizado con el modeo RGB por lo que seguramente será el sistema que utilizaré de aquí en adelanta. RGB en particular aplica la misma estrategia que la explicada anteriormente con la imagen en blanco y negro con la única salcedad de que, en este caso hay tres capas en lugar de una única, y cada una corresponde con la intensidad de un color elemental: Rojo (Red), Verde (Green) y Azul (Blue). Diferentes combinaciones de intensidades de colores elementales resultan en colores diferentes (hay bastantes recursos online para poder ver colores y sus códigos, por ejemplo ColorPicker ).

Color

 

Motivación

Algo que realmente me gusta de la robótica es el hecho de que la información que extraemos de sensores varios no signfica nada hasta que los interpretamos y les damos un sentido. Exactamente lo mismo ocurre con las imágenes (información recogida de un sensor a fin de cuentas) con la salvedad de que en este caso hablamos de información visual, la cual somos capaces de procesar con absoluta facilidad. Esto puede hacer pensar que el problema de visión por computador no es tal, pero nada más lejos de la realidad, incluso problemas aparentemente directos pueden tornarse imposibles para un computador si las condiciones de luz no acompañan.

No hay nadie en Facebook dibujando cuadritos alrededor de las caras en las fotos, ni leyendo tu matrícula cuando entras en un aparcamiento, y por supuesto no hay nadie dentro de tu movil esperando a que actives el autodisparador por detección de sonrisas de la aplicación de la camara para tomar la foto en el instante preciso. Espero que a medida que avancen los posts, este tipo de cosas dejen de suceder “por arte de magia” y puedas llegar a valorar lo “asombroso” de que Facebook consiga “enjaular” las caras.

Proximamente, el caso de estudio más típico. Reconocimiento de matrículas.

Cuidate!.

PD: Estoy deseando acabar con las presentaciones y poder entrar en materia, pero cada cosa a su tiempo.

Tagged , ,