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\n", 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, "\t\n");
                }
                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, "\t\n");
                }

                cvReleaseMat(&lbp_feats);
                cvReleaseImage(&pBImg);
                cvReleaseImage(&standarImg);
                cvReleaseImage(&pImg);
            }
        } while (_findnext(hFile, &img_file) == 0);
        _findclose(hFile);
    }
    fclose(fp);
    printf("total samples = %d\n", itatol);
    return itatol;
}

 

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM