Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVM issues #41

Open
GoogleCodeExporter opened this issue Jul 1, 2015 · 3 comments
Open

SVM issues #41

GoogleCodeExporter opened this issue Jul 1, 2015 · 3 comments

Comments

@GoogleCodeExporter
Copy link

What steps will reproduce the problem?
1.Try to replicate the C++ SVM example in pyopencv
2. Refactor C++ example to match PyOpenCV syntax
(See attached file, and code with notes at bottom)

What is the expected output? What do you see instead?
A match to the class '10', i.e. a matrix with the correct prediction(s)

What version of the product are you using? On what operating system?
Opencv2.1 on Ubuntu (Maverick).

Please provide any additional information below.

Below is the code example.  There really aren't enough tutorials for PyOpencv.  
Syntactic changes from the python library to the pyopen can be confusing.  If 
you wanted help creating a tutorial to aid the transition for some users, i 
would love to help out.

from pyopencv import *

if __name__ == "__main__":
    value=1  #Value starts at 1

    train_update = False #Set training parameters
    train_sample_count = 100
    train_sample_size = 10
        #Create the matrices for class and data.
    class_mat = Mat(train_sample_count, 1, CV_32FC1);
    data_mat= Mat(train_sample_count, train_sample_size, CV_32FC1);
    i=0
    j=0
    val=1
        #Add values to the class mat, and fill the data with the same values
    while i<train_sample_count:
        class_mat[i] = value
        while j<train_sample_size:
            data_mat[i*train_sample_size+ j] = val
            j+=1
        val+=1
        value+=1
        i+=1
        #Create a param model for the SVM
    x=CvSVMParams
    x.svm_type = 104;
    x.kernel_type = 2;
    x.gamma = 1./train_sample_size;
    x.nu = 0.5;
    x.C = 8;
    #Term criteria in C++ has child parameters (epsilon/count etc)
    x.term_crit =TermCriteria(1,50,0.001)
        #Changed to suit python TermCriteria format
        #Create the training SVM
    tSvm = CvSVM()
    tSvm.train(data_mat, class_mat, 0, 0, x);
    tSvm.save("filename.xml", 0);

    #Create predictive SVM which will classify the value '1' (val)
    val = 1
    pSvm = CvSVM();
    pSvm.load("filename.xml", 0);
        #Create Sample Matrix
    sample = Mat((1, train_sample_size), CV_32FC1);
    while i<train_sample_size:
        sample[i] = val
    pred = pSvm.predict(sample);
    print("\n %.3f", pred);

Original issue reported on code.google.com by john.mrd...@googlemail.com on 8 Mar 2011 at 12:36

Attachments:

@GoogleCodeExporter
Copy link
Author

The error produced from this is......

Traceback (most recent call last):
  File "svm2.py", line 31, in <module>
    tSvm.train(data_mat, class_mat, 0, 0, x);
Boost.Python.ArgumentError: Python argument types in
    CvSVM.train(CvSVM, Mat, Mat, int, int, Boost.Python.class)
did not match C++ signature:
    train(CvSVM_wrapper {lvalue}, cv::Mat _train_data, cv::Mat _responses, cv::Mat _var_idx=Mat(), cv::Mat _sample_idx=Mat(), CvSVMParams _params=<pyopencv.ml_ext.CvSVMParams object at 0x12033f0>)
    train(CvSVM {lvalue}, cv::Mat _train_data, cv::Mat _responses, cv::Mat _var_idx=Mat(), cv::Mat _sample_idx=Mat(), CvSVMParams _params=<pyopencv.ml_ext.CvSVMParams object at 0x12033f0>)
    train(CvSVM {lvalue} inst, cv::Mat {lvalue} _train_data, cv::Mat {lvalue} _responses, cv::Mat _var_idx=Mat(), cv::Mat _sample_idx=Mat(), CvSVMParams _params=<pyopencv.ml_ext.CvSVMParams object at 0x1203190>)

Original comment by john.mrd...@googlemail.com on 8 Mar 2011 at 12:37

@GoogleCodeExporter
Copy link
Author

[deleted comment]

@GoogleCodeExporter
Copy link
Author

Changing the CvSVMParams line to....

x=CvSVMParams()

Circumvents this issue.

In the C++ example each value of the Term Criteria is set independently as an 
attribute of the CvSVMParams.


However the attribute for epsilon etc, aren't attributes in Pyopencv?

This code produces this error.

Produces the error......

File "svm2.py", line 29, in <module>
    x.term_crit =TermCriteria(1,50,0.001)
AttributeError: can't set attribute

Are the values supposed to be passed to the SVM upon instantiation? Or does the 
CvSVMParams class need to be configured first?

Kind regards,

Daniel

Original comment by john.mrd...@googlemail.com on 8 Mar 2011 at 1:31

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant