2012-11-09 11 views
5

मैं इस पर फंस गया हूं।ओपनसीवी एसवीएम ट्रेन पर अपवाद फेंक रहा है, "खराब तर्क (केवल एक ही कक्षा है)"

मैं ओपनसीवी फीचर 2 डी फ्रेमवर्क के माध्यम से कुछ ऑब्जेक्ट वर्गीकरण करने की कोशिश कर रहा हूं, लेकिन मेरे एसवीएम को प्रशिक्षित करने में परेशानी में भाग रहा हूं।

मैं शब्दावली निकालने और BowKMeansTrainer का उपयोग करके उन्हें क्लस्टर करने में सक्षम हूं, लेकिन ट्रेनर में जोड़ने और SVM.train विधि चलाने के लिए प्रशिक्षण डेटा से सुविधाओं को निकालने के बाद, मुझे निम्न अपवाद मिलता है।

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 

मैं, आकार शब्दकोश संशोधित विभिन्न प्रशिक्षकों का उपयोग कर की कोशिश की है, मेरे मैट्रिक्स प्रकार सुनिश्चित सही (opencv के लिए नए मेरी क्षमता के अनुसार, अभी भी) कर रहे हैं।

क्या किसी ने इस त्रुटि को देखा है या इसे ठीक करने के तरीके पर कोई अंतर्दृष्टि है?

मेरे कोड इस तरह दिखता है:

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

'निकालें BOWDescriptor' वास्तव में क्या करता है? और 'प्रशिक्षण डेटा' और 'लेबल' का आकार क्या है? – luhb

+0

extractBOWDescriptor सिर्फ फाइलों की एक सूची के माध्यम से उपयोग करता है, सुविधाओं को पाता है (एसयूआरएफ फीचर डिटेक्टर का उपयोग करके), उन सुविधाओं को निकालता है, उन्हें प्रशिक्षण डेटा पर धक्का देता है और फिर लेबल में एक प्रविष्टि दबाता है। – tuck

+0

प्रशिक्षण डेटा का आकार dictionary_size x 2 है और लेबल संख्या_of_images x 2 है – tuck

उत्तर

10

त्रुटि के आधार पर यह की तरह अपने labels केवल डेटा की एक श्रेणी में शामिल है लग रहा है। यही है, आपके trainingData की सभी सुविधाओं में एक ही लेबल है।

उदाहरण के लिए, कहें कि आप यह निर्धारित करने के लिए एसवीएम का उपयोग करने की कोशिश कर रहे हैं कि किसी छवि में बिल्ली है या नहीं। यदि labels में प्रत्येक प्रविष्टि एक ही है, तो या तो ...

  • सब अपने प्रशिक्षण छवियों के रूप में
  • "हाँ यह एक बिल्ली है" या, अपने सभी प्रशिक्षण छवियों के रूप में "कोई लेबल रहे हैं नाम से पुकारा जाता है, यह एक बिल्ली नहीं है। "

एसवीएम डेटा के दो (या कभी-कभी अधिक) कक्षाओं को अलग करने का प्रयास करते हैं, इसलिए एसवीएम लाइब्रेरी शिकायत करती है कि आप केवल एक वर्ग डेटा प्रदान करते हैं।

यह देखने के लिए कि यह समस्या है, तो मैं यह जांचने के लिए एक प्रिंट स्टेटमेंट जोड़ने की सलाह देता हूं कि labels में केवल एक श्रेणी है या नहीं। यहाँ यह करने के लिए कुछ कोड है:

//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)); 

एक बार आपके extractBOWDescriptor() भार डेटा labels में

, मैं यह सोचते हैं रहा है कि labels आकार (trainingData.rows, trainingData.cols) की है। यदि नहीं, तो यह एक समस्या हो सकती है।

संबंधित मुद्दे