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: