Mat trainDataMat = Mat.ones((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1),//ポジティブデータ行列 labelMat = Mat.ones((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1),//ラベル responseMat = Mat.ones(sample.length, sample[0].length, CvType.CV_32FC1), sampleMat = Mat.ones(sample.length, sample[0].length, CvType.CV_32FC1); int resultSVM = 0; //1次元配列に変換 float [] posdata = new float[posAry.length*3+negAry.length*3]; float [] flagdata = new float[posAry.length*3+negAry.length*3]; int k=0; for(int i=0;i<posAry.length;i++) for(int j=0;j<3;j++) {posdata[k]=posAry[i][j];flagdata[k]=1; k++;} for(int i=0;i<negAry.length;i++) for(int j=0;j<3;j++) {posdata[k]=negAry[i][j];flagdata[k]=-1;k++;} /* k=0; float [] sampledata = new float[sample.length*3]; for(int i=0;i<sample.length;i++) for(int j=0;j<3;j++) {sampledata[k]=sample[i][j]; k++;} */ //行列へマッピング trainDataMat.put(0, 0, posdata); labelMat.put(0, 0, flagdata); System.out.print("posAry=" + trainDataMat.dump()); System.out.print("labelAry=" + labelMat.dump()); CvSVM classifier = new CvSVM(); CvSVMParams params = new CvSVMParams(); params.set_svm_type(CvSVM.C_SVC); params.set_kernel_type(CvSVM.LINEAR); //(中略) // classifier.train(trainDataMat, responseMat, labelMat, sampleMat, params); classifier.train(trainDataMat,labelMat); //(中略) // Mat resultMat = new Mat(4, 5, CvType.CV_32FC(5)), // predictionMat = new Mat(4, 5, CvType.CV_32FC(5)); Mat resultMat = new Mat((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1), predictionMat = new Mat((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1); float result = classifier.predict(predictionMat); //(中略) double[] label = resultMat.get(N , M); System.out.print(result); // //分類結果をint値で返す // return resultSVM; } }
resonse array must contain as many elements as the total number of samples in function cvPreprocessCategoricalResponses
→トレーニングデータの要素数と正誤ラベルデータの数が不一致だと発生
resonse array must be 1-dimensional in function cvPreprocessCategoricalResponses
→SVMに使うデータのうち、一つでも多次元のデータがあると発生。使うデータは全て1次元配列に調整する。(例えば4*5のデータならば20*1に変換してから使う)
Input sample must have 32fc1 type in function cvPreparePredictData
→使用データのタイプがCV_32FC1でなければならないのに、それ以外のタイプを指定したときに発生。
the sample size is different from what has been used for training in function cvPreparePredictData
→学習データとテストデータの特徴量数が不一致だと発生。
また、サンプルデータをpredictする場合は1次元データを使わなければならない。