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
![]()
Partager