基于SVM算法的手写数字识别系统的设计与实现
1.1 主要研究内容
(1)手写字体的识别问题一直是图像处理与模式识别研究领域的难点之一。传统的识别方法如最近邻算法、神经网络等,解决复杂分类问题及数学函数表示能力和网络的泛化能力有限,不能达到高识别精度的需求。因此,基于机器学习的智能化识别技术对手写字体的识别具有非常广阔的应用前景,例如阅卷的得分,字体大小等。本文基于支持向量机(SVM)的智能化处理技术,在提取手写字体特征之后实现手写字体图像的智能识别。
(2)系统流程图
本设计的识别过程:手写字体训练集图片和手写字体预测集图片进行一个二值化处理及特征提取,建立支持向量机模型,对参数进行网格式参数寻优,通过交叉验证寻得最优解,测试集进行分类识别,最终得到分类结果。
图1 系统结构图
1.2 研究的工作基础或实验条件
(1)硬件环境
处理器为Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz1.80 GHz,内存8G,Win10的64为操作系统
(2)软件环境
软件:Matlab2017a
数据库:美国UCI公共数据库
源数据:手写字体数据集图像
1.3 数据集描述
手写字体训练集图片一共有50张,手写字体预测集图片一共有30张。
训练集数据图片:
图2 手写字体训练集数据
预测集数据图片:
图3 手写字体预测集数据
1.4 特征提取过程描述
由于图片中数字的大小和位置不尽相同,为了消除这些影响,首先对每幅图片做标准化预处理:把每幅图片做反处理,并转为二值图像,然后截取二值图像中包含数字的最大区域,最后将截取的区域转化成标准的 16 × 16 像素的图像。此时数字上像素点灰度值为 1 ,背景像素点灰度值为 0,最终形成了256维的特征值。
1.5 分类过程描述
支持向量机(Support Vector Machine,SVM)最先由Cortes和Vapnik提出,它是一种有监督的模式识别方法。它的主要思想是建立一个分类决策面。SVM利用核函数将数据映射到高维空间,使其尽可能的线性可分。常用的核函数包括线性核函数、多项式核、径向基核(RBF)、傅里叶核、样条核和Sigmoid核函数等。通过比较这些核函数适用的数据特点,无论样本数据特点是高维还是低维,数据量大还是小,RBF核函数展现了很好的分类性能。因此,选择RBF作为SVM的分类核函数。
SVM数据处理过程如下:
设特征数据为N维,共L组数据,即。
决策面可表示为
(1)
式中—决策面的权重系数
—非线性映射函数
b—阈值
为了最小化结构风险,最优分类超平面应满足以下条件
(2)
引入非负松弛变量 ,这样分类误差就在一个规定的范围内。因此,优化问题就被转变为
(3)
式中c —惩罚因子,控制模型的复杂程度和泛化能力
引入拉格朗日算法,优化问题被转换为对偶形式
(4)
其中
(5)
本文,引入RBF核函数
(6)
式中g —核函数参数,控制输入空间的范围
上述优化问题转变为
(7)
SVM预测问题取决于两个重要参数c和g,这两个参数会影响SVM的分类性能。为了提高模型的预测性能,引入网格式搜索法(GS)优化模型建立过程中的两个重要参数。同时避免模型过学习和欠学习的现象发生,采用5倍交叉验证法以训练集最高验证准确率为适应度函数来进行参数寻优。当达到最高验证准确率时,所得到的c和g为最佳参数。GS中,以0.5为间隔进行全局搜索,c和g的范围均是(2-10, 210)
总之SVM预测过程为:
(1)输入数据,规定训练输入、训练输出、预测输入和预测输出
(2)为加快网络收敛速度,进行数据归一化处理
(3)参数寻优,网格数搜索开始
(4)得到最优参数建立预测模型,避免模型过学习和欠学习的现象发生,采用5倍交叉验证法以训练集最高验证准确率为适应度函数来进行参数寻优。当达到最高验证准确率时,所得到的c和g为最佳参数。
(5)预测数据输入
(6)得出分类结果
1.6 主要程序代码
SVM分类程序:
%% 清空环境变量
close all;
clear;
clc;
format compact;
%% 数据载入,读入数据
% 利用uigetfile函数交互式选取训练样本
字体代码大全[FileName,PathName,FilterIndex] = uigetfile( ...
{'*.jpg';'*.bmp'},'请导入训练图片','*.jpg','MultiSelect','on');%导入训练图片
if ~FilterIndex
return;
end
num_train = length(FileName);%图片预处理
TrainData = zeros(num_train,16*16);%图像转成16*16的标准化图像
TrainLabel = zeros(num_train,1);
for k = 1:num_train
pic = imread([PathName,FileName{k}]);
pic = pic_preprocess(pic);
% 将标准化图像按列拉成一个向量并转置,生成50*256的训练样本矩阵
TrainData(k,:) = double(pic(:)');
% 样本标签为样本所对应的数字
TrainLabel(k) = str2double(FileName{k}(4));
End
%% 载入测试样本
[FileName,PathName,FilterIndex] = uigetfile( ...
{'*.jpg';'*.bmp'},'请导入测试图片','*.bmp','MultiSelect','on');
if ~FilterIndex
return;
end
num_train = length(FileName);
TestData = zeros(num_train,16*16);
TestLabel = zeros(num_train,1);
for k = 1:num_train
pic = imread([PathName,FileName{k}]);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论