2012-11-09 12 views
5

Buna takılıyorum.OpenCV SVM trende istisna atıyor, "Kötü argüman (Sadece tek bir sınıf var)"

OpenCV özellik 2d çerçevesi aracılığıyla bazı nesne sınıflandırması yapmaya çalışıyorum, ancak SVM'yi eğitmekle ilgili sorunlara koşuyorum.

Kelime dağarcığı ayıklamak ve bunları BowKMeansTrainer kullanarak küme oluşturabiliyorum, ancak antrenöre eklemek için antrenman verilerinden özellikler çıkardıktan ve SVM.train yöntemini çalıştırdıktan sonra, aşağıdaki özel durumu elde ediyorum. Benim matris tiplerini sağlanması farklı eğitmenler kullanarak, sözlük boyutunu değiştirerek denedim

OpenCV Error: Bad argument (There is only a single class) in  cvPreprocessCategoricalResponses, file /home/tbu/prog/OpenCV-2.4.2/modules/ml/src /inner_functions.cpp, line 729 
terminate called after throwing an instance of 'cv::Exception' 
what(): /home/tbuchy/prog/OpenCV-2.4.2/modules/ml/src/inner_functions.cpp:729: error:  (-5) There is only a single class in function cvPreprocessCategoricalResponses 

(hala benim yeteneği en iyi şekilde OpenCV için yeni) doğrudur.

Bu hatanın görüldüğü veya nasıl düzeltileceği konusunda herhangi bir fikriniz var mı?

Benim kod şöyle görünür:

hata dayanarak
trainingPaths = getFilePaths(); 
extractTrainingVocab(trainingPaths); 
cout<<"Clustering..."<<endl; 
Mat dictionary = bowTrainer.cluster(); 
bowDE.setVocabulary(dictionary); 


Mat trainingData(0, dictionarySize, CV_32FC1); 
Mat labels(0, 1, CV_32FC1); 
extractBOWDescriptor(trainingPaths, trainingData, labels); 


//making the classifier 
CvSVM classifier; 
CvSVMParams params; 
params.svm_type = CvSVM::C_SVC; 
params.kernel_type = CvSVM::LINEAR; 
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); 

classifier.train(trainingData, labels, Mat(), Mat(), params); 
+0

'extractBOWDescriptor' tam olarak ne yapar? Ve 'trainingData' ve 'label'lerin boyutu nedir? – luhb

+0

extractBOWDescriptor sadece bir dosya listesinden geçer, özellikleri bulur (SURF özellik detektörünü kullanarak), bu özellikleri ayıklar, onları eğitim Verileri'ne aktarır ve daha sonra bir girişi etiketlere aktarır. – tuck

+0

eğitim verilerinin boyutu dictionary_size x 2 ve etiketler number_of_images x 2 – tuck

cevap

10

, bu labels yalnızca bir veri içerir: kategori senin gibi görünüyor. Yani, trainingData'unuzdaki tüm özellikler aynı etikete sahiptir. Örneğin, bir görüntünün kedi içerip içermediğini belirlemek için SVM'yi kullanmaya çalıştığınızı varsayalım. labels her girdisi aynı, ardından ya ...

  • tüm eğitim görüntüleri
  • "evet bu bir kedi" ya da, tüm eğitim görüntüleri hayır" ibareli ibareli ise, Bu bir kedi değil. "

SVM'ler iki (veya daha fazla) veri sınıfını ayırmaya çalışır, böylece SVM kitaplığı yalnızca bir veri sınıfı sağlıyor olmanız halinde şikayetçi olur. Bu sorunun ise

Ben labels Yalnızca bir kategoriyi içerip içermediğini kontrol etmek için bir baskı beyanı eklemenizi öneririz, görmek için. Ben labels büyüklüğü (trainingData.rows, trainingData.cols) ait olduğunu varsayarak yaşıyorum labels içine extractBOWDescriptor() yükler verilere kez

//check: are the printouts all the same? 
for(int i=0; i<labels.rows; i++) 
    for(int j=0; j<labels.cols; j++) 
     printf("labels(%d, %d) = %f \n", i, j, labels.at<float>(i,j)); 

: İşte bunun için bazı kod. Değilse, bu bir sorun olabilir.

İlgili konular