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; }
以上。