Cannot get alpha when use SVM in Java
Hi,
I want to use the Java API 3.0 to detect food image with HOG feature. After I trained the SVM, I want to get the svmdetector with alpha and rho. But when I call getDecisionFunction function, the alpha returns a 1*1 mat. How can I get the right data?
SVM csvm=SVM.create();
csvm.setType(SVM.C_SVC);
csvm.setKernel(SVM.LINEAR);
csvm.setC(0.01);
TermCriteria tc=new TermCriteria(TermCriteria.MAX_ITER, 3000, 1e-6);
csvm.setTermCriteria(tc);
csvm.train(dataMat, Ml.ROW_SAMPLE, labelMat);
csvm.save(this.svmModelPath+"\\"+labelname+".xml");
System.out.println(csvm.getDegree());
System.out.println(csvm.getVarCount());
System.out.println(csvm.getSupportVectors());
int svdim=csvm.getVarCount();
int numofsv=csvm.getSupportVectors().rows();
Mat alpha=Mat.zeros(numofsv,svdim,CvType.CV_32FC1);
Mat svidx=Mat.zeros(1, numofsv,CvType.CV_64FC1);
System.out.println(alpha);
System.out.println(svidx);
double rho=csvm.getDecisionFunction(0, alpha, svidx);
alpha.convertTo(alpha, CvType.CV_32FC1);
System.out.println(rho);
System.out.println(alpha);
System.out.println(svidx);
The output is :
0.0
2304
Mat [1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10850, dataAddr=0x1d611080]
Mat [1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0x1c509080]
Mat [1*1128*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa30d80]
-1.0566525311046109
Mat [1*1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0xa29e00]
Mat [1*1*CV_32SC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa292c0]
do you want to use rho & the sv for detectMultiScale() later ?
Yes. That's exactly what I am going to do.