Avance de Genetic Algorithm

Este primer semestre en Inteligencia Artificial he estado probando el terreno en lo que son el metodo de Algoritmo Genetico donde se intenta llegar a una respuesta cercana a la deseado basandonos en  “fitness”, mutacion, “crossover” y algo de aleatoriedad, en este trabajo que he practicado llegue a algo que se llama el Microbial Genetic Algorithm donde es una version mas simplificada a lo que es el Algoritmo Genetico en si pero donde se basa en la misma idea(Survival of the Fittest). Este metodo muestra alguno errores de pemutacion es una buena introduccion a estos metodos de busqueda de respuesta.

Este pequeño programa en Java usa las lineas punteadas con sus posiciones finales en x & y, he el programa intenta ordenar estas lineas en 5 lineas consecutivas.Para ordenarlo el progrma debe de poner un 1 para todas las lineas punteadas que pertenezcan consecutivamente y un 0 a las otras.

Descargar las Clases de java

 

Avance drones

Durante el semestre estuve trabajando con un ardrone parrot 2.0 en un proyecto que consiste en hacer que el dron siga un objeto rojo.

Al empezar utilice node.js con la biblioteca de node-ar-drone y node-opencv. En el camino encontré varios obstáculos. Primero cuando trataba de utilizar la función de getPngStream(); de ar-drone sólo obtenía una imagen en el navegador y tenía que recargar la página a cada rato para actualizar la imagen, para resolver esto instale ffmpeg, después ejecute las pruebas de compatibilidad que se incluyen con la biblioteca, cambie algunas cosas de la instalación de ffmpeg hasta obtener resultados positivos en las pruebas y obtener un stream de imágenes. Después para utilizar el módulo de opencv, decidí hacer un prototipo donde aprendería a utilizarlo, pero al tratar de instalar el módulo usando el manejador de dependencias de node siempre resultaba en error y tuve que buscar en varias página e instalar algunas cosas hasta poder instalarlo. Esos pasos están a continuación por si alguien quiere utilizar node-opencv en algún momento:

  • Instala opencv, asegúrate que sea una versión menor a la 3.0.0.
    • Para la instalación:
    • Descarga opencv de: http://opencv.org/downloads.html
    • Descomprímelo y guárdalo en c:\opencv
    • Crea una variable de Sistema: OPENCV_DIR – C:\opencv\build\x64\vc12
    • Añade el path: %OPENCV_DIR%\bin
  • Instala python version 2.7: http://www.python.org/download/releases/2.7/
  • Instala pkg-config:
    • Instala la versión complete desde http://www.gtk.org/download/win64.php
    • Si el paso anterior no funciona sigue los siguientes pasos:
      • Instala MinGW
      • Descarga pkg-config.exe
      • Descomprime el folder y pon el archivo pkg-config.exe en /MinGW/bin
      • Descarga GLib DLL
      • Descomptime y copia liglib-2.0.0.dll en la carpeta de /MinGW/bin
      • Abre la terminal y ejecuta los siguientes comandos:
      • $ cd c:/MinGW/bin
      • $ cp libintl-8.dll intl.dll
    • Verifica que estás obteniendo una ruta correcta a la carpeta de opencv usando el siguiente comando: $ pkg-config –cflags opencv
    • Si obtienes la ruta la instalación de opencv está completa, sino sigue estos pasos:
      • Crea un archivo llamado opencv.pc
      • El archivo deberá contener la siguiente información

prefix=C:/opencv

exec_prefix=${prefix}/bin

libdir=${prefix}/build/x64/vc12/lib

includedir_old=${prefix}/build/include/opencv

includedir_new=${prefix}/build/include

 

Name: OpenCV

Description: Open Source Computer Vision Library

Version: #versión que corresponda

Libs: ${libdir}/opencv_core2410 ${libdir}/opencv_imgproc2410 ${libdir}/opencv_highgui2410 ${libdir}/opencv_ml2410 ${libdir}/opencv_video2410 ${libdir}/opencv_features2d2410 ${libdir}/opencv_calib3d2410 ${libdir}/opencv_objdetect2410 ${libdir}/opencv_contrib2410 ${libdir}/opencv_legacy2410 ${libdir}/opencv_flann2410

Cflags: ${includedir_old} ${includedir_new}

  • Agrega una variable de Sistema llamada PKG_CONFIG_PATH que contenga la ruta donde hayas guardado el archivo de opencv.pc
  • Instala visual studio con sus components de c++
  • Ejecuta npm install opencv para instalar el módulo de opencv
  • Si después de ejecutar npm install opencv obtienes algún error que tenga que ver con la compilación de c++ puedes buscar el error en internet y hacer cambios pequeños en el código para que se instale. Si el error es de otra cosa revisa que el proceso de instalación explicado arriba este completo.

Después ya que sabía muy poco de opencv fui con un compañero de la carrera que está realizando su proyecto de tesina usando drones para que me orientara un poco. Me recomendó utilizar la librería de cvdrone (https://github.com/puku0x/cvdrone) para C++ porque utilizar node da un delay de 1 – 2 segundos, lo cual es demasiado tiempo en términos de visión computacional, luego me explico algunas cosas de opencv y la forma en que él estaba localizando un objeto; me paso un programa que él había hecho para usarlo de ejemplo y un tutorial para identificar un color. Estuve revisando la librería y ejecute varios de sus ejemplos para ver cómo funcionaba, dentro de esos ejemplos había uno que utilizaba el filtro de Kalman, el cual es un algoritmo recursivo que realiza estimaciones usando datos imprecisos de un sistema dinámico para predecir que va a hacer después. El filtro de Kalman es muy bueno para sistemas que están en cambio continuo y como sólo guarda el estado anterior del sistema, no necesita de mucha memoria, además es muy rápido, lo cual lo hace perfecto para sistemas en tiempo real, como este que trata de seguir un objeto. Usando esto con algunas modificaciones para realizar una muestra de color sin necesidad de mover manualmente los parámetros de HSV y añadiendo funciones para el movimiento del dron obtuve un resultado aceptable de seguimiento que será refinado en lo que resta de tiempo del semestre.

A continuación un vídeo de los resultados hasta el momento:

Drones

Hola soy Mariana, anteriormente en el blog había hecho una introducción acerca del proyecto en el que trabajaríamos con los drones haciendo un programa para que un ar-drone parrot buscara un color y lo siguiera, pero gracias a poca disponibilidad de tiempo y pésima planeación el proyecto no se terminó y en su lugar hicimos un controlador web en el que se puede ver la señal en vivo de la cámara del dron y enviarle instrucciones de vuelo como despegar, aterrizar, ir al frente, etc.

Para tener comunicación bidireccional con el dron utilizamos una librería en JavaScript para Node.js, llamada socket.io,  la cual nos permite controlar eventos en tiempo real a través de conexiones TCP. Y para el stream de vídeo  que se muestra en la página usamos node-dronestream que analiza cada frame que es enviado por el dron y divide la carga útil en unidades NAL que luego envía al navegador a través de sockets y ya en el navegador utiliza un decodificador de JavaScript para hacer el render del vídeo usando WebGL.

El proyecto lo puedes encontrar en esta liga: https://github.com/edudeespinosa/exploradorDron

Junta con una guía rápida para la programación de drones con Node.js y los pasos necesarios para instalar el proyecto.

Drones

Hola, mi nombre es Mariana. Estoy en 7° semestre de la carrera de Ingeniería en Sistemas Computacionales.

En este blog les estaré compartiendo los avances que vayamos teniendo en el proyecto de drones, en el que estaré trabajando con otros compañeros y el maestro Benjamín, el cual consiste en hacer un programa para que el drone busque y siga un color determinado.

Para el proyecto utilizaremos un ar-drone parrot, drone propulsado por cuatro motores eléctricos que cuenta con un microprocesador, sensores y una cámara. El ar-drone, además funciona como servidor lo cual permite que te conectes y puedas controlarlo por medio de dispositivos móviles, a través de una aplicación, o programarlo y así lograr hacer cosas más divertidas e interesantes.

Para la programación del drone utilizaré Node Js  y la librería del ar-drone (https://github.com/felixge/node-ar-drone) para poder usar comandos de alto nivel como ‘takeoff()’ para controlar el drone.

Por ahora eso es todo, visiten próximamente para ver nuevos avances del proyecto.

Aquí les dejo una imagen del drone:

Me incorporó a sus filas

Soy Franco Valencia, la nueva adquisición de Benjamin. Previamente ISD, me termine convirtiendo a ISC cuando descubrí que mis inclinaciones se alineaban más a esta carrera.

Mis principales intereses en el campo de las ciencias computacionales es la inteligencia artificial y el análisis de Big Data. Este semestre estaré leyendo libros, navegando en Kickstarter y pensando en la inmortalidad del Drone.

Es posible que me interese en el area de Drones ya que tienen un componente de electrónica que también me encanta. Otra posibilidad seria un area que involucre psicología e inteligencia artificial, ya que es algo que también me apasiona.

  

Saludos

Clasificador de Audio

Esto es en lo que estaré trabajando este semestre: se desarrollará una aplicación que logre identificar las notas musicales por medio de un micrófono. Se usará Python y sus librerías de manipulación y edición de audio para esta tarea. El programa sólo funcionará con sonidos de guitarras eléctricas por ahora (ya sea con o sin distorsión), el objetivo es después hacerlo más grande para que funcione con más sonidos pero eso se desarrollará en semestres futuros.

El programa tiene que funcionar en tiempo real y al final se le agregará una pequeña animación que tiene que reaccionar de acuerdo a lo que el programa este escuchando. Para la animación se usará Blender aunque si alguien sabe de algún otro, cualquier recomendación es bienvenida.

En cuanto al método de entrenamiento para el clasificador aún no estoy muy seguro de cuál usar, encontré varias opciones y estaré experimentando y leyendo de ellas para después escoger la más apropiada. También cualquier comentario respecto a esto bienvenido.

Conforme vaya teniendo avances iré haciendo más publicaciones.

audio_wave-4

 

Primer avance de Procesamiento de Audio

En mi proceso de poder combinar la manipulación de audio con la Inteligencia Artificial he decidido que la mejor opción por el momento será aprender el lenguaje de programación Python, ya que éste puede ser compatible con ambos rubros. También, encontré el curso “Procesamiento Digital de Audio para Aplicaciones Musicales”, en Coursera. Chéquenlo si les interesa algo de esto y son tan principiantes como yo: https://es.coursera.org/course/audio

Por último les dejo un video acerca de cómo funciona el audio de manera digital, cortesía del buen Erik 🙂

Aprendizaje Supervisado

En este post, explicaré de forma general la tarea del Aprendizaje Supervisado. Además, introduciré cierta notación para que sea más sencillo elaborar sobre estos conceptos posteriormente.

(Me referiré a “Aprendizaje Automático” como Machine Learning el 99% del tiempo, porque no me gusta la traducción).

Machine Learning:

Debido a que Machine Learning es un área de estudio relativamente nueva, no existe una definición aceptada por todos los especialistas. Sin embargo, hay dos definiciones muy populares, con las cuáles basta para tener una idea clara de la disciplina:

El aprendizaje automático es el proceso que le da a las computadoras la habilidad de aprender sin ser explícitamente programadas. – A.L Samuel

Se dice que un programa de computación aprende de la experiencia E con respecto a una tarea T y alguna medida de rendimiento P, si es que el rendimiento en T, medido por P, mejora con la experiencia E. – T.M Mitchell

La segunda definición es mucho más clara, e incluso nos da la idea general de funcionamiento de la mayoría de los algoritmos de aprendizaje: Crear un programa que pueda aprender a realizar una tarea, y mejorar su rendimiento en la misma mediante entrenamiento (experiencia).

Existe una serie larga de problemas y tareas a resolver dentro de Machine Learning. Aunque las dos más conocidas son el Aprendizaje Supervisado, y el No Supervisado. En este artículo daré una breve introducción al primero.

Aprendizaje Supervisado

De forma simple, en Aprendizaje Supervisado se cuenta con un conjunto de ejemplos de los cuáles conocemos la respuesta. Lo que deseamos es formular algún tipo de regla o correspondencia que nos permita dar (o aproximar) la respuesta para todos los objetos que se nos presenten.

Por ejemplo, podemos contar con información de casas (conjunto de ejemplos), y los precios correspondientes de cada una (respuesta). A partir de esto, queremos aprender alguna regla de correspondencia entre casas y sus precios, que nos permita predecir el costo cuando tengamos información de nuevas casas.

Ahora presentaré un poco de notación matemática, que nos permitirá explicar con mayor facilidad otros conceptos.

Formulación del problema

{X} – conjunto de objetos.

{Y} – conjunto de etiquetas (o respuestas).

{y}:{X}\to {Y} – función de dependencia entre los objetos y etiquetas.

y_i = y{(x^{(i)})}, i = 1, \dots , l – valores conocidos de la función.

Problema: Encontrar h : X \to Y , una función h , que permita aproximar el conjunto de objetos al de respuestas.

De esta forma, nuestra meta es poder encontrar la función h, también conocida como hipótesis. Para este propósito, se utiliza un algoritmo de aprendizaje, que permite aproximar esta función.

¿Cómo se describe a los objetos?

Cada objeto está descrito por una serie de predictores también conocidos como features. Como se puede inferir de forma intuitiva, los features son una serie de características de dicho objeto.

Por ejemplo, los features de una casa podrían ser su tamaño, número de cuartos, número de pisos, años de antigüedad, etc.

Formalmente,

{x^{(i)}} \in \mathbb{R}^{n} – es decir, un objeto se representa como un vector de n dimensiones, donde n es el número de features de dicho objeto. Usaremos la notación x^{(i)} para denotar el objeto i, y x_i para denotar el feature i del objeto.

Puede sonar complicado, pero esto sólo significa que podemos representar una casa de la siguiente manera: (500, 4) . Un vector con el tamaño en metros cuadrados y el número de cuartos.

Escoger qué features utilizar es muy importante para el desempeño de nuestro algoritmo. Hay muchas formas en las que podemos realizar esta selección, y depende de qué algoritmos utilicemos así como la naturaleza del problema.

Por ejemplo, los features de una imágen son los pixeles. Y por lo tanto, una imágen sería un vector donde cada componente correspondería al valor de intensidad del pixel. Te podrás imaginar que imágenes grandes pueden tener millones de features fácilmente, por lo que es común redimensionar las imágenes.

Por lo tanto, nuestro conjunto de datos está representado por una matriz donde cada columna representa a un feature, y cada fila a un objeto:

Screen Shot 2015-10-20 at 3.21.52 PM

¿Cómo se describen las respuestas o etiquetas?

Dentro del aprendizaje supervisado existen (básicamente) dos problemas a solucionar: Clasificación y regresión.

En clasificación,  |{y}| \ll {\infty}. Es decir, que el número de posibles respuestas es finito.

De forma sencilla, esto significa que en tareas de clasificación, la intención es asignar una de un conjunto bien definido (y finito) de categorias a nuestro ejemplo. Por ejemplo, si se quiere determinar si un mail es spam o no, existen dos respuestas: spam, y no spam. Por lo tanto, es una tarea de clasificación.

En regresión, {Y} {\in} {\mathbb{R}} . Es decir, la respuesta es una variable numérica con una infinidad de posibles resultados.

En el problema de predecir el precio de una casa, la tarea es de regresión, ya que se quiere predecir un resultado continuo. Una variación del mismo problema en términos de clasificación, sería determinar si una casa tiene precio “alto”, “medio” o “bajo”.

Aprendizaje supervisado

Finalmente, podemos definir formalmente el problema de aprendizaje supervisado.

Consideremos a una pareja ({x_i},{y_i}) , que representa a un objeto junto a su etiqueta. Esta pareja es conocida como training sample, o un ejemplo del entrenamiento.

Para el aprendizaje supervisado contamos con un conjunto de entrenamiento:

\left\{({x^{(i)}},{y^{(i)}}) , \dots,({x^{(m)}},{y^{(m)}}) \right\} \subset {X}

El cual utilizamos para entrenar un algoritmo de aprendizaje. Este algoritmo nos otorga una aproximación a la función de dependencia desconocida entre objetos y respuestas.

Screen Shot 2015-10-20 at 2.47.33 PM

Como se puede ver en el diagrama, el aprendizaje supervisado consta de dos pasos esenciales:

  1. Entrenamiento, donde usamos el conjunto de entrenamiento en conjunto con un algoritmo que nos permita crear una hipótesis.
  2. Prueba, donde utilizamos la hipótesis obtenida en el paso anterior para realizar nuevas predicciones con objetos nuevos.

Todo este proceso se llama aprendizaje supervisado, ya que al conocer las respuestas de cada ejemplo del conjunto de entrenamiento, podemos corregir la hipótesis producida por el algoritmo. Se supervisa el entrenamiento del algoritmo, corrigiendo los parámetros del mismo según los resultados que obtengamos, de forma iterativa.

Conclusión

En este post, se delineó de forma general el Aprendizaje Supervisado. Para hacer un re-cap rápido, la meta de este tipo de aprendizaje es aprender una hipótesis mediante el entrenamiento de un algoritmo. El entrenamiento se realiza con un conjunto de entrenamiento, que no es nada más que un grupo de objetos (como casas) con sus respectivas respuestas que deseamos estimar (como precios). Posteriormente, utilizamos la hipótesis aprendida para estimar nuevos objetos u observaciones.

Aún quedan muchas preguntas como por ejemplo, ¿cómo medir el rendimiento de una hipótesis y/o un algoritmo? O más aún, ¿cómo es que funcionan estos algoritmos?

En próximos posts intentaré responder estas preguntas, empezando por la introducción de algoritmos sencillos, así como formas de evaluar las respuestas que obtenemos.

Referencias:

Las imágenes usadas fueron extraídas de las Lecture Notes de CS229 de Stanford, con autoría de Andrew Ng. http://cs229.stanford.edu/materials.html

Clasificación de especies de cactus.

Soy Alejandro Cassis, estudiante de quinto semestre de la carrera en ISC. Estuve familiarizándome con Machine Learning desde hace un año, y realicé dos proyectos hasta el semestre pasado: Una red bayesiana (de juguete) para calcular la probabilidad de tener ciertas enfermedades basándose en ciertas evidencias, y un clasificador de señas del lenguaje de sordomudos.

Durante el verano de este año, tuve la suerte de tomar un curso serio de Machine Learning en ITMO, una gran universidad Rusa. Gracias a esta oportunidad, pude aprender con profundidad muchos de los conceptos, algoritmos y técnicas utilizados en este área, y este semestre estoy involucrado en un proyecto mucho más retador.

Me dieron acceso a un conjunto de datos con información de microsatélites de una variedad de especies de cactus endémicos a ciertas zonas de México. El dataset está dividido en especies, y a la vez, de la región de dónde se recolectó el perfil genético de dicho individuo.

De forma muy general, la tarea que tengo es poder construir un clasificador. El mismo debe permitir identificar a qué zona pertenece cierto cactus, a partir de su perfil genotípico. En pocas palabras, poder determinar de forma automática a qué región pertenece un cactus de cierta especie.

Las dificultades en esta tarea son múltiples. Algunas de ellas son:

  1. Se cuenta con -relativamente- pocos datos de ciertas especies, lo cual dificulta el entrenamiento y uso de ciertos algoritmos de clasificación.
  2. La investigación parte de la hipótesis de que individuos de la misma especie se diferencian según la zona a la que pertenecen. Esto no es necesariamente cierto, y por lo tanto es posible que no se obtenga los resultados esperados.
  3. Al trabajar junto a un experto en el área, es necesario que los resultados que obtenga sean interpretables. Esto es particularmente difícil cuando se utilizan algunos algoritmos (Redes Neuronales, por ejemplo).

Además de estas, existen otras dificultades de carácter más técnico. Por ejemplo, que el modelo generalice bien con nuevas observaciones y no este “overfitted”. 

Durante las próximas semanas, estaré haciendo una serie de posts en este blog explicando conceptos básicos de Machine Learning, y en particular, del Aprendizaje Supervisado. A partir de estas ideas, explicaré algunos algoritmos sencillos con los que experimenté. Particularmente, Regresión Logística, y Naive Bayes.

Finalmente, con este contexto podré explicar con más detalle el algoritmo que me está brindando los mejores resultados: Random Forests.

Luces, cámara, drones

Hola a todos. Mi nombre es Eduardo y voy en 9no semestre de ISC. No deben saber mucho de mi aparte de los detalles que estoy a punto de contarles. Me graduaré en mayo del 2016. Estudié el semestre enero-mayo 2015 en Finlandia. Y en este blog les compartiré mi día a día en mi proyecto anual llamado ‘luces, cámara, drones’.

En mi estancia en Finlandia decidí enfocar mis estudios al estudio más intensivo de machine learning. Dado que el año pasado había comenzado con el estudio de los drones decidí continuar y comenzar un proyecto relativo al reconocimiento de patrones utilizando al dron.

A lo largo de estos dos semestres realizaré tres tipos de actividades:

  • investigación del estado del arte: lectura de journals de lo que está sucediendo en el mundo de la inteligencia artificial. Debido a la poca experiencia que tengo en el área, las investigaciones al inicio serán extensivas e incluirán la investigación de distintos conceptos con los cuales no estoy familiarizado.
  • Implementación de experimentos: dado lo que exista en el estado del arte de la inteligencia artificial, implementaré experimentos que me puedan ayudar con el proyecto que decida hacer al final
  • Trabajo de campo con dron: trabajaré en equipo con otros dos colaboradores de este blog para un proyecto que buscará integrar la tecnología del dron con el reconocimiento de patrones, más específicamente hablando de la cámara del mismo.

A lo largo de este tiempo estaré escribiendo reportes semanales con lo que vaya aprendiendo y vaya aplicando para que pueda ser consultado por cualquier persona y sea de utilidad.

En la próxima entrega, entrare a fondo con un journal que llevo leyendo e investigando acerca de un proceso genérico de reconocimiento en tiempo real de la posición de la mano con motivos interactivos.

Manténganse al pendiente.