《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别

《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别

1. 前言

《MATLAB 神经网络43个案例分析》是MATLAB技术论坛(www.matlabsky.com)策划,由王小川老师主导,2013年北京航空航天大学出版社出版的关于MATLAB为工具的一本MATLAB实例教学书籍,是在《MATLAB神经网络30个案例分析》的基础上修改、补充而成的,秉承着“理论讲解—案例分析—应用扩展”这一特色,帮助读者更加直观、生动地学习神经网络。

《MATLAB神经网络43个案例分析》共有43章,内容涵盖常见的神经网络(BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等)以及相关智能算法(SVM、决策树、随机森林、极限学习机等)。同时,部分章节也涉及了常见的优化算法(遗传算法、蚁群算法等)与神经网络的结合问题。此外,《MATLAB神经网络43个案例分析》还介绍了MATLAB R2012b中神经网络工具箱的新增功能与特性,如神经网络并行计算、定制神经网络、神经网络高效编程等。

近年来随着人工智能研究的兴起,神经网络这个相关方向也迎来了又一阵研究热潮,由于其在信号处理领域中的不俗表现,神经网络方法也在不断深入应用到语音和图像方向的各种应用当中,本文结合书中案例,对其进行仿真实现,也算是进行一次重新学习,希望可以温故知新,加强并提升自己对神经网络这一方法在各领域中应用的理解与实践。自己正好在多抓鱼上入手了这本书,下面开始进行仿真示例,主要以介绍各章节中源码应用示例为主,本文主要基于MATLAB2015b(32位)平台仿真实现,这是本书第十九章基于SVM的手写字体识别实例,话不多说,开始!

2. MATLAB 仿真示例

打开MATLAB,点击“主页”,点击“打开”,找到示例文件
在这里插入图片描述
选中Chapter_CharacterRecognitionUsingLibsvm.m,点击“打开”

Chapter_CharacterRecognitionUsingLibsvm.m源码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Chapter_CharacterRecognitionUsingLibsvm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能:基于SVM的手写字体识别
%环境:Win7,Matlab2015b
%Modi: C.S
%时间:2022-06-17
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%% Matlab神经网络43个案例分析

% 基于SVM的手写字体识别
% by 李洋(faruto)
% http://www.matlabsky.com
% Email:faruto@163.com
% http://weibo.com/faruto 
% http://blog.sina.com.cn/faruto
% 2013.01.01
%% A Little Clean Work
close all;
clear;
clc;
format compact;
%% 载入训练数据
tic
% 利用uigetfile函数交互式选取训练样本
[FileName,PathName,FilterIndex] = uigetfile( ...
    {
    
    '*.jpg';'*.bmp'},'请导入训练图片','*.jpg','MultiSelect','on');
if ~FilterIndex
    return;
end
num_train = length(FileName);
TrainData = zeros(num_train,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
%% 建立支持向量机
% [bestCVaccuracy,bestc,bestg] = ...
%     SVMcgForClass(TrainLabel,TrainData,-8,8,-8,8,10,0.8,0.8,4.5)

% 设置GA相关参数
    ga_option.maxgen = 100;
    ga_option.sizepop = 20;
    ga_option.cbound = [0,100];
    ga_option.gbound = [0,100];
    ga_option.v = 10;
    ga_option.ggap = 0.9;
    [bestCVaccuracy,bestc,bestg] = ...
    gaSVMcgForClass(TrainLabel,TrainData,ga_option)

% 训练
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model = svmtrain(TrainLabel, TrainData, cmd);
% 在训练集上查看识别能力
preTrainLabel = svmpredict(TrainLabel, TrainData, model);
%% 载入测试样本
[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}]);
    pic = pic_preprocess(pic);
    
    TestData(k,:) = double(pic(:)');
    TestLabel(k) = str2double(FileName{
    
    k}(4));
end
%% 对测试样本进行分类
preTestLabel = svmpredict(TestLabel, TestData, model);
assignin('base','TestLabel',TestLabel);
assignin('base','preTestLabel',preTestLabel);
TestLabel'
preTestLabel'
%% sub function of pre-processing pic
function pic_preprocess = pic_preprocess(pic)
% 图片预处理子函数
% 图像反色处理
pic = 255-pic;
% 设定阈值,将反色图像转成二值图像
pic = im2bw(pic,0.4);
% 查找数字上所有像素点的行标y和列标x
[y,x] = find(pic == 1);
% 截取包含完整数字的最小区域
pic_preprocess = pic(min(y):max(y), min(x):max(x));
% 将截取的包含完整数字的最小区域图像转成16*16的标准化图像
pic_preprocess = imresize(pic_preprocess,[16,16]);

toc


添加完毕,点击“运行”,开始仿真,弹框出现下列提示:请导入训练图片
在这里插入图片描述
选择“手写数字训练样本图片”文件夹,全选图片,点击“打开”
在这里插入图片描述
等待运行,出现以下结果
在这里插入图片描述
并出现以下弹框提示:请导入测试图片
在这里插入图片描述
选择“手写数字测试样本图片”文件夹,全选图片,点击“打开”
在这里插入图片描述
输出仿真结果如下:

Accuracy = 93.3333% (28/30) (classification)
ans =
  1190     0     0     1     1     1     2     2     2     3     3     3     4     4     4     5     5     5     6
  20306     6     7     7     7     8     8     8     9     9     9
ans =
  1190     0     0     1     1     7     2     2     2     3     3     3     4     4     4     5     5     5     6
  20306     6     7     7     7     8     8     8     7     9     9

3. 小结

简单的手写数字识别应用,首先进行训练,再进行预测分类识别,得到分类结果,整个流程都得到了一个完整的实现,自己一个开始选择单张图片会报错,所以大家进行仿真时,记住选择全部图片。对本章内容感兴趣或者想充分学习了解的,建议去研习书中第十九章节的内容。后期会对其中一些知识点在自己理解的基础上进行补充,欢迎大家一起学习交流。

猜你喜欢

转载自blog.csdn.net/sinat_34897952/article/details/125213757
今日推荐