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;
}
原文地址:https://www.cnblogs.com/Wanggcong/p/4779213.html