【发布时间】:2015-03-15 02:03:06
【问题描述】:
试图创建一个功能性的SVM。我有 114 张训练图像、60 张正面图像/54 张负面图像和 386 张测试图像供 SVM 预测。
我将训练图像特征读入float,如下所示:
trainingDataFloat[i][0] = trainFeatures.rows;
trainingDataFloat[i][1] = trainFeatures.cols;
测试图像也是如此:
testDataFloat[i][0] = testFeatures.rows;
testDataFloat[i][2] = testFeatures.cols;
然后,使用 Micka 的 answer to this question,我将 testDataFloat 转换为一维数组,然后像这样将其输入到 Mat,以便在 SVM 上进行预测:
float* testData1D = (float*)testDataFloat;
Mat testDataMat1D(height*width, 1, CV_32FC1, testData1D);
float testPredict = SVMmodel.predict(testDataMat1D);
一切就绪后,就会出现以下调试错误:
cvPreparePredictData 中输入参数的大小不匹配(样本大小与用于训练的大小不同)
看着this post,我发现(感谢berak):
“所有图像(用于训练和预测)的大小必须相同”
所以我添加了一个调整大小的功能,可以将图像重新调整为您希望的任意大小的正方形 (100x100, 200x200, 1000, 1000 etc.)
再次运行它,将图像重新调整到程序现在从中加载图像的新目录,我得到与以前完全相同的错误:
cvPreparePredictData 中输入参数的大小不匹配(样本大小与用于训练的大小不同)
我只是不知道该怎么做。为什么它仍然抛出该错误?
编辑
我变了
Mat testDataMat1D(TestDFheight*TestDFwidth, 1, CV_32FC1, testData1D);
到
Mat testDataMat1D(1, TestDFheight*TestDFwidth, CV_32FC1, testData1D);
并将.predict 放在将features 分配给float 的循环中,以便每个图像都单独分配给.predict,因为this question。随着 int 的交换,.cols = 1 和 .rows = TestDFheight*TestDFwidth 程序似乎实际运行,但随后在图像 160 (.exe has stopped working) 上停止...所以这是一个新问题。
编辑 2
添加了一个简单的
std::cout << testPredict;
查看 SVM 的确定输出,它似乎正匹配所有内容,直到 Image 160 停止运行:
【问题讨论】:
-
请发布您的
svm.train(...);行并详细说明您提供给它的参数。 -
我正在使用默认的 SVM 参数和火车:
SVMmodel.train(trainingDataMat, labelsMat, Mat(), Mat(), SVMParams()); -
trainingDataMat的尺寸是多少,您的训练和预测图像的尺寸是多少? -
Training Mat:
Mat trainingDataMat(height, width, CV_32FC1, trainingDataFloat);-height= 114width= 2. 训练和测试的图像都调整为 500x500 -
根据stackoverflow.com/questions/14694810/… 它应该类似于:
Mat trainingDataMat(114, 500*500, CV_32FC1, trainingDataFloat);而不是...其中 114 是输入图像的数量,而 500*500 是您想要输入的一维数组的大小稍后预测。
标签: c++ opencv machine-learning svm