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 :

Modifier le noyau du SVM


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut Modifier le noyau du SVM
    Bonjour ,

    Je suis en train d 'implémenter un algorithme pour la détection d'objet .
    et dans cette algorithme ils ont utilise un nouveau noyau , n'est pas implémenté en opencv.

    donc j'ai essayé de l'ajouter en opencv :
    premierement , dans le fichier ml.h :

    en ligne 398 , j'ai ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , float* results);
    en ligne 521 , j'ai ajouter le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 , KHI=4};
    après , j'ai ajouté dans le fichier mlsvm.cpp :

    CvSVMKernel::create( const CvSVMParams* _params, Calc _calc_func ): J'ai ajoute un nouveau ligne entre les lignes 224 et 228 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    params->kernel_type == CvSVM::KHI ? &CvSVMKernel::calc_khi_deux:
    bool CvSVM::set_params( const CvSVMParams& _params ) : dans cette fonction , j'ai juste modifié dans le condition si en ligne 1258 , j'ai ajouté :
    void CvSVM::write_params( CvFileStorage* fs ) const :dans cette fonction ;J'ai juste ajouté en ligne 2069 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kernel_type == CvSVM::KHI ? "KHI" :
    void CvSVM::read_params( CvFileStorage* fs, CvFileNode* svm_node ) : j'ai ajouté en ligne 2241 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp( kernel_type_str, "KHI" ) == 0 ? CvSVM::KHI :
    et j'ai ajouté mon fonction pour calculer le nouveau noyau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void CvSVMKernel:: calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , Qfloat* results)
    {
        CvMat R = cvMat( 1, vcount, QFLOAT_TYPE, results );
        double gamma = -params->gamma;
        int j, k;
     
        for( j = 0; j < vcount; j++ )
        {
            const float* sample = vecs[j];
            double s = 0;
     
            for( k = 0; k <= var_count; k ++ )
            {
                double t0 = sample[k] - another[k];
                double t2=  sample[k] + another[k];
     
                s +=( (t0*t0)/t2);
            }
     
            results[j] = (Qfloat)((0.5*s)*(gamma));
        }
     
        if( vcount > 0 )
            cvExp( &R, &R );
    }
    mais Ça pas marche , j'ai juste obtenu le même résultat avec la fonction predict quelque soit le paramètre gamma allant de 0.000001 a 100 .

    je ne sais pas ou se trouve le problème .

  2. #2
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut
    enfin , j'ai trouvé l'erreur .
    En fait , l'erreur c’était dans mon fonction de noyau , puisque j'ai divisé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sample[k] + another[k];
    ce qui peut être égale a zéro dans certain cas .

    donc j'ai modifié mon fonction et je l'ai optimisée comme les autres noyau trouvés dans opencv .

    mon fonction sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void CvSVMKernel:: calc_khi_deux(int vcount, int var_count,const float** vecs, const float * another , Qfloat* results)
    {
         CvMat R = cvMat( 1, vcount, QFLOAT_TYPE, results );
        double gamma = -params->gamma;
        int j, k;
     
        for( j = 0; j < vcount; j++ )
        {
            const float* sample = vecs[j];
            double s = 0;
     
            for( k = 0; k <= var_count - 4; k += 4 )
            {
                double t0 = sample[k] - another[k];
                double t2=sample[k] + another[k];
                double t1 = sample[k+1] - another[k+1];
                double t3=sample[k+1] + another[k+1];
                double t4=t2==0?1:t2;
                double t5=t3==0?1:t3;
                s += (t0*t0)/t4 + (t1*t1)/t5;
     
                t0 = sample[k+2] - another[k+2];
                t2 = sample[k+2] + another[k+2];
                t1 = sample[k+3] - another[k+3];
                t3 = sample[k+3] + another[k+3];
                t4=t2==0?1:t2;
                t5=t3==0?1:t3;
                s += (t0*t0)/t4 + (t1*t1)/t5;
     
            }
     
            for( ; k < var_count; k++ )
            {
                double t0 = sample[k] - another[k];
                double t2=sample[k] + another[k];
                double t4=t2==0?1:t2;
                s += (t0*t0)/t4;
            }
            results[j] = (Qfloat)(s*gamma);
        }
     
        cvExp( &R, &R );
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modifier le noyau linux
    Par popov2 dans le forum Administration système
    Réponses: 7
    Dernier message: 16/04/2011, 10h42
  2. SVM: réglage du paramètre sigma dans le noyau RBF
    Par farah dans le forum Méthodes prédictives
    Réponses: 9
    Dernier message: 04/05/2010, 14h23
  3. Noyau dans SVM
    Par medchok dans le forum MATLAB
    Réponses: 0
    Dernier message: 07/04/2009, 00h23
  4. Algo SVM Noyau RBF
    Par sbiri dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/12/2008, 09h45
  5. [SVM]Quelques questions relatives au noyau
    Par progfou dans le forum Méthodes prédictives
    Réponses: 7
    Dernier message: 30/03/2007, 11h57

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