【发布时间】:2015-04-20 19:57:43
【问题描述】:
我相信我已经成功训练了一个SVM,但是当我尝试用它进行预测时,输出完全是 1。
我的训练代码如下所示:
for(size_t i = 0; i < (testPosArraySize); i++){
testGivenImg = imread(imagePosDir[i]);
detector->detect(testGivenImg, testKeypointsPos);
bowDE.compute(testGivenImg, testKeypointsPos, testFeaturesPos);
testFeaturesPos.reshape(1, 1);
testFeaturesVec.push_back(testFeaturesPos);
}
for(size_t i = 0; i < (testNegaArraySize); i++){
testGivenImg = imread(image[i]);
detector->detect(testGivenImg, testKeypointsNega);
bowDE.compute(testGivenImg, testKeypointsNega, testFeaturesNega);
testFeaturesNega.reshape(1, 1);
testFeaturesVec.push_back(testFeaturesNega);
}
Mat labels(numSamples, 1, CV_32F);
labels.rowRange(0, testPosArraySize).setTo(1);
labels.rowRange(testPosArraySize + 1, numSamples).setTo(-1);
SVM.model.train(fileTestFeat, labels, Mat(), Mat(), SVMParams());
我的预测代码如下所示:
vector<Mat> predictMatVec(predictArraySize); // -- amount of testing images
for(size_t i = 0; i < (predictArraySize); i++){
predictImg = imread(imageNegaDir[i]);
detector->detect(predictImg, predictKeypoints);
bowDE.compute(predictImg, predictKeypoints, predictFeatures);
predictFeatures.reshape(1, 1);
predictMatVec[i].push_back(predictFeatures);
Mat predictMat = Mat(predictMatVec);
float* predictFloat1D = (float*)predictMat.data;
Mat predictMat1D(1, fileTestFeat.cols, CV_32FC1, predictFloat1D);
float predictFloat = model.predict(predictMat1D);
cout << " -- SVM output: " << predictFloat << endl;
}
但它只返回 1。
这有什么问题?
【问题讨论】:
-
如果将模型应用到训练数据库会发生什么?你能“分离”训练数据库吗?
-
我看不出我会从中获得什么信息?我不关注你的第二个问题......
-
您将
predict()与默认returnDFVal一起使用,因此该函数返回一个类标签(分类)或估计的函数值(回归)。我认为你的 1 是类标签,所以你所有的样本都被归类为 1-label 类的元素。如果您对训练数据库执行预测,那么我希望看到其他标签。如果预测对训练数据库不起作用,那么您的训练是错误的。 -
设置它运行用于训练的图像,只是停止工作......我如何制作一个 2 标签类?我以为我已经
标签: c++ opencv machine-learning svm image-recognition