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

Visual C++ Discussion :

Espace mémoire insuffisant


Sujet :

Visual C++

  1. #1
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut Espace mémoire insuffisant
    Bonjour à tous,
    j'ai problème d'espace mémoire lors de l'exécution de mon code. Il s'agit de parcourir une base d'image est de stocker les descripteurs de chaque image et entrer le tout à un classifieur SVM. Mes descripteurs sont bien mis dans un tableau (new), une fois terminé je tiens à libèrer l'espace mémoire avec (delete), sauf qu'au bout de quelque itération ça bug avec une erreur "bad_alloc at memory location " qui veut dire que j'ai plus d'espace mémoire. Quelqu'un a une idée pour quoi le delete ne libère pas l'espace ici??
    Voici mon code:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    for(int k=0; k<NUMBER_OF_PERSON; k++) 
     {     
       for(int i=0; i<NUMBER_OF_CLASSES; i++)
       { 		
            for(int j=0; j<NUMBER_OF_SAMPLE_PER_CLASS ; j++)
            {
    	   //cout<<"Learning Sample N°: " << nbSample <<endl; 
    	  string stra = "D:/CrossValidationRandom";
    	 ostringstream oi;
    	 ostringstream oj;
    	 ostringstream ok;
    	 ok << k;
    	 oi << i;
    	 oj << j;
    	 string NPerson = ok.str();
    	 string NClass = oi.str(); 
             string NSample = oj.str(); 
             string ImgPath = stra + "/" + NPerson + "/" + NClass + "/" + NSample + ".tiff";	 	  	   
    	 IplImage* Src = cvLoadImage(ImgPath.c_str());
    	 IplImage* FaceImg = cvCreateImage(cvSize(FACE_WIDTH, FACE_HEIGHT), IPL_DEPTH_8U, 1);
    	 FE.FaceDetection(Src, FaceImg);
    	 cvReleaseImage(& Src);
     
       //Features Extraction 					   
        int* LBPHist = new int[NbBins];//(int*)malloc(NbBins * sizeof(int));
       FE.LBPFeatureExtraction(FaceImg, NbSegment, NbImage, LBPHist); 
     
       //Stoquer les features de toute les images d'apprentissage
       for(int m=0; m<NbBins; m++)  {  LBPData[nbFeat++] = LBPHist[m]; }	 				  
       delete[] LBPHist;  //LBPHist = NULL; 
       Class[nbSample] = i;							  
       nbSample++;
     
       }			 
      }	     
     } 
     
    cvInitMatHeader (&data_mat, NUMBER_OF_TRAINING_SAMPLES, NbBins, CV_32FC1, LBPData);
    cvInitMatHeader (&Class_mat, NUMBER_OF_TRAINING_SAMPLES, 1, CV_32SC1, Class); 
    param.svm_type    = CvSVM::C_SVC;
    param.kernel_type = CvSVM::LINEAR; 
    param.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); 
     
    cout<<"Start Training SVM"<<endl;
    svm.train (&data_mat, &Class_mat, Mat(), Mat(), param);
    svm.save ("C:\Train.xml"); 
    cout<<"Fin Apprentissage SVM"<<endl;
    //Free Memory		
    delete[] LBPData;  
    delete[] Class; 
    cvDecRefData(& data_mat);  
    cvDecRefData(& Class_mat);
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On dirait qu'il manque un cvReleaseImage() sur FaceImg.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    On dirait qu'il manque un cvReleaseImage() sur FaceImg.
    Merci Médinoc
    Je viens de l'insérer ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	   
     int* LBPHist = new int[NbBins];//(int*)malloc(NbBins * sizeof(int));
     FE.LBPFeatureExtraction(FaceImg, NbSegment, NbImage, LBPHist); 
     cvReleaseImage(& FaceImg);
    Mais le problème persiste

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    LBPFeatureExtraction() ne retourne rien qu'il faille libérer?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    LBPFeatureExtraction() ne retourne rien qu'il faille libérer?
    LBPFeatureExtraction() retourne le tableau de descripteurs LBPHist que je le libère après avoir stocker ses éléments dans LBPData et qui à son tour libérer une fois fini de l'apprentissage avec SVM !

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je voulais dire... Je peux voir son prototype?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé Avatar de miss_angel
    Inscrit en
    Février 2008
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 210
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je voulais dire... Je peux voir son prototype?
    Je suis vraiment désolée, je peux pas partager le code parce que ça appartient à mon labo, sinon je peux vous expliquer en gros ligne le rôle de cette fontion:
    -calculer le gradient d'une image, GradientX et GradientY et les stocker dans un tableau TabImg (allocation mémoire avec new)
    -Couper ces images en des segments d'images que je vais les stocker dans un tableau de segments TabSegImg (allocation mémoire avec new + Libération mémoire de TabImg)
    -Parcourir ces blocks et calculer les descripteurs LBP pour chacun et les stocker dans un tableau LBPHist (Allocation avec new + Libération mémoire du tableau TabSegImg)
    Voilà c'est en gros ce qu'elle fait, je tiens chaque fois à libérer l'espace mémoire des tableaux et des images utilisés, sauf qu'au bout de quelque itération ça bug avec une erreur d'insuffissance de mémoire
    On peut pas lier le problème à la taille de mes barettes RAM parce que sinon ça tient plus à la philosophie de développement, aussi parce que je tiens à libérer l'espace mémoire à chaque fois j'alloue une image (cvReleaseImage), un tableau (delete), une matrice (cvDecRefData), une séquence (cvClearSeq), mémoire de storage (cvClearMemStorage) et même quand je gère un tableau d'image je parcours ce tableau case à case pour libérer les images dedans ensuite libérer le tableau lui même...vraiment j'ai suivi tous les conseils fourni sur par mal de forum...je sais pas s'il y a d'autres astuces qui m'échappent et que j'espère bien vous me les élcairer !
    Merci d'avance^^

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

Discussions similaires

  1. Espace mémoire insuffisant
    Par n1k00 dans le forum Langage
    Réponses: 12
    Dernier message: 25/08/2010, 16h08
  2. Espace mémoire insuffisant
    Par adrien954 dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/09/2008, 12h41
  3. Atteindre un espace mémoire avec perl
    Par scaleo dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2006, 18h53
  4. [C][obtenir l'espace mémoire libre]
    Par ronan99999 dans le forum Windows
    Réponses: 4
    Dernier message: 26/10/2004, 07h53
  5. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 12h37

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