opencv one-class SVM 训练和预测问题

jiaobinn 2016-03-16 04:44:16
我编写了一个单类支持向量机的测试代码,但是无法预测(源码如下),求大神指点一下,非常感谢!
[code=c][code=c]
#include<iostream>
#include<fstream>
#include<string>
#include <sys/time.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/ml/ml.hpp>
#include "opencv2/objdetect/objdetect.hpp"
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

#define WIDTH 100
#define HEIGHT 120
float featureVec[400];
int totalSampleCount = 4000;
int featureNum = 0;

int main()
{
//int totalSampleCount = 1000;
CvMat *sampleFeatureMat = cvCreateMat(totalSampleCount,3, CV_32FC1); //训练样本total个
cvSetZero(sampleFeatureMat);
//CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1); //样本标签
//CvMat sampleLabelMat;
//cvSetZero(&sampleLabelMat);
float res[totalSampleCount];
for(int i = 0; i < totalSampleCount; i++){
res[i] = 1;
cout<<res[i];
}
cout<<endl;
int svm_num;
const float *support;

Vec3b blue(255, 0, 0), green(0, 255, 0), red(0, 0, 255);
Mat images(HEIGHT, WIDTH, CV_8UC3);
for(int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++)
{
switch(i/40){
case 0: images.at<Vec3b>(i, j) = blue; break;
case 1: images.at<Vec3b>(i, j) = green; break;
case 2: images.at<Vec3b>(i, j) = red; break;
}
}

//labels
Mat images2;
images.convertTo(images2, CV_32FC3, 1/255.0);
int contNum = 0;
float *tempBlue = (float*)images2.data;
cout<<"Train data: "<<endl;
for(int i = 0; i < totalSampleCount; ++i)
{
for(int j = 0; j < 3; ++j){
cvmSet(sampleFeatureMat, i, j, *tempBlue);
//cout<<"--"<<*tempBlue;
tempBlue++;
//contNum++;
//cout<<*(sampleFeatureMat->data.fl + j + i)<<" ";
}
//cout<<endl;
//cvmSet(sampleLabelMat, i, 0, 1.0);
}
CvMat sampleLabelMat = cvMat(totalSampleCount, 1, CV_32FC1, res);;
/*CvSVMParams params;
params.svm_type = CvSVM::ONE_CLASS;
params.kernel_type = CvSVM::RBF;
params.nu = 0.12; // changing from 0 - 1 with same effect
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);*/
CvTermCriteria criteria;
CvSVMParams params;
criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
params = CvSVMParams(CvSVM::ONE_CLASS, CvSVM::RBF, 10.0 , 8.0 , 1.0, 10.0, 0.5, 0.1,NULL,criteria);
CvSVM SVM;
SVM.train(sampleFeatureMat, &sampleLabelMat, NULL, NULL, params);
svm_num = SVM.get_support_vector_count();
//cout<<"svm_num"<<svm_num<<endl;
SVM.save("SVM_Test_Model.txt");

float aaa[3] = {1.0, 0.0, 0.0};
CvMat testMat = cvMat(1, 3, CV_32FC1, aaa);
//cvInitMatHeader(&testMat, 1, 3 ,CV_32FC1, aaa);
cout<<"SVM.predict:"<< SVM.predict(&testMat)<<endl;

Mat testImages(HEIGHT, WIDTH, CV_8UC3);
for(int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++)
{
switch(i/40){
case 0: testImages.at<Vec3b>(i, j) = red; break;
case 1: testImages.at<Vec3b>(i, j) = green; break;
case 2: testImages.at<Vec3b>(i, j) = blue; break;
}
}

Vec3b white(255, 255, 255);
testImages.convertTo(testImages, CV_32FC3, 1/255.0);
float *iter = (float*)testImages.data;
CvMat* SVMtestMat = cvCreateMat(1, 3, CV_32FC1);
for (int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++){
for(int k = 0; k < 3; k++){
cvmSet(SVMtestMat, 0, k, *iter);
// cout<<""<<*iter;
iter++;
}
// cout<<"!!";
// cout<<"TestMat: "<<SVMtestMat<<endl;
float response = SVM.predict(SVMtestMat);
//cout<<" response="<<response;
if(1 == response){
testImages.at<Vec3b>(i,j) = white;
}

}
imshow("test image", testImages);
imshow("SRC",images);

while(27 != waitKey(0));

return 0;
}
...全文
2067 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
早餐不傻缺 2016-12-08
  • 打赏
  • 举报
回复
最近我也在用one class svm。也遇到了一样的情况 predict所有返回值是0 查了一天资料包括国外网站,用Opencv做这个东西的人也有很多遇到一样的情况,但是没有解决方法。。。。 如果楼主有解决办法还请指点一下 :D
jiaobinn 2016-03-17
  • 打赏
  • 举报
回复
引用 1 楼 shiter的回复:
啥意思,是没办法分类还是啥,运行不出来? 错误信息发一下吧
预测的结果都是0,即使测试数据和支持向量一样,预测返回值也是0,单类SVM不应该这么用吗?
shiter 2016-03-16
  • 打赏
  • 举报
回复
啥意思,是没办法分类还是啥,运行不出来? 错误信息发一下吧

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧