Ask Your Question

Revision history [back]

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 [ 11282304CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10850, dataAddr=0x1d611080 ] Mat [ 11282304CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0x1c509080 ] Mat [ 11128CV_64FC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa30d80 ] -1.0566525311046109 Mat [ 11CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0xa29e00 ] Mat [ 11CV_32SC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa292c0 ]

click to hide/show revision 2
None

updated 2017-08-28 04:19:35 -0600

berak gravatar image

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 [ 11282304CV_32FC1, 1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10850, dataAddr=0x1d611080 ]
Mat [ 11282304CV_32FC1, 1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0x1c509080 ]
Mat [ 11128CV_64FC1, 1*1128*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa30d80 ]
-1.0566525311046109
Mat [ 11CV_32FC1, 1*1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0xa29e00 ]
Mat [ 11CV_32SC1, 1*1*CV_32SC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa292c0 ]

]
click to hide/show revision 3
None

updated 2017-08-28 04:20:21 -0600

berak gravatar image

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, [1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10850, dataAddr=0x1d611080 ]
Mat [ 1128*2304*CV_32FC1, dataAddr=0x1d611080]
Mat [1128*2304*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0x1c509080 ]
Mat [ 1*1128*CV_64FC1, dataAddr=0x1c509080]
Mat [1*1128*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa30d80 ]
dataAddr=0xa30d80]
-1.0566525311046109
Mat [ 1*1*CV_32FC1, [1*1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xa10af0, dataAddr=0xa29e00 ]
Mat [ 1*1*CV_32SC1, dataAddr=0xa29e00]
Mat [1*1*CV_32SC1, isCont=true, isSubmat=false, nativeObj=0xa10e70, dataAddr=0xa292c0 ]
dataAddr=0xa292c0]