SVM预测它自己的训练数据是错误的

时间:2015-08-10 14:52:52

标签: c++ opencv

我正在使用OpenCV 3及其SVM实现。我想将它用于汽车分类。

我读取每个图像,将其标签添加到矢量,将图像添加到另一个图像,并将其传递给我的函数。

    image =imread("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0066.png",1);
    cv::cvtColor(image, src, CV_BGR2GRAY);
    src.convertTo(src_f, CV_32F, 1.0/255, 0);
    image_classes.push_back("van");
    images.push_back(src_f);    
image =imread
            ("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0085.png",1);
    cv::cvtColor(image, src, CV_BGR2GRAY);
    src.convertTo(src_f, CV_32F, 1.0/255, 0);
    image_classes.push_back("car");
    images.push_back(src_f);

我添加了“汽车”和“面包车”图像。

void trainSVM2(vector<string> &image_classes , vector<Mat> &images)
{
    vector<string> classes_names;
    // finding classes
    {
        set<string> classes_names2;
        for (vector<string>::iterator it = image_classes.begin(); it != image_classes.end(); ++it)
            classes_names2.insert((*it));
        for (set<string>::iterator it = classes_names2.begin(); it != classes_names2.end(); ++it)
            classes_names.push_back((*it));
        classes_names2.clear();
        //        for(int i=0;i<classes_names.size() ; i++)
        //            cout << classes_names[i]<< endl;
    }
    ////////////////////////////////////
    for (int i=0;i<classes_names.size();i++)
    {
        string class_ =classes_names[i] ;
        cout <<"--------------" <<  class_<<"-------------" << endl;
        Mat& one_class = (*(images.begin()));
        Mat labels(0,1,CV_32SC1);
        Mat training_mat(0,one_class.rows*one_class.cols,CV_32FC1);
        vector<Mat>::iterator it2 = images.begin();
        for (vector<string>::iterator it1 = image_classes.begin();
             it1 != image_classes.end(); ++it1,++it2)
        {
            string not_class_ = (*it1);
            training_mat.push_back((*it2).reshape(1,1));
            if(not_class_.compare(class_)==0)
                labels.push_back(1);
            else
                labels.push_back(2);
        }

        Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
        Ptr<cv::ml::TrainData> train_Data = cv::ml::TrainData::create
                (training_mat,cv::ml::ROW_SAMPLE,labels);
        classifier->train(train_Data);
        string toSave=class_+"_toSave.yml";
        classifier->save(toSave);
    }

在训练汽车时,我将汽车的标签1添加到标签矢量,将2添加为非汽车图像......在此功能终止后,我将有一个名为class_cars.yml的文件,并且在预测中我加载了SVM它

void predict()
{
    Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
    classifier=StatModel::load<cv::ml::SVM>("car_toSave.yml");
    Mat forPredict =imread
//                        ("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0066.png",1);
            ("/home/mehrzad/samples/car.png",1);
    cv::cvtColor(forPredict, forPredict, CV_BGR2GRAY);
    forPredict.convertTo(forPredict, CV_32F, 1.0/255, 0);
    Mat result;
    classifier->predict(forPredict.reshape(1,1),result);
    waitKey(0);
    cout << "---------------------------\nresult is :" <<result;
}

通过向训练数据添加新图像,预测变化的结果以及每个图像在1和2之间的变化,会发生什么。为什么? 训练或预测中哪些不正确?

0 个答案:

没有答案