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; }
以上。
それでも私の大好きな人