El cálculo de la vista cenital de una escena es una tarea realmente útil para muchas aplicaciones de visión artificial: cálculo de velocidades, distancias, trayectorias reales, etc. Ya en uno de los artículos anteriores presentaba una forma de corrección de perspectiva como método de ayuda al proceso de tracking mediante una proyección inversa, habiéndome quedado en su momento con ganas de hacerlo mediante el uso de homografías (cosa que realmente es la forma ideal de hacerlo).
El cálculo de homografías también es un proceso utilizado en muchas otras aplicaciones más complejas como pueden ser los procesos de reconstrucción 3D, generación de panorámicas, tracking multi-camara, etc. Y que también pueden ser utilizadas para la mejora de otras muchas aplicaciones con resultados realmente sorprendentes: escaneo de documentos, estabilización de vídeo, lectura y detección de matriculas, etc.
El caso es que a causa de varios intereses que no vienen al caso, aproveche el proyecto de mi asignatura de máster “Tratamiento Digital de Imágenes” para realizar este mini-proyecto. Los resultado fueron bastante satisfactorios y útiles, tal y como puede verse en las siguientes imágenes:
Una de las tareas mas básicas y comunes en la mayoría de las aplicaciones de visión artificial a la hora de segmentar los objetos de interés, es como ya expuse en anteriores artículos, una segmentación por movimiento. Dicha tarea se ha abordado en la historia prácticamente desde la mayoría de los puntos de vista conocidos en los ámbitos del tratamiento de señales y de la estadística. Aunque desgraciadamente, prácticamente todos estos enfoques presentan los mismos problemas: camuflaje, brillos, sombras, etc. No obstante a pesar de toda esta investigación en el campo, los resultados no son muy satisfactorios y se ha de recurrir a lógica de mas alto nivel para intentar solventar todas estas carencias. La razón de esto probablemente sea el empeño por utilizar una herramienta de filtrado de la información de interés directamente como herramienta para realizar tareas mas complejas.
Independientemente de todo esto, aun existen ciertos campos que no han sido utilizados para realizar dicha tarea (probablemente por lo descabellado de dichas soluciones). Una de ellas podría ser el análisis multi-escala basado exclusivamente en la información del gradiente, lo cual gracias a la propia naturaleza del gradiente nos dotaría de invariancia tanto a los cambios de iluminación, como de sombras, e incluso parcialmente del camuflaje (este ultimo mas que solventarse, se traslada). Este tipo de análisis ha sido utilizado bastante satisfactoriamente en otras tareas de reconocimiento de objetos gracias a su invariancia frente muchos de los factores visuales.
Aprovechando la necesidad de realizar mi trabajo de fin de máster realice algunas pruebas al respecto con resultados variables. Un primer prototipo mostró que efectivamente dicho análisis por naturaleza era bastante robusto a brillos y sombras, siendo sobre todo estas ultimas anuladas por completo independientemente de su naturaliza (sombra dura o blanda). Un ejemplo claro de ello puede verse en los siguientes vídeos:
Como se puede observar en los vídeos, además de la anulación total de las sombras, una vez bien definida la multi-escala, la segmentación de los blobs es bien clara, limpia y diferenciada, teniéndose un único máximo por objeto. En cuanto al camuflaje, algunos experimentos realizados muestran una mitigación sustancial en algunos escenarios, sobre todo en los de naturaleza de bajo contraste (véase vídeos nocturnos principalmente).
En algunos casos puede ser necesaria la conservación de la forma detallada de los objetos en vez de los blobs, para ello es posible combinar este análisis con uno más clásico infra-parametrizado, obteniendo así un resultado parecido al del siguiente vídeo:
No obstante y a pesar de las ventajas expuestas, la naturaleza de su análisis hace que las zonas con una acumulación de gradiente desmesurado sean un problema para este tipo de análisis, no siendo apto por lo tanto para dichos escenarios, requiriendo así ser combinado con otros métodos como en el caso anterior.
Probablemente la segmentación de movimiento no sea la mejor opción a la hora de segmentar (si a la hora de extraer las zonas de interés en algunos casos), presentando una mejor opción en la mayoría de los casos alguna de las opciones existentes no basadas en movimiento, como podría ser una segmentación por regiones homogéneas. El caso es que una pequeña modificación de la lógica de este tipo de análisis, podría proporcionarnos al mismo tiempo tanto las zonas de interés como las regiones homogéneas de las mismas (otra posible vía de investigación podría ser la de resolver los problemas presentes en las zonas de muy alto gradiente no uniforme a lo largo de la imagen).
El cálculo de la profundidad de la imagen gracias a un par estereoscópico ha sido siempre un objetivo de interés en múltiples campos de investigación (principalmente en los referentes al ocio y a la robótica). Este campo es posiblemente uno de los mas antiguos, cuya investigación ha sito tremenda a lo largo de los años, lo que hace sorprendente su todavía actual atraso tecnológico, ya que aunque existen innumerables soluciones y formas de abordar el problema, ninguna de ellas es capaz de proporcionar una solución completa en todos los casos (y mucho menos en tiempo real).
Personalmente, la estereoscopia siempre me pareció un elemento a tener muy en cuenta y que podría suponer la diferencia en la mayoría de aplicaciones de visión artificial, ya que su ayuda al proceso de segmentación (comentado en otro articulo anterior de este mismo blog), podría permitir una mejora tremenda en los resultados de dicho proceso, permitiendo así una mucho mejor segmentación de los objetos de la imagen. Dicha segmentación es probablemente el proceso más básico de cualquier sistema de visión, y que a día de hoy es todavía una asignatura pendiente en la mayoría de los casos. Un ejemplo de todo esto pudo verse hace poco con el lanzamiento de la nueva herramienta de interface de microsoft para su consola de videojuegos (el Kinect).
Por todo ello y por otros motivos personales, decidí dirigir mi proyecto de la asignatura de tratamiento digital de vídeo por esta vía. Podéis acceder a mi presentación en el siguiente enlace: http://namnorireports.blogsite.org/contents/Estereoscopia.pdf
Aunque la presentación hay que entenderla como es, puede suponer una primera visión global sobre el tema para cualquiera con un poco de interés en él.
Aquí podéis ver también algunas de las imágenes de muestra que genere con alguna de las implementaciones básicas que realice:
La etapa de tracking es al igual que la etapa de segmentación, una de las tareas obligatorias para casi cualquier aplicación basada en vídeo. El objetivo de la misma es la puesta en correspondencia de los objetos de interés a lo largo de los sucesivos frames que componen el vídeo. Para dicha puesta en correspondencia se explotan las distintas características disponibles de los propios objetos: información espacial, trayectorias, puntos característicos, histogramas, apariencia, bordes, gradientes, etc. De todas ellas, la característica espacial es la más comúnmente utilizada (por su inmediata obtención), soliendo combinarse con alguna de las otras mencionadas anteriormente. Por ello, una de las formas más efectivas de mejorar el proceso de tracking es mediante el aumento de la fiabilidad y robustez de esta (o estas) características.
Una de las formas mas sencillas de mejorar la eficacia de cualquier método de tracking (como la de un simple filtro de partículas), es la rectificación de la perspectiva de la escena con el fin de normalizar las distancias de los distintos ejes del plano sobre el que se mueven los objetos. Una de las formas más sencillas de hacer esto es deshaciendo la proyección realizada sobre el sensor de la cámara a la hora de capturar las imágenes, con este fin proyectaríamos por ejemplo la base del objeto sobre el plano del suelo (el XZ). En este caso como lo único que se necesita es que las distancias en ambos ejes (sobre los que se desea hacer el tracking) estén normalizas, no es necesario que las mimas sean exactas en cuanto a valor puntual, basta con que sean precisas porcentualmente. Por ello con tan solo la altura de la cámara y la distancia a un punto de la imagen podemos calcular la inclinación y posición de la cámara sobre el plano, realizando así dicha rectificación de la perspectiva mediante una simple proyección. En el vídeo siguiente se puede ver un ejemplo de dicha simple rectificación, donde se puede observar como las trayectorias que en la escena fugan a un punto del infinito, se convierten en rectas en la vista cenital del plano XZ (generado a la izquierda de la imagen):
No obstante y como es obvio al no conocer los parámetros intrínsecos de la cámara, las distancias no son exactas en cuanto a valor absoluto, además de no poder superarse las oclusiones sin añadir una lógica extra.
Por otro lado, cabe destacar que conociendo los parámetros intrínsecos de la cámara (cuyo cálculo y autocalibración es una odisea), la rectificación seria inmediata mediante el uso de una tomografía, lo cual si que nos daría una medición exacta de las distancias.
La segmentación automática de una imagen es un problema fundamental en visión artificial, que sirve de base para multitud de aplicaciones como el reconocimiento de objetos, la indexación y codificación de imágenes, el análisis automático de imágenes médicas o geográficas, etc. Este proceso se define tradicionalmente como la partición de la imagen en un conjunto de regiones no solapadas y homogéneas con respecto a alguna característica como color o la textura. El planteamiento habitual consiste en extraer inicialmente un vector de características asociado a cada píxel, dicho vector contiene información acerca de su color, textura, posición, etc., para posteriormente agrupar o clasificar los píxeles en regiones. Esta segunda tarea puede verse como un problema de clasificación (generalmente no supervisada) en el espacio de características seleccionado, que se puede abordar utilizando herramientas y técnicas propias del aprendizaje automático (clustering, redes neuronales, SVMs, etc.).
Con motivo de profundizar más en esta linea, oriente una de mis asignaturas de estudio independiente tutelado del máster en esta dirección. A lo largo de la cual redacte la siguiente memoria como contenido: http://namnorireports.blogsite.org/contents/segmentacion.pdf
Como se puede percibir en las valoraciones finales del documento, mi sensación final fue un poco agridulce, ya que a pesar de ser una linea tremendamente interesante y de gran utilidad, parece encontrarse en una fase muy temprana de desarrollo tras más de 30 años de investigación, no habiéndose definido una linea clara de investigación sobre la que seguir y avanzar en el campo. Es decir, que se posee un abanico bastante amplio de opciones distintas, pero que al final hacen todas ellas lo mismo, y con resultados similares (los cuales son insuficientes en todos los casos).
Todo esto hace replantearse que a lo mejor estamos haciendo las cosas mal desde el principio, a lo mejor es tan sólo que nos empeñamos en continuar las investigaciones de otros por todos los medios ignorando un callejón sin salida. Es posible que lo que se necesite son otros enfoques y formas de abordar el problema, pero no desde el nivel superior, sino desde los pobres cimientos sobre los que hemos construido todo el castillo de naipes.
Independientemente de esto, los métodos revisados en la memoria anterior pueden ser de enorme utilidad a la hora de resolver ciertos problemas, por que animo a todo aquel que este interesado en temas referentes al aprendizaje automático o al tratamiento digital de señales, a echarle un vistazo.
Actualmente, y aunque los sistemas de control han evolucionado mucho en los últimos años, la sensación actual es de obsesión por utilizar arquitecturas obsoletas sólo por no romper con lo que se presupone preestablecido. Normalmente entendemos como control y percepción ideal (para los videojuegos, simuladores, e incluso control remoto de autómatas) la realizada a través de un terminal clásico, cuando en muchos casos dicho terminal parece ser la principal limitación tecnológica. Actualmente se están haciendo los primeros intentos por despegarse de dicho terminal clásico, pero sin profundizar lo suficiente en los cimientos, ya que seguimos empeñados en aplicar las nuevas tecnologías para hacer las cosas de la misma manera y sin revisar los conceptos originales.
Todo esto viene dado por una reflexión de un compañero sobre lo fácil que seria el realizar un control mas intuitivo y útil para los videojuegos subjetivos actuales, lo cuales llevan utilizando los mismos sistemas de control desde su nacimiento. La idea original consistía en independizar la cámara del control del arma, de tal forma que pudieses estar disparando y mirando a dos sitios distintos al mismo tiempo.
El prototipo desarrollado a raíz de estas reflexiones muestra lo relativamente fácil, barato y simple que seria el hacer un uso mas adecuado de la tecnología actual.
Para construir el prototipo, se eligió uno de los múltiples motores libres del famoso videojuego “quake” para modificar (por ser el primer juego realmente programado en 3 dimensiones). En él, tan sólo se independizo la cámara de la vista, del arma del muñeco. Dividiendo así el único vector de movimiento del antiguo control, en dos vectores independientes. Como se iban a utilizar unas gafas con soporte estereoscópico, se implemento también dicha funcionalidad mediante una doble abanderizaron de la escena, pero por falta de soporte del driver privado de nvidia y de su escasa documentación, este tema se dejo aparcado.
Para el control se eligieron los giroscopios del mando de nintendo por ser actualmente los mas difundidos. Estos se entrenaron con un clasificador de lo mas simple, y se combinaron con sistemas de ecuaciones lineales para calcular los vectores de dirección 3D de los mandos. Obviamente la utilización de otros métodos de clasificación mas avanzados, combinados con algún tipo de filtrado (como los filtros kalman, etc), supondrían un incremento tremendo en la precisión de los sensores.
Los resultados fueron mucho mas que sorprendentes con lo relativamente simple del sistema y de lo rustica de su arquitectura. El siguiente vídeo habla por si solo:
Finalmente solo queda por destacar la utilidad de este tipo de controles en otros ámbitos distintos al de los videojuegos, siempre que se apliquen sabiamente.
Como ya se explico en el articulo anterior, la segmentación de movimiento suele ser el primer paso en muchos de los sistemas de visión artificial actuales, siendo los métodos basados en modelado de fondo los más utilizados en dicho ámbito. No obstante, existen ocasiones en las que no es posible la utilización de dichos métodos, ya que el tiempo de espera y de aprendizaje del fondo no es asumible (como por ejemplo cámaras móviles, cámaras que vibren, etc).
Por ello, es interesante la búsqueda de otros métodos de segmentación que no hagan uso de un modelado de fondo para extraer el movimiento. En la literatura actual existen muy pocas alternativas sin pasar a un seguimiento de regiones, siendo probablemente la mas relevante de todas ellas, la de realizar una segmentación basada en el análisis de la entropía temporal de la imagen.
Este método basa su funcionamiento en una típica resta de frames consecutivos para posteriormente calcular la entropía de cada píxel según un radio de vecindad, segmentando finalmente según un umbral entrópico (la entropía se calcula en base al histograma). Simplificando un poco, el método no pasa de ser una segmentación espacial de la imagen en base a una vecindad, concepto muy parecido al de momentos que aplicamos en el articulo anterior de segmentación por movimiento mediante GMM’s y momentos.
Pese a la simplicidad del método, los resultados obtenidos son sorprendentemente buenos, con la ventaja de necesitar tan solo de dos frames consecutivos tras un movimiento de cámara para poder realizar una segmentación de movimiento sin ruido alguno. Los resultados obtenidos pueden verse en el siguiente vídeo:
La segmentación de movimiento ha sido, y sigue siendo un paso muy importante en la mayoría de aplicaciones de visión artificial. Esta fase tiene por objetivo la extracción (mediante segmentación) de la información útil de la imagen, para así ésta ser procesada adecuadamente en las capas de nivel superior.
La mayoría de los métodos actuales de segmentación de movimiento se basan en el uso de modelados de fondo para realizar dicha segmentación. Obviamente, esta filosofía hace que dichos modelos solo sean validos en entornos rígidos donde la cámara esta fija y no se mueve (al igual que el fondo). Esta no es la única desventaja de estos métodos, pero si es la mas relevante con respecto a otras alternativas. Independientemente de las ventajas o inconvenientes de éstos métodos, un estudio de la literatura revela rápidamente que los segmentadores basados en GMM’s (gaussianas mixtas) son probablemente los mas equilibrados en cuanto a funcionalidad y rendimiento.
Tras implementar un modelo basado en GMM’s como el descrito anteriormente, la decepción llega pronto al observar el pobre resultado del mismo, ya que entre otras cosas, la diferencia entre usar una o múltiples gaussianas era mínimo. Con el objetivo de dar una mayor robustez al sistema, se combinaron los GMM’s con un sistema de momentos probabilísticos. De tal forma que la activación de un píxel en los GMM’s no provocase la activación final del píxel, sino que tan solo incrementase su probabilidad de activación con una vecindad radial granulada. De esta forma añadimos la información espacial de la imagen al proceso de segmentación, sobre una clasificación previa ya realizada dentro del espacio de características mediante los GMM’s.
Los resultados obtenidos pueden verse en el siguiente vídeo:
El control remoto de vehículos tanto terrestres como aéreos fue siempre un campo de interés militar y científico. Este ámbito esta largamente tratado en la literatura, lo cual no quiere decir que la búsqueda de otros sistemas de control no pueda ser útil en otros ámbitos, como por ejemplo la simulación o la realidad virtual.
Por ello para nuestro proyecto de robótica del curso 2007-2008, decidimos implementar un sistema de control remoto que utilizase sensores de inclinación para el control del vehículo. No obstante, y como los acelerómetros del mando de la wii nos proveían de una funcionalidad muy similar, terminamos utilizando estos últimos. También se implemento un control por infrarrojos, pero éste resulto ser demasiado limitado e impreciso para el control del vehículo.
Este es el vídeo que grabamos en su momento para la presentación del proyecto:
Tengo el placer de anunciar la apertura de este nuevo blog, el cual espero sea una fuente de refrescantes ideas y proyectos tecnológicos de interés para la comunidad científica.
En él, nuestros editores publicaran sus proyectos y nos informaran de la evolución de los mismos. Esperamos que os generen el suficiente interés como para que nos dejéis vuestros comentarios y críticas constructivas.