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\\
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);fprintf格式
_findclose(hFile);
}
fclose(fp);
printf("total samples = %d\n", itatol);
return itatol;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。