5

私はこれで立ち往生しています。

OpenCV機能の2Dフレームワークを介してオブジェクト分類を実行しようとしていますが、SVMのトレーニングで問題が発生しています。

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

1 に答える 1

10

エラーに基づくと、labelsデータのカテゴリが1つしかないようです。つまり、のすべての機能にtrainingData同じラベルが付いています。

たとえば、SVMを使用して、画像に猫が含まれているかどうかを判断しようとしているとします。のすべてのエントリがlabels同じである場合、次のいずれか...

  • すべてのトレーニング画像には「はい、これは猫です」というラベルが付いています
  • または、すべてのトレーニング画像に「いいえ、これは猫ではありません」というラベルが付いています。

SVMは2つ(場合によってはそれ以上)のデータクラスを分離しようとするため、1つのクラスのデータのみを提供するとSVMライブラリは文句を言います。

これが問題であるかどうかを確認するには、printステートメントを追加して、labelsカテゴリが1つだけ含まれているかどうかを確認することをお勧めします。これを行うためのコードは次のとおりです。

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

于 2012-11-10T05:08:26.993 に答える