题目基于SVM图像的模式识别系统的设计与实现1.1题目的主要研究内容
(1)手写体数字识别在经济社会生活中的各个方面都具有很广泛的应用。利用支持向量机,对手写数字的二值图像进行特征分类识别,并通过训练能够对手写数字有很好的识别率。
(2)系统流程图
1.2题目研究的工作基础或实验条件
(1)硬件环境:计算机
(2)软件环境:MATLABR2021b
1.3数据集描述
选取的训练样本为5000幅手写体数字,每幅图片大小为50*50像素,手写数学训练样本如图1所示。
图1手写数字训练样本
取1000幅手写体数字图片作为测试样本,每幅图片大小为50*50像素,手写数字测试样本如图2所示。
图2手写数字测试样本
1.4特征提取过程描述
对图片进行预处理,应用预处理子函数(pic_preprocess函数)。图像反处理,即用255-像素值(pic)。并设定阈值,将反图像转成二值图像。查数字上所有像素点的行标y和列标x(find函数)。截取包含完整数字的最小区域(pic(min(y):max(y),min(x):max(x))),将截取的包含完整数字的最小区域图像转成16*16的标准化图像(imresize函数)。预处理前后的图片如图三所示。
图3原始图片(左)与预处理后的图片(右)
1.5分类过程描述
选择合适的惩罚参数,会大大提高分类器的性能,采用交叉验证的方法选择合适的参数C。
实际的训练集通常是线性不可分的,这就需要运用到核技巧将原空间中的点映射到线性可分的高维空间。通过灵活运用核函数,SVM可以容易的生成不同的非线性决策边界。
核函数设置类型为2–RBF函数:exp(-||xi−xj||^2/2σ^2)。对于高斯核函数中r越大‍、高斯分布峰值越大,当r取‍值比较大时,数据训练结果趋于过拟合,当取值比较小时,数据训练结果趋于欠拟合。避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。因此,通常将数据缩放到[-1,1]或者是[0,1]之间。
1.6主要程序代码(要求必须有注释)
LibSVM是一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用。在使用LibSVM时需要下载微软的Visual Studio。
载入训练数据,交互式选取训样练本(uigetfile函数),将标准化图像按列拉成一个向量并转置,生成50*256的训练样本矩阵。其中,样本标签为样本所对应的数字。
图片下载站源码利用uigetfile函数交互式选取训练样本
[FileName,PathName,FilterIndex]=uigetfile
if~Filter Index
return;
end
num_train=length(FileName);
TrainData=zeros(num_train,16*16);
Trainlabel=zeros(num_train,l);
for k=1,num_train
pie=imread([PathName,FileName{k}]);
pie=pic_preprocess(pic);
将标准化图像按列拉成一个向量并转置,生成50*256的训练样本矩阵
TrainData(k,;)=double(pic(,)’);样本标签为样本所对应的数字
TrainLabel(k)=str2double(FileName{k}(4))
end
建立支持向量机,设置GA相关参数,并调用gaSVMcgForClass函数。其中:maxgen=100;
ga_option.sizepop=20;
ga_option.cbound=[0,100];
ga_option.gbound=[0,100];
ga_option.v=10;
ap=0.9;
进行训练(svmtrain函数)
Svmtrain(训练建模):svmtrain[options]training_set_file[model_file]
Options选项为0,采用C-SVC,其cpp程序如下
main()
pare_command line();//读取命令行的文件名和参数,初始化svm_parameter结构。rend_problem();//读取数据文件(还记得svmtrain的参数吗),并分配数据内存。
//初始化svm_problem结构
//其中:
//Long L:样本的个数(行数)。
//Double*y:样本所属类,L*1维。
//Double**x:所有样本的特征值,L*(k+1)维,k是特征数
//Double*x_space:有样本的特征值,n*l,其中n=L*(k+1)
svm_train(svm_problem,svm_paramneter);//填充svm_model结构,并进行文件保存。svm_group.class(svm_problem*//父函数传入参数,已知
int nr_class,//样本种类数,待填
int*label,//原始样本的类别标号,如-1,0,+1,为L*1维
int*start,//待填,各类样本集中排列后的起始点k*1维
int*count,//待填,各类的样本数,k*1维
int*pemm);//待填,记录各样本集中排列以后的序号,L*1维
for(i=0,i<nr_class,1++)
for(j=i+1,i<n_class,j++)//进行1对1组合
{
svm_problem sub_prob,//创建临时的两类svm_problem,并填充L,x,y的值
f[p]=svm_train one(vm_problem*,//已知,sub_prob,p为1对1的模型序列
svm_parameter,//已知,父函数传入
double weight_c[i],//已知,类i对应的罚因子C(+1)
double weight._c[j]);//已知,类j对应的罚因子C(-1)
{//局部变量,待填
double obj;//目标值
double rho;//判快式中的截距b
double upper_bound;//罚因子C
switch(svm_problem:.Type)
{
case solve_c_svc:
solve_c_svc(svm_problem*,//已知,sub_prob
svm_parameter,//已知父函数传入
double*alpha,//待赋值,已分配,a[i,LX1维
solver->solutionInfo,//已定义,待赋值
double weight_c[i],//已知
double weight_c[j])//已知
避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。因此,通常将数据缩放到[-1,1]或者是[0,1]之间。具体为用法:svmscale[-l lower][-u upper][-y
y_lower y_upper][-s save_filename][-r restore_filename]filename,其中:
-l:数据下限标记;lower:缩放后数据下限;

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