domingo, 17 de abril de 2011

Lenguajes para Visión Artificial

Hasta el año 2000, los sistemas de Visión Artificial se programaban habitualmente en lenguajes de bajo nivel, sobre todo en C. Esto casi siempre se debía a que los algoritmos de Visión Artificial suelen requerir cálculos intensivos, y C permitía ejecutarlos con máxima celeridad.

Evidentemente, si un programador domina el lenguaje ensamblador de una máquina y programa un algoritmo de manera nativa para la misma, el resultado puede ser óptimo. Sin embargo, para programar de manera eficiente en ensamblador se requieren unos conocimientos muy avanzados (y mucha paciencia). Un programador menos instruido puede implementar el mismo algoritmo en C y obtener seguramente un rendimiento mayor. Además, tardará menos y su solución servirá para un amplio abanico de máquinas. Esto se debe a que C provee de herramientas de abstracción de las que el lenguaje ensamblador adolece, y a que en C se pueden encontrar miles de bibliotecas que facilitan mucho la labor del programador (entre las que podemos destacar OpenCV para visión). De hecho, casi todos los fabricantes suministran bibliotecas en C para el manejo de su hardware (por ejemplo, los fabricantes de tarjetas gráficas proporcionan APIs propietarias como CUDA o abiertas como OpenCL).

Creo que lo comentado hasta ahora justifica suficientemente el paso de ensamblador a C. Pero se debe observar que, de la misma forma, podría justificar el paso de C a otros lenguajes de más alto nivel, como Matlab, Python o Java. De hecho, desde principios de siglo, cada vez más sistemas de Visión Artificial se implementan en lenguajes de más alto nivel como Matlab. Este cambio hacia una abstracción aún mayor, simplifica de nuevo las labores de programación. Además, esto está ocurriendo sin que se note un decremento en el rendimiento de los sistemas, lo cual se debe a dos hechos: por un lado los ordenadores de hoy son lo suficientemente rápidos para que la ejecución sobre lenguajes más lentos no plantee demasiados problemas, y por otro lado, la mayoría de las funciones de cálculo intensivo de Matlab están implementadas en C, por lo que si Matlab se usa de manera adecuada, la perdida de rendimiento respecto a programar directamente en C podría ser despreciable.

Uno de los problemas de Matlab estriba en que no es una solución gratuita, y por tanto la documentación y el software tiene un coste que, sobre todo, el aprendiz no desea pagar. Es quizás por ello que, en los últimos años, en el entorno educativo han aparecido alternativas gratuitas como Octave, R, Scilab, o Scipy sobre Python. Estas herramientas han evolucionado suficiente para abandonar su origen educativo y ser usadas en aplicaciones reales. En particular, Scipy sobre Python se está siendo elegido por muchos como su entorno para procesamiento de imagen.

Entornos QtOctave (sobre Octave) y Spyder (sobre Python y Scipy)

En Java, también se pueden encontrar bibliotecas para trabajar en Visión (como las JAI, ImageJ o JavaCV), pero en general es más raro que un sistema de Visión Artificial se programe en Java. Esto quizás se deba a la ausencia de una gran biblioteca de Visión Artificial para Java, o a que como la complejidad de programar en Java es similar a la de programar en C, simplemente no se suela optar por esta alternativa. Sin embargo, Java ofrece muy buenas perspectivas para el desarrollo de aplicaciones de Visión Artificial. Por un lado, no hay lenguaje que disponga de más bibliotecas que Java, no por nada es el lenguaje más utilizado en el mundo, con un 20% de cuota de mercado. Por otro lado, es multiplataforma, y esto puede ser determinante, por ejemplo en el mundo de los móviles de última generación (de hecho Java es el lenguaje nativo del sistema operativo Android). Además, una implementación eficiente en Java, desde el punto de vista de velocidad de ejecución, puede llegar a ofrecer un rendimiento similar a una realizada en C.

Se puede concluir diciendo que Matlab y las alternativas libres (como Octave o Scipy) son los entornos preferidos para programar aplicaciones de Visión Artificial en ambientes académicos, mientras que C sigue siendo el lenguaje de programación preferido para este tipo de aplicaciones en entornos industriales, aunque la distancia entre ambos se está reduciendo en los últimos años en detrimento de C.

8 comentarios:

  1. Un detalle, cuando se habla de las APIs propietarias y abiertas de los fabricantes de tarjetas gráficas (procesadores gráficos) creo que se está refiriendo a CUDA y OpenCL en lugar de OpenGL (por simple comparación del target al que van dedicadas estas extensiones). Aunque OpenCL, al igual que OpenGL, esté coordinada a través del grupo Khronos, no directamente por un fabricante de procesadores gráficos como NVIDIA y su CUDA.

    ResponderEliminar
  2. He incluido la corrección en la entrada del blog. Gracias Antonio.

    ResponderEliminar
  3. Hola, he llegado aquí buscando información sobre cómo programar funciones de Matlab en C. Después de leer este artículo me gustaría plantear algunas preguntas:
    1. ¿Qué es la visión por computador?
    2. ¿Existe algún libro, documento digital, etc. que me ayude a aprender a programar funciones matemáticas en C?

    Tengo pocos conocimientos en programación, justo acabo de acabar el primer año en el grado de informática, pero toda ayuda, por avanzada que sea, me será útil.

    Gracias.

    ResponderEliminar
  4. Hola.

    La Visión por Computador es una rama de la Informática que se dedica al estudio de los métodos que permiten extraer información no trivial de las imágenes digitales.

    Por ejemplo, se usan técnicas de visión por computador:
    - Cuando pones tu cámara en modo detectar sonrisa (http://www.xataka.com/fotografia/camara-fotografica-que-detecta-las-sonrisas).
    - Cuando tu portátil reconoce tu rostro y no te pide la contraseña (http://www.diarioti.com/noticia/Laptop_de_Lenovo_reconoce_el_rostro/16254).
    - Cuando la aplicación Goggles de Google reconoce un monumento desde tu teléfono Android (http://www.google.com/mobile/goggles/#text).
    - Cuando el Mars Explorer no choca con determinada piedra (http://www.ri.cmu.edu/publication_view.html?pub_id=5719).

    Como ves, los resultados de esta disciplina cada vez se aplican más a problemas del mundo de hoy.

    ResponderEliminar
  5. Respecto a tu segunda pregunta te diré que C incorpora una bibliteca de funciones matemáticas cuya cabecera es "math.h".

    Además, puedes encontrar otras bibliotecas matemáticas más avanzadas como:
    - XNA Math,
    - OpenGL Mathematics,
    - CML (http://www.cmldev.net/)
    - Sony's vectormath library
    - Eigen (http://eigen.tuxfamily.org/index.php?title=Main_Page)

    En cuanto a libros, me parece una mezcla difícil. Te recomiendo que aprendas bien C, y una vez que sepas C lo utilices para desarrollar las matemáticas que conozcas.

    ResponderEliminar
    Respuestas
    1. ¡Muchas gracias! Siento no haber podido responder antes pero estaba de exámenes :P

      Eliminar
  6. Excelente información. Sin duda Java ofrece muy buenas perspectivas para el desarrollo de aplicaciones de vision artificial y poco a poco iremos se introducen en entornos industriales. Saludos!

    ResponderEliminar
  7. Es impresionante saber cómo funciona el software de visión artificial e imaginar todo lo que se puede llegar hacer con estas tecnologías. ¡Un post muy útil!

    ResponderEliminar