资源描述
基于多分类支持向量机的图像分割数据分析汇报
1 数据集来源及理解
这里的数据集来源于麻省大学的一种视觉小组,并由由其中的Carla Brodley奉献给UCI数据集。用于训练的实例源于一种包具有7个户外图像的数据库的随机采样成果,这些图像中的各个部分已被手工分类,从而可以创立一种分类器来给其他图像的不一样区域进行分类。
每一种样本实例都由原始图像上某个取样点所在的3x3邻域的RGB值获得,并根据一系列的分析,可得到如下属性:
1. 中心点横坐标(region-centroid-col):取样中心点所在的图像的横坐标;
2. 中心点纵坐标(region-centroid-row):取样中心点所在的图像的纵坐标;
3. 每个样本所含点的数量(region-pixel-count):为9;
4. 低密集度计数(short-line-density-5)指在通过这个区域的在任意方向上的,长度为5的线段当中,有多少条对比度大小要低于或等于5;
5. 高密集度计数(short-line-density-2)指在通过这个区域的在任意方向上的,长度为5的线段当中,有多少条对比度大小要高于5;
6. 横向像素差值的平均(vedge-mean):指在3x3的样本中,所有的左右相邻的两像素亮度之差的绝对值(共有6个)的平均数;
7. 横向像素差值的原则差(vedge-sd):上述像素差值的原则差;
8. 纵向像素差值的平均(hedge-mean):指在3x3的样本中,所有的上下相邻的两像素亮度之差的绝对值(共有6个)的平均数;
9. 纵向像素差值的原则差(hedge-sd):上述像素差值的原则差;
10. 整体亮度的平均数(intensity-mean):亮度按(R + G + B)/3计算(上同),再根据9个点的这些亮度取平均数
11. 红分量平均(rawred-mean):整个样本区域的红分量的平均值
12. 蓝分量平均(rawblue-mean):整个样本区域的绿分量的平均值
13. 绿分量平均(rawgreen-mean):整个样本区域的lan分量的平均值
14. 红色超过量(exred-mean):测量红色多于其他颜色分量的程度,按(2R - (G + B))的公式计算
15. 蓝色超过量(exblue-mean):测量蓝色多于其他颜色分量的程度,按(2B - (G + R))(的公式计算
16. 绿色超过量(exgreen-mean):测量绿色多于其他颜色分量的程度,按(2G - (R + B))的公式计算
17. HSV空间中的V值平均(value-mean):从RGB到HSV颜色空间的转换是一种三维的非线性转换,这个算法可以在交互式计算机图形学基础教材《Foley and VanDam》中找到。
18. HSV空间中的S值平均(satue-mean)
19. HSV空间中的H值平均(hue-mean)
此外,在这个数据集当中,一种图像的各个部分被提成了7种类别,包括了砖块表面(BRICKFACE),天空(SKY),树叶(FOLIAGE),水泥(CEMENT),窗户(WINDOW),小路(PATH),以及草地(GRASS)。在这些数据集当中,每个类别均提供了30个训练数据和300个测试数据,这两个数据集分别按csv(逗号分隔)的格式储存在segmentation.data和segmentation.test中,此外尚有一种文献segmentation.names储存了这个数据集的阐明。
2 措施与思绪
2.1 措施理解与简介
LIBSVM是台湾大学林智仁(Lin Chih-Jen)副专家等开发设计的一种简朴、易用和迅速有效的SVM模式识别与回归的软件包,不仅提供了编译好的可在Windows系列系统的执行文献,并且提供了源代码,以便改善、修改以及在其他操作系统上应用;该软件对SVM所波及的参数调整相对比较少,提供了诸多的默认参数,并提供了交互检查(Cross Validation)的功能。运用这些参数和功能可以处理诸多有关分类与回归的问题,包括C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,也包括了包括基于一对一算法的多类模式识别的问题。
LIBSVM 使用的一般环节是:
1) 准备训练的数据集,包括每个样本的维数l,每个样本的属性集x,以及每个样本的对应分类编号y;
2) 对数据进行简朴的缩放和平移操作来实现数据的归一化;
3) 考虑选用核函数,包括线性核,RGF核,多项式核,sigmoid核等;
4) 采用交叉验证选择最佳损失参数C与最合适的gamma系数 ;
5) 采用最佳参数C与gamma系数 对整个训练集进行训练获取支持向量机模型;
6) 运用获取的模型进行测试。
LibSVM是以源代码和可执行文献两种方式给出的。假如是Windows系列操作系统,可以直接使用软件包提供的程序,也可以进行修改编译。
使用软件包提供的程序时,该软件使用的训练数据和检查数据文献格式如下:
<label> <index1>:<value1> <index2>:<value2> ...
其中<label> 是训练数据集的目的值,对于分类,它是标识某类的整数(支持多种类);对于回归,是任意实数。<index> 是以1开始的整数,可以是不持续的;<value>;为实数,也就是我们常说的自变量。检查数据文献中的label只用于计算精确度或误差,假如它是未知的,只需用一种数填写这一栏,也可以空着不填。
使用源代码进行编译时,对于用于训练的数据集,需要按如下的格式进行填写:
用于训练的数据集被定义为
struct svm_problem
{
int l;
double *y;
struct svm_node **x;
};
其中l表达样本的数量,y表达每个样本对应的分类ID值的集合,x代表每个样本每个维的属性集合的索引(每个样本首个节点的内存地址),而这个属性集合需要额外创立,令维数为n,则这个属性的集合的长度为l*(n+1)。
对于用来测试的数据集,需要一种长度为(n+1)的struct svm_node数组,这里的svm_node被定义为:
struct svm_node
{
int index;
double value;
};
其中的value表达的是节点的值,index表达目前样本的属性节点的编号(从1开始,单调递增),每个样本的节点在每个维均赋值完毕后,需要紧接着额外地加入一种index值为-1,value可以不设置的节点。这也是每个维度为n的样本的属性需要定义(n+1)个节点的原因。
对于训练的参数而言,在struct svm_parameter的定义中,kernel_type(核函数类型),gamma(RBF核的gamma系数),和c(损失系数),是常常要设置的参数,其他的参照照svm-toy.cpp中给出的默认值进行赋值即可。
kernel_type的属性一览表:
0 – 线性:u'v
1 – 多项式:(r*u'v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
svm_type的属性一览表:
0 -- C-SVC
1 --v-SVC
2 – 一类SVM
3 -- e -SVR
4 -- v-SVR
本程序用的是C-SVC
2.2 详细分析措施和流程
程序运行的流程图如下图所示:
在训练数据集当中可以看出(参见转换格式后的电子表格文档segmentation.data. xls),训练的数据里的B、C两列为取样区域中心点的坐标,不能作为训练的列来使用,D列(REGION-PIXEL-COUNT)恒为9,E(SHORT-LINE-DENSITY-5)和F(SHORT-LINE-DENSITY-2)列中的非零数的个数很少,也不能用于训练分类器。因此,只能用之后的最多为14个列作为分类器来使用,为了测试以便,可以让测试者自己在这14个列当中选择合适地列进行训练。如下图所示:
图上的上半部分的14个复选框可用于设置哪些类可以参与训练,下半部分可以设置Gamma值与损失系数c,右方两个的复选框用来设置与否使用RBF核(否则用线性核),以及与否对数据进行按最大值和最小值进行归一化处理。
在segmentation.data.xls中,G-R列的最大值都没有超过151,而目前的rgb值一般取0-255。为了量化的统一,需要在读取到原始数据数组rawData时将这12个列乘以系数(256.0/151.0),否则不能用于完整的户外图像的测试操作。此外,第一列需要改写成类别的ID,这里按出现次序分别赋了1-7这几种整数,其他的列按原样写到rawData中。
随即需要根据每列的最大值和最小值进行进行对rawData的归一化,由于归一化的运算属于线性运算,为此可以此外定义一种数组columnScale,长度为segmentation.data. xls的列数的两倍,用来储存其中每列的的缩放系数和平移系数,在构建svm属性的svm_note数据集时再进行这项运算。
归一化的代码如下:
//获得归一化数据
int probRowCount=rawData.GetSize()/20;
double minValue=0.0;
double maxValue=0.0;
for(i=0;i<20;i++){
if(!willCalculateColumns[i]){
continue;
}
if(!willScale){
columnScale[2*i]=1.0;
columnScale[2*i]=0.0;
continue;
}
minValue=rawData[i];
maxValue=rawData[i];
for(j=1;j<probRowCount;j++){
if(minValue>rawData[j*20+i]){
minValue=rawData[j*20+i];
}
if(maxValue<rawData[j*20+i]){
maxValue=rawData[j*20+i];
}
}
if(minValue!=maxValue){
columnScale[2*i]=1.0/(maxValue-minValue);
columnScale[2*i+1]=-minValue*columnScale[2*i];
}else{
columnScale[2*i]=0.0;
columnScale[2*i+1]=0.5;
}
}
进行测试时,也同步需要归一化的数据,并且每列的线性运算必须相似。为此,可以先定义一种原始的数组vx,长度为segmentation.data. xls的列数,然后再在写入svm_node节点时进行归一化操作,将vx用来测试的代码如下:
void CTest1View::predict(double (&vx)[20]){
//从向量开始算出预测值
if(model==NULL){
return;
}
int probColumnCount=0;//svm训练数据集的维数
int i=0,j=0;
for(i=1;i<20;i++){
if(willCalculateColumns[i]){
probColumnCount++;
}
}
struct svm_node *nx=new struct svm_node[probColumnCount+1];//筛选过的向量
j=0;
for(i=1;i<20 && j<probColumnCount;i++){
if(willCalculateColumns[i]){
nx[j].index=j+1;
nx[j].value=columnScale[2*i]*vx[i]+columnScale[2*i+1];
j++;
}
}
nx[j].index=-1;
//nx[j].value=0;
double predictValue=svm_predict(model,nx);
vx[0]=predictValue;
delete[] nx;
}
对于完整的真彩色bmp图片,在计算的过程中,需要从非边缘中的所有点的3x3邻域内进行多种属性的运算,详细代码在segment函数中,输出的成果按不一样的颜色显示在第二张图中。
3 试验及分析
3.1 试验环境
3.1.1 硬件环境
电脑型号:戴尔 Inspiron N4050 笔记本电脑
处理器:英特尔 第二代酷睿 i3-2350M @ 2.30GHz 双核
主板:戴尔 02JCHC (英特尔 HM67 芯片组)
内存:4 GB ( 三星 DDR3 1333MHz / 昱联 DDR3 1333MHz )
主硬盘:西数 WDC WD10JPVX-75JC3T0 ( 1 TB / 5400 转/分 )
显卡:英特尔 HD Graphics Family ( 1809 MB / 戴尔 )
显示屏:友达 AUO183C ( 14 英寸 )
光驱:东芝-三星 DVD+-RW SN-208BB DVD刻录机
声卡:IDT @ 英特尔 6 Series Chipset 高保真音频
网卡:瑞昱 RTL8105E Family PCI-E FE NIC / 戴尔
3.1.2 软件环境
操作系统:Windows 7 旗舰版 64位 SP1 ( DirectX 11 )
libSVM版本:libSVM 3.1.7
开发工具:Ms Visual C++ 6.0简体中文企业版
开发工具版权:1994-98 Microsoft Corporation
开发工具汉化者:swordxy(辛玉强),WuZuWu(吴祖武)
3.2 试验成果与分析
3.2.1 软件的使用措施
打开程序目录test1下的debug或release文献夹,在这个文献夹中,test1.exe是程序的主文献。exe所在目录下segmentation.data按csv(逗号分隔)的格式储存了训练数据,segmentation.test也按csv的格式储存了测试数据,此外的segmentation.names储存了这个数据集的阐明。
运行test1.exe,先点击文献菜单下的“训练样本”项,在对话框的上方选择需要训练的属性,下方设置的选项包括了gamma值和损失系数c,尚有核函数是线性核还是RBF核,以及与否进行原始数据的归一化。点击“确定”按钮后会生成model result.txt来输出训练的模型。
然后点击文献菜单下的“测试成果”项,根据segmentation.test进行测试,判断程序预测的成果与否与segmentation.test中的成果一致,并弹出对应对话框显示对的率,详细的运行成果保留到了segmentation.out文献中,用来依次显示预测的成果。
点击文献菜单下的“打开图片”项可以进行实际的bmp图像分割,注意图像不能太大。第一张图为原图,预测的成果按不一样的颜色显示在第二张图中,详细的颜色图例为:红:砖;靛蓝:天空;绿:树叶;灰:水泥;蓝:窗户;紫:小路;黄:草地。
再次点击文献菜单下的“训练样本”命令可以重新对分类器进行训练,从而可以获得不一样的预测值。
3.2.2 测试数据集的测试成果分析
如下图所展示,默认选择这些列和参数进行分类器的训练。
训练成果:默认设置,相符1531个,不相符569个,相符率为72.90%。
gamma值为5时,相符1747个,不相符353个,相符率为83.19%。
gamma值为100时,相符1819个,不相符281个,相符率为86.62%。
gamma值为1000时,相符1354个,不相符746个,相符率为64.48%。
gamma值为0.1时,相符1524个,不相符576个,相符率为72.57%。
gamma值为5,损失系数为10时,相符1866个,不相符234个,相符率为88.86%。
gamma值为5,损失系数为0.01时,相符1553个,不相符547个,相符率为73.95%。
只选两个差异平均值和差异两个方差值,gamma值为5,损失系数为10时,相符719个,不相符1381个,相符率为34.24%。
只选两个差异平均值和差异两个方差值,gamma值为1,损失系数为1时,相符600个,不相符1500个,相符率为28.57%。
只选红蓝绿平均和红蓝绿超过,gamma值为5,相符1840个,不相符260个,相符率为87.62%。
此外,每次按同样的设置进行训练,所得到的测试的对的率会有±1%左右的波动。
3.2.3 实际图像的测试成果分析
默认设置值同上,在程序的运行中,椰树海滩图像的各个部分被提成如下图所示的多种部分,图例为:红:砖;靛蓝:天空;绿:树叶;灰:水泥;蓝:窗户;紫:小路;黄:草地。
在默认设置下的成果如下图所示:
选择线性核函数的时候,成果如下图所示:
选择RBF核函数,gamma值为0.5,损失系数为5时,成果如下图所示:
展开阅读全文