martes, 10 de marzo de 2015

Nos adentramos en la Visión Artificial



A finales del año pasado se abrió el MUNCYT de Alcobendas (Museo Nacional de Ciencia y Tecnología) y nos acercamos a ver si era digno sustituto del difunto Cosmo Caixa, museo que ocupaba el mismo edificio antes de que la crisis se lo llevase por delante.


Al entrar, lo primero que te recibe es una instalación llamada ¿Cómo ven las máquinas? en la que se muestran diferentes juegos y representaciones visuales e interactivas con la que se intenta mostrar y explicar los procesos llamados de "Visión Artificial".





Yo ya tenía el gusanillo de la visión artificial, sobre todo después de ver proyectos como este robot que juega al Hockey, pero los veía un como algo fuera de mi alcance. Seguro que necesitaría un montón de tiempo y de esfuerzo para empezar a enterarme de algo, así que siempre lo tenía en el cajón de lo pendiente.


Pero después de ver la instalación del MUNCYT, mi curiosidad llegó al límite y el SAV[i] se me puso por las nubes, ¡tenía que intentarlo!, ¡tenía que ponerme con ello!

 Así que me puse manos a la obra, pero ... 

- ¿por dónde empiezo?
- por donde vas a empezar, alma de cántaro, pues por donde siempre empezamos, por "internes".
- ¡¡Ay!! yo no se que haría sin "San Google de la Divina Consulta" y sin todas las "Santas Personas que comparten sus conocimientos" (véase que desde que el catecismo se publica en el B.O.E. me he vuelto de lo mas religioso).

En fin, que buscando y leyendo, comprendí que lo mejor que hay para todo este invento es utilizar OpenCV


¿Qué es OpenCV? "Open Computer Vision" o lo que es lo mismo, librerías de código abierto para la visión de ordenador. Además de ser Open,  (Open = Patrimonio Tecnológico de la Humanidad), está disponible para plataformas Linux, Windows y Mac y es soportado por los lenguajes de programación mas usados C/C++, Java, Python, etc. 

Quizás, hablar de visión por ordenador sea demasiado pretencioso, mas bien se trata de librerías de software con el que podemos analizar y procesar imágenes, podemos realizar seguimiento de objetos en movimiento, detectar rostros, ojos, etc., reconocer objetos, y muchísimas cosas más. Pero lo que resulta evidente es que una vez realizado el procesado de imágenes y aplicado dicho procesamiento a un fin en concreto, el resultado es igual o muy parecido a si las maquinas pudiesen ver. 

La otra cosa que tenía que decidir era el lenguaje de programación que iba a utilizar. Parece que lo mas usado en este mundillo es el C/C++, pero la verdad es que lo tengo un poco oxidado, podía utilizar Java, pero... últimamente estoy aprendiendo Python, así que ya puestos, podía matar dos pájaros de un tiro, aprender OpenCV y practicar Python, ¡¡solución perfecta!!

Bueno, ya os he comentado como y por qué me he metido en este berenjenal, ahora es tiempo de salir de él.

Para empezar, y puesto que la entrada me va quedando ya un poco larga, voy a mostraos el primer programa típico en este mundo, el "Hola Mundo" del OpenCv: un detector de caras. En la siguiente entrada utilizaremos lo aquí mostrado y lo aplicaremos a nuestros robots. 

Antes de empezar deberéis tener instalado Python (obvio), OpenCV(mas obvio aún) y la librería numpy.

OpenCV, para poder reconocer cualquier objeto, necesita de un archivo .xml que le proporciona información del objeto que busca. Para crear dicho fichero se necesitan unos cuantos miles de fotos que contengan el objeto que deseamos que identifique y otras tantas que no lo tengan (en este blog tenéis bien explicado el proceso para crear el fichero .xml además de otros muchos ejemplos)

En nuestro caso, OpenCV ya proporciona una serie de ficheros haarcascade.xml para detectar caras, ojos, sonrisas, nariz, etc.

El programa en Python es este:


__author__ = 'Jose Luis V'
 
from cv2 import *
namedWindow("webcam")
vc = VideoCapture(0);

detector = CascadeClassifier("haarcascade_frontalface_alt.xml");

while True:
    ret, frame = vc.read()

    caras = detector.detectMultiScale(
        frame,
        scaleFactor=1.1,         
        minNeighbors=5, 
        minSize=(30, 30),
        flags=cv.CV_HAAR_SCALE_IMAGE
    )

    for (x, y, w, h) in caras:
        rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    imshow("webcam",frame)
    if waitKey(50) >= 0:
        break 
 
vc.release()
destroyAllWindows()

Lo que hace el programa a groso modo es:
  • Carga el fichero con la información del objeto a detectar (caras de frente en este caso)
  • Entra en un bucle y sale cuando pulsamos una tecla
    • lee un frame de la cámara de video
    • Aplica el fichero xml al frame para detectar caras
    • Si hay alguna dibuja un rectángulo enmarcando la cara.


Como veis el programa no tiene mucho misterio y puede parecer una tontería, pero esto solo es el principio. En la siguiente entrada os mostraré como aplicar esto a nuestros robots. 

Las aplicaciones son tantas como grande sea vuestra imaginación.

Os espero en la próxima entrada, veréis que chulada.





[i] Síndrome del Ansia Viva (muy utilizado en la comunidad de impresión 3D Clone Wars)

4 comentarios:

  1. Genial Jose Luis. Tengo este tema aparcado desde hace mucho y tu entrada me lo ha refrescado. No pensaba que estuviese tan al alcance del Freak Team. Gracias por el ejemplo. Cacharrearé con Python a ver si suena la flauta.
    Saludos.
    Miguel Angel.

    ResponderEliminar
    Respuestas
    1. Hola Migue Angel, gracias a ti por seguirnos.
      Yo tampoco pensaba que fuese capaz de hacer algo con esto pero gracias a toda la gente que comparte sus proyectos y sus conocimientos, ponerse es poder y la verdad, para hacer cositas, no es muy complicado.

      Cacharrea, cacharrea y cuentanoslo

      Saludos
      Jose Luis

      Eliminar
  2. Hola! Estoy empezando en esto de la vision artificial y espero hacer algunos cursos en el futuro para saber más. Me parece un tema fascinante y con muchísimas aplicaciones. Gracias por la información! Saludos!

    ResponderEliminar
    Respuestas
    1. Gracias a ti Martina, espero haberte sido de ayuda.

      Esperamos ver pronto tus avances y... ¡¡¡no olvides compartirlos!!! :-)

      Eliminar