IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Utilisation de SVM


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 25
    Par défaut Utilisation de SVM
    Bonjour,
    Je voudrais utiliser SVM pour faire un apprentissage.
    Ca marche avec deux classes de points pour le moment avec le code suivant (pour ceux qui galére à trouver un code:

    {
    CvRNG rng_state = cvRNG(-1);
    float _sample[2];
    CvMat sample = cvMat( 1, 2, CV_32FC1, _sample );

    int i, j;
    CvSVM TestSVM;
    IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
    cvZero( img );
    CvTermCriteria ctc = cvTermCriteria(CV_TERMCRIT_ITER,100,0.01);
    // form the training samples
    int train_sample_count = 100;
    CvMat* trainData = cvCreateMat( train_sample_count, 2, CV_32FC1 );
    CvMat* trainClasses = cvCreateMat( train_sample_count, 1, CV_32FC1 );

    CvMat trainData1, trainData2, trainClasses1, trainClasses2;
    cvGetRows( trainData, &trainData1, 0, train_sample_count/2 );
    cvRandArr( &rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(200,200), cvScalar(50,50) );

    cvGetRows( trainData, &trainData2, train_sample_count/2, train_sample_count );
    cvRandArr( &rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(300,300), cvScalar(50,50) );

    cvGetRows( trainClasses, &trainClasses1, 0, train_sample_count/2 );
    cvSet( &trainClasses1, cvScalar(1) );

    cvGetRows( trainClasses, &trainClasses2, train_sample_count/2, train_sample_count );
    cvSet( &trainClasses2, cvScalar(2) );

    float response;
    ///Faire le training
    TestSVM.train(trainData,trainClasses,NULL,NULL,CvSVMParams(CvSVM::NU_SVC, CvSVM::RBF, 0.0, 0.1, 0.0, 0.0, 0.2, 0.0,NULL,ctc));

    for( i = 0; i < img->height; i++ )
    {
    for( j = 0; j < img->width; j++ )
    {
    sample.data.fl[0] = (float)j;
    sample.data.fl[1] = (float)i;

    response=TestSVM.predict(&sample);

    // highlight the pixel
    cvSet2D( img, i, j, response ==1 ?
    CV_RGB(0,180,180) : CV_RGB(120,120,0));
    // (accuracy > 5 ? CV_RGB(180,0,0) : CV_RGB(0,180,180)) :
    //(accuracy > 5 ? CV_RGB(0,180,0) : CV_RGB(120,120,0)) );
    }
    }
    // display the original training samples
    for( i = 0; i < train_sample_count/2; i++ )
    {
    CvPoint pt;
    pt.x = cvRound(trainData1.data.fl[i*2]);
    pt.y = cvRound(trainData1.data.fl[i*2+1]);
    cvCircle( img, pt, 2, CV_RGB(255,0,0), CV_FILLED );
    pt.x = cvRound(trainData2.data.fl[i*2]);
    pt.y = cvRound(trainData2.data.fl[i*2+1]);
    cvCircle( img, pt, 2, CV_RGB(0,255,0), CV_FILLED );
    }
    ///end of display
    //CvFileStorage* fs = cvOpenFileStorage( "data.xml", 0, CV_STORAGE_WRITE_TEXT );
    //TestSVM.write(fs,"fs.xml");
    //cvReleaseFileStorage (&fs);

    TestSVM.save("C:\\Test.xml",NULL);
    cvNamedWindow( "classifier result2", 1 );
    cvShowImage( "classifier result2", img );
    cvWaitKey(0);
    cvDestroyWindow( "classifier result2");
    cvReleaseMat( &trainClasses );
    cvReleaseMat( &trainData );

    }

    Cependant j'ai deux pb:
    le 1er pour utiliser plus de deux classes
    et le second pour sauvegarder et charger le classificateur qui vient d'être entrainé car en utilisant TestSVM.save ca ne marche que sur l'example qui vient d'etre testé et non sur un autre example.

    Si qlq connait un bon tutoriel ca serait bien de le partager

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 25
    Par défaut
    J'en ai trouvé un trés interessant.
    voici le lien:
    http://opencv.jp/sample/svm.html

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 95
    Par défaut
    Bonjour à tous,

    Je remonte le sujet, car je suis actuellement en train de travailler sur les SVM !
    J'ai plusieurs classes (5). Est-ce que vous savez si l'algorithme de la version actuelle d'OpenCV (2.1) supporte plus de deux classes ?
    Merci d'avance
    Bonne journée à tous

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 95
    Par défaut
    Effectivement, c'est bien possible !!!

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Par défaut
    Je sais que j'arrive un peu en retard mais bon ... une réponse est toujours bonne à prendre

    A la base les SVM ne s'applique qu'à deux classes en les séparant par un hyperplan mais il y une astuce qui consiste, par exemple dans le cas de 5 classes de construire 5 classifieur SVM chacun d'entre séparera une classe bien précise des autre classe, on aura donc 5 réponse distincte pour connaitre la bonne, on définit un critère par exemple en choisissant la valeur MAX.

Discussions similaires

  1. Utilisation de SVM
    Par youni301 dans le forum Général Java
    Réponses: 0
    Dernier message: 03/06/2014, 11h43
  2. [Débutant] choisir les paramètre de Svm utilisant k-folds cross validation
    Par pretyy dans le forum Images
    Réponses: 0
    Dernier message: 14/05/2014, 11h28
  3. apprentissage automatique en utilisant SVM
    Par maya 22 dans le forum Général Python
    Réponses: 0
    Dernier message: 11/06/2011, 21h08
  4. Utilisation de rbf dans la fonction kernel pour les SVM (MATLAB)
    Par walidtechno dans le forum Méthodes prédictives
    Réponses: 1
    Dernier message: 28/03/2011, 01h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo