domingo, 26 de octubre de 2014

OpenCV. Primeros Pasos

Qué todavía no has escuchado de OpenCV??? Bien en parte es responsabilidad nuestra.

Y qué tal acerca del Kinect? No solo para jugar videojuegos sino por todos estos proyectos: Los de aquí y los de acá. La mayoría de estos proyectos que  son de desarrolladores independientes usan OpenCV y los proyectos que son de empresas grandes usan un software parecido.

OpenCV es una librería originalmente escrita para C/C++, pero actualmente también se la puede usar con los lenguajes Java, C# y Python, que son derivados de C++. Se puede usar en Windows, Linux, Mac Os, iOs y Android. (Es decir, en casi todo lo que tenga una pantalla).  Así es, no es más que un montón de código fuente que sirve para hacer algo de magia con imágenes y vídeos:
Nacido en los laboratorios de Intel en 1998, es ahora soportado principalmente por Itseez, donde continúan trabajando cuatro personas del equipo de desarrollo original.
Para usar su potencial se necesita descargar desde aquí. La última versión estable es la 2.4.10 pero la documentación para Python es para la versión alpha 3.0, sin embargo también es válida para la versión 2.4.10

Casi seguro ya tienes instalado Python en tu PC, pero por si no es así, basta con ir a: https://www.python.org/downloads/  para descargarlo. Descarguen la version 2.7 que es compatible con la versión 2.4.10 de OpenCV.
Para obtener OpenCV igualmente solo es necesario ir a Download opencv-2.4.10.exe (367.3 MB) si tienes Windows o ir a http://sourceforge.net/projects/opencvlibrary/ en caso de tener otro sistema operativo.
Además se necesita descargar e instalar Numpy (http://sourceforge.net/projects/numpy/)  y Matplot  (http://sourceforge.net/projects/matplotlib/).

Adermás si bien se puede usar varios editores de código, recomiendo PyCharm en su versión Community (https://www.jetbrains.com/pycharm/download/)

Con todos eso instalado podemos empezar a usar OpenCV. Por si falta algún paso pueden pasarse por aqui .


 Para probar que todo esta bien conecten su cámara web y poner esto dentro de un archivo y llamenlo pruebas.py o como deseen pero preferiblemente con la extensión ".py"

import numpy as np
import cv2
import cv2.cv as cv 
#Creamos un objeto que maneje la camara
cap = cv2.VideoCapture(0)
cap.open(0) 
#Repetimos hasta que se cierre el programa
while(True):
   #Capturamos la imagen actual 
   ret, img = cap.read()
   #Si la captura es correcta entonces la mostramos
   if ret:
       cv2.imshow('img',img)
   #Eperamos que  el usuario presione alguna tecla, en este caso la  letra "q" 
   # que nos servirá para cerrar el programa.
   key=cv2.waitKey(1)
   if  key == ord('q'):
       break
#Al salir del bucle infinito cerramos la ventana y dejamos de utilizar la cámara.
cap.release()
cv.DestroyWindow("img")

Recuerden que ne Python la indentación o tabulación es importante, al igual que los dos puntos al final de las instrucciones de ciclos o comparación como en este caso if y while.

Eso es todo. Pueden probar los ejemplos que vienen junto a OpenCV y también leer tutoriales en OpenCV-Python Tutorials o si gustan en español en Tutorial-OpenCV
Y claro no nos olvidemos de Youtube, fuente inagotable de ideas y proyectos realizados alrededor del mundo. 









miércoles, 15 de octubre de 2014

ML VIII: Modelos Ocultos de Markov.

Modelos Ocultos de Markov

Un proceso global puede representarse usando redes bayesianas como:
Incorporando los supuestos de Markov:
También podemos describir el proceso general mediante una cadena de Markov de variables latentes:
 Incorpora los supuestos de Markov:
Se aprecia que usando las cadenas de Markov tan solo tenemos las variables x, que son los estados ocultos, y las variables z, que son observables. (Saber más...)
Para comprender el por qué son útiles los Modelos Oculto de Markov o HMM (siglas en inglés, que en español queda MOM y tomando el significado en inglés de esta palabra no queda ninguna duda de su utilidad :-D) veamos el siguiente gráfico.  
Imaginad que cada cuadrado de color es una caja con caramelos de distintos sabores, en el tiempo n-2 podemos sacar un caramelo de cualquiera de las cajas. Claro, cada caja tiene cierta probabilidad de que obtengamos un sabor específico. Solo sabremos el sabor una vez que el caramelo sale de la caja.
Luego en el tiempo n-1 nos movemos a obtener el caramelo de otra caja o incluso de la misma caja. El movernos hacia determinada caja o quedarnos con la misma caja también tiene una probabilidad asociada, y al final no se conoce de que caja se saco el caramelo sino solo el sabor del caramelo.

Surgen entonces varias alternativas de incógnitas, mas los problemas básicos que se tratan de resolver son:
1. Calcular eficientemente la probabilidad P(Z/L) de la secuencia de observación Z (Ejemplo de Z: coco, piña, fresa) dado el modelo L y la secuencia de observación Z requerida. Donde el modelo L contiene tanto la matriz A de probabilidades de transición de una caja a otra, la probabilidades de obtener un sabor en cada caja y las probabilidades de estado inicial p  (Pues si nos comemos los caramelos y no los devolvemos a la cajas las probabilidades B cambiaran pero basándose en estas de estado inicial).
2. Encontrar la trayectoria mas probable X (las cajas de cada momento) dado L y la secuencia Z.
3. Ajustar los párametros A,B,p apara máximizar P(Z/L).

Además, con el propósito de resolver estos problemas existen asi mismo 3 operaciones a realizar en los HMM.
1. Calcular P(Z/L) dado un L conocido. Mediante el algoritmo de Forward-Backward
2. Calcular la secuencia óptima de estados X, con un L conocido. Se usa el algoritmo de Viterbi.
3. Aprender o encontrar el modelo L para un Z dado. Se emplea expectación-maximización o Baum-Welch.

Como se puede presumir todos los algoritmos mencionados anteriormente son ampliamente usados en inteligencia artificial. Pues son estos tres problemas básico y sus soluciones lo que nos permite predecir los estados para cualquier proceso de datos secuenciales.
Si cuantizamos (cuantificamos) el tiempo y los datos logramos dicha secuencialidad, y resulta que todo lo digital tiene justamente el tiempo y los datos ya cuantizados o cuantificados. En otras palabras si algo se puede digitalizar, es posible también usar inteligencia artificial, basada en todo lo que hemos visto hasta ahora, en ese algo específico.

Por último solo recordaremos que audio, video y texto han sido digitalizados desde antes que nacieras (si tienes menos de 20 años, claro). El tacto, ambiente (clima) y la orientación se han demorado un poco más pero ya poseen su formato digital también. El olfato y gusto tienen investigaciones en curso y tan solo faltaría lo emocional (que en buena parte esta en el texto y vídeo) para poder aplicar inteligencia artificial en casi todo ámbito humano.

domingo, 5 de octubre de 2014

ML VII Modelos gráficos probabilísticos, Redes Bayesianas

Bueno, hasta ahora hemos visto 101 diapositivas en 5 artículos, lo cual indica mas o menos 20 diapositivas por artículo, espero sus comentarios para saber si quieren más resumido o más extenso el contenido.

La probabilidad nos ha acompañado al largo de todo el curso mediante fórmulas pero una forma de representarla es también gráficamente.

Una gráfica de modelo probabilístico es una representación esquemática de una distribución de probabilidad. 
En un modelo gráfico, las variables aleatorias se representan como nodos y las dependencias estadísticas se representan utilizando los enlaces entre los nodos. 
El gráfico resultante puede tener las siguientes propiedades: 
• Cíclico / Acíclico 
• Dirigida / No Dirigido 
• Los gráficos más simples son los gráficos acíclicos dirigidos(DAG).

Ejemplo:
Dado 3 variables aleatorias, y su probabilidad conjunta: p(a,b,c)=p(c|a,b)p(a,b)=p(c|a,b)p(b|a)p(a)
Redes Bayesianas

Un modelo basado en DAG es una red bayesiana.
En general con K variables aleatorias se podría tener una distribución conjunta de probabilidad: 
p(x1,...,xK)=p(xK|x1,..xK-1)....p(x2|x1)p(x1)
Esto lleva a un gráfico completamente conectado. 
• Nota: El orden de los nodos en un gráfico totalmente conectado es arbitrario. 
Todos ellos representan la distribución de probabilidad conjunta:
p(a,b,c)=p(a|b,c)p(b|c)p(c)
p(a,b,c)=p(b|a,c)p(a|c)p(c)
...
etc
La independencia estadística se puede representar por la ausencia de bordes. Esto hace los cálculos eficientes.
Recordemos (son 4 meses de demora ;-D): Dos variables son independientes si  

 Y por tanto al usar el teorema de Bayes:

Además dos variables con condicionalmente independientes si:
 Que es equivalente a:
Cos estos conceptos en cuenta veamos unos ejemplos usando gráficos:

Ejemplo 1
El siguiente gráfico representa :

 Al marginalizar a c:
Se tiene que a y b no son independientes.

Si suponemos que se conoce c, se tiene lo siguiente:
Por tanto a y  b, son condicionalmente independientes con respecto a c, y se dice que c es un nodo cola a cola (tail-to-tail node) en el trayecto entre a y b 

 Ejemplo 2
El siguiente dibujo representa:
Al marginalizar a c:

 Se tiene que a y b no son independientes.

 Si suponemos que se conoce c, se tiene lo siguiente:

Por tanto de nuevo a y b son condicionalmente independientes con respecto a c. Y a c se le llama nodo de cabeSe tiene que a y b no son independientes.
Siguiendo el mismo procedimiento marginalizando c se tiene que a es independiente de b.
Si se concidera que se conoce c:
Se tiene que a y b no son condicionalmente independientes de c. Además a c se le conoce como nodo cabeza a cabeza (head-to-head node).

Con estos ejemplos es claro ver como con los enlaces entre nodos y la dirección entre ellos, además de saber si el nodo intermedio corresponde a una variable conocida o no, se puede saber si existe o no independencia entre las variables.