• HOG+SVM+INRIAPerson数据集代码


    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/ml/ml.hpp>
    //#include <opencv2/gpu/gpu.hpp>
    #include <fstream>
    #include <iomanip>
    
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/objdetect/objdetect.hpp"
    
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    #if 0
        Mat image;
        image = imread("D:\dataset\temp\6.png");
        HOGDescriptor hog;
        vector<float> v_feature;
        hog.compute(image, v_feature, cv::Size(8, 8));
        //hog.compute(image, v_feature, cv::Size(16, 16));
    
        int featureVecSize = v_feature.size();
        cout << "****************************************haha****************" << endl;
        cout << featureVecSize<<endl;
    #else
        //***************************************************************************************************
        //                                           初始化    
        //***************************************************************************************************
    
        //char positivePath[256] = "D:\dataset\INRIAPerson\Train\pos\";
        //char negativePath[256] = "D:\dataset\INRIAPerson\Train\neg\";
        //char testPath[256] = "D:\dataset\INRIAPerson\Test\pos\";
        char positivePath[256] = "D:\dataset\INRIAPerson\train_64x128_H96\pos\";
        char negativePath[256] = "D:\dataset\INRIAPerson\train_64x128_H96\neg\";
        char testPath[256] = "D:\dataset\INRIAPerson\test_64x128_H96\pos\";
        char classifierSavePath[256] = "D:\dataset\INRIAPerson\myResult";
    
        int positiveSampleCount = 614;
        int negativeSampleCount = 1218;
        //int positiveSampleCount = 100;
        //int negativeSampleCount = 100;
    
        int totalSampleCount = positiveSampleCount + negativeSampleCount;
        int testSampleCount = 288;
    
    
        CvMat *sampleFeaturesMat = cvCreateMat(totalSampleCount, 94500, CV_32FC1);             //参数1764?
        cvSetZero(sampleFeaturesMat);
        CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1);//样本标识    
        cvSetZero(sampleLabelMat);
    
        //CvMat *testFeaturesMat = cvCreateMat(testSampleCount, 94500, CV_32FC1);             //参数1764?    正288,负453
        CvMat *testFeaturesMat = cvCreateMat(1, 94500, CV_32FC1);             //参数1764?    正288,负453
        cvSetZero(testFeaturesMat);
        CvMat *testLabelMat = cvCreateMat(testSampleCount, 1, CV_32FC1);//样本标识    
        cvSetZero(testLabelMat);
        //float testLabelMat[288] = {0};
        //Mat sampleFeaturesMat();
    
        
        //***************************************************************************************************
        //                                       正例的特征
        //***************************************************************************************************
        //positive文件读入
        //ifstream fin(positivePath, ios::in);
        //if (!fin)
        //{
        //    cout << "positivePath can not open the file!" << endl;
        //    return -1;
        //}
        char positiveImage[256];
        string path;
        string s_positiveImage;
        for (int i = 0; i < positiveSampleCount; i++)
        {
            //图片名修改
            memset(positiveImage, '', sizeof(positiveImage));
            sprintf(positiveImage, "%d.png", i+1);                              //要改成.jpg吗
            s_positiveImage = positiveImage;
            path = positivePath + s_positiveImage;
    
            Mat image = imread(path);
            if (image.data == NULL)
            {
                cout << "positive image sample load error: " << i << " " << path << endl;
                system("pause");
                continue;
            }
            //hog特征提取
            //gpu::HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);    //貌似还有一些参数,重载了?
            //HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);
            HOGDescriptor hog;
            vector<float> v_feature;
            hog.compute(image, v_feature, cv::Size(8, 8));
            //hog.compute(image, v_feature, cv::Size(16, 16));
    
            int featureVecSize = v_feature.size();
            //cout << "****************************************haha****************" << endl;
            //cout << featureVecSize<<endl;
            //return 0;
            for (int j = 0; j<featureVecSize; j++)
            {
                //sampleFeaturesMat[i][j] = v_feature[j];
                CV_MAT_ELEM(*sampleFeaturesMat, float, i, j) = v_feature[j];                    //CV_MAT_ELEM什么意思
            }
            sampleLabelMat->data.fl[i] = 1;                                                     //.fl[]是什么
            cout << "positive" << i + 1 << "is running..." << endl;
        }
        //fclose(fin);
        //***************************************************************************************************
        //                                       负例的特征
        //***************************************************************************************************
        //negative文件读入
        //ifstream fin(negativePath, ios::in);
        //if (!fin)
        //{
        //    cout << "can not open the file!" << endl;
        //    return -1;
        //}
        char negativeImage[256] = "";                                    //初始化吗
        string s_negativeImage;
        for (int i = 0; i < negativeSampleCount; i++)
        {
            //图片名修改
            //hog特征提取
            memset(negativeImage, '', sizeof(negativeImage));
            sprintf(negativeImage, "%d.png", i+1);                              //要改成.jpg吗
            s_negativeImage = negativeImage;
            path = negativePath + s_negativeImage;
            //cout << "********************************************************"<<endl;
            //cout << path<<endl;
            Mat image = imread(path);
            if (image.data == NULL)
            {
                cout << "positive image sample load error: " << i << " " << path << endl;
                system("pause");
                continue;
            }
            //hog特征提取
            //gpu::HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);    //貌似还有一些参数,重载了?
            //HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);
            HOGDescriptor hog;
            vector<float> v_feature;
            hog.compute(image, v_feature, cv::Size(8, 8));
    
            int featureVecSize = v_feature.size();
            //cout << "***************************lalala*****************************" << endl;
            //cout << featureVecSize;
    
            for (int j = 0; j<featureVecSize; j++)
            {
                CV_MAT_ELEM(*sampleFeaturesMat, float, positiveSampleCount +i, j) = v_feature[j];                    //CV_MAT_ELEM什么意思
            }
            sampleLabelMat->data.fl[positiveSampleCount +i] = 0;                                                     //.fl[]是什么
            cout << "negative" << i + 1 << "is running..." << endl;
        }
    
        //**********************************************************************************************
        //                                         Linear SVM训练
        //**********************************************************************************************
        //设置参数
        CvSVMParams params;
        params.svm_type = SVM::C_SVC;
        params.C = 0.01;
        params.kernel_type = SVM::LINEAR;
        //params.term_crit = TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);
        params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, FLT_EPSILON);
    
    
        //训练
        cout << "Starting training process" << endl;
        CvSVM svm;
        svm.train(sampleFeaturesMat, sampleLabelMat, Mat(), Mat(), params);
        cout << "Finished training process" << endl;
        //**********************************************************************************************
        //                                            结果保存
        //**********************************************************************************************
        //classifierSavePath文件读入
        //ifstream fin(classifierSavePath, ios::in);
        //if (!fin)
        //{
        //    cout << "positivePath can not open the file!" << endl;
        //    return -1;
        //}
        //svm.save(classifierSavePath);
        //cvReleaseMat(&sampleFeaturesMat);
        //cvReleaseMat(&sampleLabelMat);
        //cout << "has saved succeeded! " << endl;
    
        //**********************************************************************************************
        //                                          测试
        //**********************************************************************************************
        //test文件读入
        //ifstream fin(testPath, ios::in);
        //if (!fin)
        //{
        //    cout << "can not open the file!" << endl;
        //    return -1;
        //}
        char testImage[256] = "";                                    //初始化吗
        string s_testImage;
        for (int i = 0; i < testSampleCount; i++)
        {
            //图片名修改
            //hog特征提取
            memset(testImage, '', sizeof(testImage));
            sprintf(testImage, "%d.png", i+1);                              //要改成.jpg吗
            s_testImage = testImage;
            path = testPath + s_testImage;
    
            Mat image = imread(path);
            if (image.data == NULL)
            {
                cout << "positive image sample load error: " << i << " " << path << endl;
                system("pause");
                continue;
            }
            //hog特征提取
            //gpu::HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);    //貌似还有一些参数,重载了?
            //HOGDescriptor hog(Size(64, 64), Size(16, 16), Size(8, 8), Size(8, 8), 9);
            HOGDescriptor hog;
            vector<float> v_feature;
            hog.compute(image, v_feature, cv::Size(8, 8));
    
            int featureVecSize = v_feature.size();
            //cout << "***************************lalala*****************************" << endl;
            //cout << featureVecSize;
            for (int j = 0; j<featureVecSize; j++)
            {
                //CV_MAT_ELEM(*testFeaturesMat, float, i, j) = v_feature[j];                    //CV_MAT_ELEM什么意思
                CV_MAT_ELEM(*testFeaturesMat, float, 0, j) = v_feature[j];                    //CV_MAT_ELEM什么意思
            }
            float response = svm.predict(testFeaturesMat);
            testLabelMat->data.fl[i] = response;                                                     //.fl[]是什么
            //testLabelMat[i] = response;
        }
        float right = 0;
        for (int i = 0; i < testSampleCount; i++)
        {
            if (testLabelMat->data.fl[i] == 1)
            //if (testLabelMat[i] == 1)
            {
                right++;
            }
        }
        float radio = right / testSampleCount;
        cout << "the radio of the train is:" << radio << endl;
    #endif
        return 0;
    }
  • 相关阅读:
    Python之格式化unix时间戳
    Python简单的验证码生成
    Python字符串常用的一些东西
    PHP explode()函数
    PHP函数number_format()
    PHP简单的计算位数的函数
    python之列表推导式
    python之把列表当做队列使用
    python之列表操作的几个函数
    python之map函数
  • 原文地址:https://www.cnblogs.com/Wanggcong/p/4779213.html
Copyright © 2020-2023  润新知