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;
    }

    以上。

  • 相关阅读:
    流处理 —— Spark Streaming中的Window操作
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.8 提供带注解的限定符元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.7 为自动检测组件提供作用域
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.6 给自动检测组件命名
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.5 在组件中定义bean的元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.4 使用过滤器自定义扫描
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.3 自动检测类和注册bean的定义
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.2 元注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.1 @Component和深层的构造型注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10 类路径扫描和被管理的组件
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/6254325.html
Copyright © 2011-2022 走看看