Training the SVM with positive and negative pictures

asked 2015-12-08 07:42:19 -0600

kaushikmit gravatar image

updated 2015-12-08 11:53:37 -0600

I was following this code.

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <iostream>
#include <vector>
#include<string.h>
using namespace std;
using namespace cv;

int main ( int argc, char** argv )
{
    cout << "OpenCV Training SVM Automatic Number Plate Recognition\n";
    cout << "\n";

    char* path_Plates;
    char* path_NoPlates;
    int numPlates;
    int numNoPlates;
    int imageWidth=150;
    int imageHeight=150;

    //Check if user specify image to process
    if(1)
    {
        numPlates= 11;
        numNoPlates= 90 ;
        path_Plates= "/home/kaushik/opencv_work/Manas6/Pics/Positive_Images/";
        path_NoPlates= "/home/kaushik/opencv_work/Manas6/Pics/Negative_Images/i";

    }else{
        cout << "Usage:\n" << argv[0] << " <num Plate Files> <num Non Plate Files> <path to plate folder files> <path to non plate files> \n";
        return 0;
    }

    Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1);
    Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1 );

    Mat trainingImages;
    vector<int> trainingLabels;

    for(int i=1; i<= numPlates; i++)
    {

        stringstream ss(stringstream::in | stringstream::out);
        ss<<path_Plates<<i<<".jpg";
        try{

            const char* a = ss.str().c_str();
            printf("\n%s\n",a);
            Mat img = imread(ss.str(), CV_LOAD_IMAGE_UNCHANGED);
            img= img.clone().reshape(1, 1);
            //imshow("Window",img);
            //cout<<ss.str();
            trainingImages.push_back(img);
            trainingLabels.push_back(1);
        }
        catch(Exception e){;}
    }

    for(int i=0; i< numNoPlates; i++)
    {
        stringstream ss(stringstream::in | stringstream::out);
        ss << path_NoPlates<<i << ".jpg";
        try
        {
            const char* a = ss.str().c_str();
            printf("\n%s\n",a);
            Mat img=imread(ss.str(), 0);
            //imshow("Win",img);
            img= img.clone().reshape(1, 1);
            trainingImages.push_back(img);
            trainingLabels.push_back(0);
            //cout<<ss.str();
        }
        catch(Exception e){;}
    }

    Mat(trainingImages).copyTo(trainingData);
    //trainingData = trainingData.reshape(1,trainingData.rows);
    trainingData.convertTo(trainingData, CV_32FC1);
    Mat(trainingLabels).copyTo(classes);

    FileStorage fs("SVM.xml", FileStorage::WRITE);
    fs << "TrainingData" << trainingData;
    fs << "classes" << classes;
    fs.release();

    return 0;
}

I am getting error in pushback() function.The error is as followes I want to know the reason for this error. Size of input arguments do not match in push_back(), /-/-/src/matrix.cpp line821

UPDATE

I have edited the code a bit. Now both positive and negative images are 150*150. The problem is out the two for loops(one for positive and one for negative) only one of them is runnung corrctly. The forloop involving negative images is runnung without error only when i comment out the first for loop.

Can anyone please help with this. PS. all images pos and neg are of same size and format

edit retag flag offensive close merge delete

Comments

1

are you sure, all of your images have the same size ? (they need to be.)

berak gravatar imageberak ( 2015-12-08 07:45:24 -0600 )edit
1

also please do not use outdated c-api headers, like cv.h or cvaux.h

berak gravatar imageberak ( 2015-12-08 07:46:26 -0600 )edit

I have all the images of 150*150. I don't have any problem for positive images. I am getting error for negative images.

Also can this be the reason that I had all the negative images in a different format(bmp) and all the positive images in jpg?

kaushikmit gravatar imagekaushikmit ( 2015-12-08 10:33:05 -0600 )edit

size matters (all positives and negatives need to be the same), not the format

berak gravatar imageberak ( 2015-12-08 10:45:56 -0600 )edit
2

oh, wait, you're converting the negatives to grayscale (imread(path, 0)), but your positives are in color (imread(path,-1))

berak gravatar imageberak ( 2015-12-08 12:05:25 -0600 )edit
2

You're reading positives as color images and negatives as grayscale. So, at the end sizes are not equal

LorenaGdL gravatar imageLorenaGdL ( 2015-12-08 12:06:40 -0600 )edit
1

Thanx Berak I didnot notice that. It's a very silly mistake Now it is rectified

kaushikmit gravatar imagekaushikmit ( 2015-12-08 12:16:29 -0600 )edit
1

don't feel bad !

see, it took a long time for both of LorenaGdl and me to spot it...

is it kinda "solved" now ?

berak gravatar imageberak ( 2015-12-08 12:18:32 -0600 )edit