Ask Your Question

DoryeongPark's profile - activity

2020-07-02 05:59:19 -0600 received badge  Popular Question (source)
2017-03-01 21:53:00 -0600 received badge  Enthusiast
2017-02-17 04:12:41 -0600 commented answer Is anyone using "ONE CLASS SVM"?

And I just wanna figure out why my code can't classify images

2017-02-17 03:32:38 -0600 received badge  Supporter (source)
2017-02-17 03:32:31 -0600 received badge  Scholar (source)
2017-02-17 03:32:09 -0600 commented answer Is anyone using "ONE CLASS SVM"?

Thank you for your nice comment. :) But how about result with images? If you are OK, I can send you images I tested by email.

2017-02-17 02:08:20 -0600 received badge  Editor (source)
2017-02-17 00:58:32 -0600 asked a question Is anyone using "ONE CLASS SVM"?

I'm new at dealing with SVM and i created successfully multi0class svm examples. I have tried many times to implement ONE-CLASS SVM, but it always returns zero. I have all labels of sample filled with 1, though one class svm seems that it doesn't need to label samples. If there is complete example using one class svm, could you refer the link?

Here's my code

#include<iostream>
#include<vector>
#include<fstream>

#include<opencv2\core.hpp>
#include<opencv2\imgproc.hpp>
#include<opencv2\highgui.hpp>
#include<opencv2\xfeatures2d.hpp>
#include<opencv2\ml.hpp>

using namespace std;
using namespace cv;
using namespace xfeatures2d;
using namespace ml;

void main() {

    Mat groups;
    Mat samples;
    vector<KeyPoint> keypoints1;

    //ORB Detector
    Ptr<ORB> detector = ORB::create(20, 1.2f, 2, 31, 0, 2, ORB::HARRIS_SCORE, 31);

    Mat descriptors1, descriptors2;

    Ptr<SURF> extractor = SURF::create();

    //Sample of similar images
    for (int i = 1; i <= 40; ++i) {
        stringstream nn;
        nn << "models/" << i << ".png";

        Mat img = imread(nn.str());
        cvtColor(img, img, COLOR_BGR2GRAY);

        detector->detect(img, keypoints1);

        extractor->compute(img, keypoints1, descriptors1);

        samples.push_back(descriptors1.reshape(1, 1));
        keypoints1.clear();
    }

    for (int j = 1; j <= 40; ++j) {
        groups.push_back(1);
    }

    Ptr<SVM> classifierSVM = SVM::create();

    ifstream existence("trainingData.yml");

    if (existence.good()) {
        classifierSVM = Algorithm::load<SVM>("trainingData.yml");
    }
    else {
        classifierSVM->setType(SVM::ONE_CLASS);
        classifierSVM->setKernel(SVM::LINEAR);
        classifierSVM->setDegree(3);
        classifierSVM->setGamma(1);
        classifierSVM->setCoef0(0);
        classifierSVM->setC(1);
        classifierSVM->setNu(0.5);
        classifierSVM->setP(0);
        classifierSVM->setTermCriteria(cvTermCriteria(CV_TERMCRIT_ITER,
                                                     500, FLT_EPSILON));

        classifierSVM->train(samples, ml::ROW_SAMPLE, groups);
        classifierSVM->save("trainingData.yml");
    }

    //Test for 10 image sample - 7 & 9 must be classified.
    for (int i = 1; i <= 10; ++i) {
        stringstream nn;

        nn << "testers/" << "unknown" << i << ".png";

        Mat unknown = imread(nn.str());
        cvtColor(unknown, unknown, COLOR_BGR2GRAY);

        detector->detect(unknown, keypoints1);

        extractor->compute(unknown, keypoints1, descriptors2);

        float result = classifierSVM->predict(descriptors2.reshape(1, 1));

        cout << nn.str() << ": class " << result << endl;
    }

    waitKey(10);

}