zoukankan      html  css  js  c++  java
  • libsvm的数据格式及制作

    1、libsvm数据格式

    libsvm使用的训练数据和检验数据文件格式如下:

     [label] [index1]:[value1] [index2]:[value2] …
    
     [label] [index1]:[value1] [index2]:[value2] …

    label  目标值,就是说class(属于哪一类),就是你要分类的种类,通常是一些整数。

    index 是有顺序的索引,通常是连续的整数。就是指特征编号,必须按照升序排列

    value 就是特征值,用来train的数据,通常是一堆实数组成。

    即:

    目标值   第一维特征编号:第一维特征值   第二维特征编号:第二维特征值 …
    
    目标值   第一维特征编号:第一维特征值   第二维特征编号:第二维特征值 …
    
    ……
    
    目标值   第一维特征编号:第一维特征值   第二维特征编号:第二维特征值 …

    例如:5 1:0.6875 2:0.1875 3:0.015625 4:0.109375

    表示训练用的特征有4维,第一维是0.6875,第二维是0.1875,第三维是0.015625,第四维是0.109375  目标值是5

    注意:训练和测试数据的格式必须相同,都如上所示。测试数据中的目标值是为了计算误差用

    2、libsvm数据格式制作

    该过程可以自己使用excel或者编写程序来完成,也可以使用网络上FormatDataLibsvm.xls来完成。FormatDataLibsvm.xls使用说明:

    a.先将数据按照下列格式存放(注意label放最后面):

    value1 value2 … label
    
    value1 value2 … label
    
    …
    
    value1 value2 … label

    b.然后将以上数据粘贴到FormatDataLibsvm.xls中的最上角单元格,接着工具->宏->执行FormatDataToLibsvm宏。就可以得到libsvm要求的数据格式。

    当然最方便的还是用程序生成,我这里有一个提取指定文件夹内各类样本文件夹内的图片的lbp特征值,并组织成libsvm所需的数据格式,写入txt文件中的程序:

    /*Function:int prepareFeatsData(string samples_path, string outfile, char* class_samples, uchar* char_class, int nclass, string extens)
    Features:
    对指定的样本(数字和字母)的路径下的各个指定的样本文件进行特征提取,
    连同类编号依次存入outfile指定文件中。
    Attention:
    注意_finddata_t结构体和_findfirst函数的用法
    in-parameter:
    samples_path:所有样本归属的文件夹
    outfile:提取特征后写入的文件
    class_samples:各个样本的文件夹标记
    char_class:各样本的类别标记
    nclass:有多少类样本
    extens:样本文件的后缀扩展名(例如:"*.png")
    out-parameter:
    Return    : 处理的样本总数
    Author: Mengjia  Date:2017-1-5 16:05:47
    */
    int prepareFeatsData(string samples_path, string outfile, char* class_samples, uchar* char_class, int nclass, string extens)
    {
        int itatol = 0;
        FILE   *fp;
        fp = fopen(outfile.c_str(), "w+"); //train_samples\train_lbp.txt
        long hFile;//int nn=0;
        for (int nsamp = 0; nsamp < nclass; nsamp++)
        {
            string cur_folder = samples_path;
            cur_folder += '\';
            cur_folder += class_samples[nsamp];//样本的文件夹标记
            cur_folder += '\';
            string findfile = cur_folder;
            findfile += extens;//所要寻找的文件格式全路径
    
            struct _finddata_t img_file;
    
            if ((hFile = _findfirst(findfile.c_str(), &img_file)) == -1L)//"rawdata/*.png"
            {
                printf("no %s files in directory :%s
    ", extens.c_str(), findfile.c_str());
                //printf(findfile.c_str());
            }
            do
            {
                string filename = cur_folder;
                filename += img_file.name;
                IplImage* pImg = cvLoadImage(filename.c_str(), CV_LOAD_IMAGE_UNCHANGED);
                if (pImg)
                {    //nn++;
                    itatol++;
                    IplImage* pBImg = alignmentImg(pImg);
                    IplImage* standarImg = sizeNormalization(pBImg, 32, 64);
                    int scale_flag = SCALE_LBP_FEATURES;
                    CvMat* lbp_feats = LBP_features(standarImg, 8, 8, 4, scale_flag);
    
                    if (scale_flag == SCALE_LBP_FEATURES)
                    {
                        double*pData = (double*)(lbp_feats->data.db);
                        fprintf(fp, "%d ", char_class[nsamp]); //写入样本类别 
    
                        for (int i = 0; i < lbp_feats->cols * lbp_feats->rows; i++)
                        {
                            if (pData[i] != 0.)
                                fprintf(fp, "%d%s%g ", i + 1, ":", pData[i]);   //按格式写入特征
                        }
    
                        fprintf(fp, "	
    ");
                    }
                    else
                    {
                        uchar*pData = (uchar*)(lbp_feats->data.ptr);
                        fprintf(fp, "%d ", char_class[nsamp]); //写入样本类别 
    
                        for (int i = 0; i < lbp_feats->cols * lbp_feats->rows; i++)
                        {
                            if (pData[i] != 0.)
                                fprintf(fp, "%d%s%d ", i + 1, ":", pData[i]);   //按格式写入特征
                        }
    
                        fprintf(fp, "	
    ");
                    }
    
                    cvReleaseMat(&lbp_feats);
                    cvReleaseImage(&pBImg);
                    cvReleaseImage(&standarImg);
                    cvReleaseImage(&pImg);
                }
            } while (_findnext(hFile, &img_file) == 0);
            _findclose(hFile);
        }
        fclose(fp);
        printf("total samples = %d
    ", itatol);
        return itatol;
    }

    以上。

  • 相关阅读:
    暑假第一周总结
    洛谷P3378 【模板】堆 题解 堆(Heap)入门题
    洛谷P2170 选学霸 题解 并查集+01背包
    洛谷P1433 吃奶酪 题解 状态压缩DP
    洛谷P2835 刻录光盘 题解 点的度数+并查集
    洛谷P1991 无线通讯网 题解 并查集+二分答案
    洛谷P4185 [USACO18JAN]MooTube G 题解 并查集
    洛谷P4145 上帝造题的七分钟2 / 花神游历各国 题解 线段树+懒惰标记
    洛谷P2658 汽车拉力比赛 题解 二分答案+搜索
    洛谷P1546 最短网络 Agri-Net 题解 最小生成树/Prim算法
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/6254325.html
Copyright © 2011-2022 走看看