Tuesday, May 18, 2010

Support Vector Machine Tutorial with OpenCV 2.1 for Dummies

Debido al enorme tiempo que me tomó poder hacer este pequeño código, decidí escribir el código en mi blog y ayudar así a futuras personas que de pronto se atoren con algo similar. "what comes around goes around".
¿Que fue lo que me atormento desde el Domingo por la noche?

Poder utilizar la librería de aprendizaje de máquina que proporciona la nueva versión 2.1 de OpenCV para tener un clasificador de tipo "Support Vector Machine" . ( No tengo la menor idea de cómo se dice, Support Vector Machine en español , Lo podría buscar, pero no he dormido bien en los últimos días..., Entonces al lector que lo averigue y me lo haga saber, ganará un regalo especial de este blog =)

Así que el propósito de este post, será tener el clasificador corriendo. Para ello, asumiremos que sólo tenemos dos clases, las cuales tienen las etiquetas de -1 y 1.
Cada clase tiene elementos, estos elementos son puntos en 2D.
La clase 1 asumiremos que tiene los siguientes elementos:
3,2.5
6,5.5,
La clase 2 tiene:
-5,5.5
-7,6
-8,-3
Lo unico que probaremos es tener un clasificador que si le envió 3, 2.5 diga: Clase 1 B-)

En C++ y usando la librería de opencv, esto se traduce a :


#include "highgui.h"
#include "cv.h"
#include "ml.h"
#include "cxcore.h"
#include "cxtypes.h"
//#include "cell.h"
#include "celda.h"
#include
//#include
using namespace std;
using namespace cv;

int main()
{
/*Aqui creamos las posibles etiquetas que existirán, las etiquetas
correspondrán con el número de clases que existen, y el número de etiquetas corresponde con el número de ejemplos de aprnedizaje que existen*/
float array_labels[]= {1.0,1.0,-1.0,-1.0,-1.0};
/*Aqui declararemos los datos que se usarán para entrenar, nótese que estoy diceindo que habrá 5 ejemplos de aprendizaje, cada uno con dos valores, la etiqueta del primer elemento corresponde con la primera etiqueta guardado en array_lables.*/
float array_trainData[5][2] = { 3,2.5, 6,5.5, -5,5.5, -7,6, -8,-3};
/*Creamos matrices de opencv que guardarán estos datos*/
cv::Mat trainData(5,2,CV_32FC1,array_trainData);

cv::Mat labels(5,1, CV_32FC1, array_labels);
/
*Creamos el support vector machine*/
CvSVM SVM;
*Lo entrenamos*/
SVM.train(trainData,labels);

/
*Vamos a probarlo!, tomaremos cada uno de los datos del training set, y veremos si nos da la espuesta correcta*/
for(int i = 0; i <5;>
{
double r;
r = SVM.predict( trainData.row(i) );

cout<<"classified as "<<


}

}


Y eso es todo amigos =)
Si ese pequeño código me hizo tardarme aaaños =(
Para un tutorial de Support vector machines chequen: http://citeseer.ist.psu.ed/burges98tutorial.html
y la libreria de machine learning de opencv puede ser consultada en:
http://opencv.willowgarage.com/documentation/cpp/support_vector_machines.html#cvsvm-train

Nota que este tutorial es de la Ultima version 2.1 de opencv! Creo que es de los pocos tutoriales disponibles en LINEA! and of course it is in spanish =)

...Por cierto, acabo de encontrar esta CANCIÓN POR FIN Youtube, y por el nombre del blog, me parece adequado compartir:

7 comments:

samee said...

máquinas de soporte vectorial ;D
according to wikipedia.
:D
de hecho me lo explicaron con manzanitas
http://tinyurl.com/svmssvms
así que que padre que tu código jale :D

viste la película de August Rush? muy recomendable btw :D
bueno esque la canción es parte del soundtrack y me recordó a tu blog :)

saluditos!!
te agregué al mensajero (aunque casi no me conecto, pero ahí a veces andamos)
buscaba tu gmail para agregarte al wave pero no lo encontré
pero ahí platicamos :D

buena vibra pues! :D

Saiph said...

hahaha samee..Gracias eres la unica que comenta y visita mi blog :'(
eres mi visitante favorita B-)
oye esta padrisssimo ese tutorial que pusiste de máquinas de soporte vectorial!! yeah!!
OH POR DIOS! ALGUIEN GANÓ EL SUPE PREMIO...:D
ESPERA ALGO PRONTO!

Anonymous said...

Holaaa!
Tenia una pregunta que hacerte porque he usado parte de tu código para hacer unas pruebas para una practica de la uni y quería saber mas o menos cual se supone que eran los resultados. yo he usado el metodo one-class en vez de el tuyo y esperaba que el resultado me saliera un valor entre 0 y 1, pero los unicos resultados que saco son o 0 o 1. ¿Es esto normal? ¿Es lo que debería de salirme? A ver si me pudieras echar una manos o si sabes como podría salir el resultado que espero.
No tengo google account y por tanto no puedo poner nombre ni nada. si pudieras dejar aqui la contestacion seria genial.
Muchas gracias!!

bytefish said...

Hi. While I was googling "SVM for dummies OpenCV", me and the google translator came across your page. Hahaha, that shows how good documentation on it is! I have written something down that comes close to it. See: http://www.bytefish.de/doku.php?id=blog:machine_learning_with_opencv.

Saiph Savage said...
This comment has been removed by the author.
Saiph Savage said...
This comment has been removed by the author.
Rivalcoba said...

Muy buen tutorial y muy buena canción :D