【手写数字识别】基于matlab GUI BP神经网络手写数字识别【含Matlab源码 518期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源: 【手写数字识别】基于matlab GUI BP神经网络手写数字识别【含Matlab源码 518期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、手写数字识别技术简介
1 案例背景
手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性。由于手写体数字的随意性很大,如笔画粗细、字体大小、倾斜角度等因素都有可能直接影响到字符的识别准确率,所以手写体数字识别是一个很有挑战性的课题。在过去的数十年中,研究者们提出了许多识别方法,并取得了一定的成果。手写体数字识别的实用性很强,在大规模数据统计如例行年检、人口普查、财务、税务、邮件分拣等应用领域都有广阔的应用前景"。
本案例讲述了图像中手写阿拉伯数字的识别过程,对手写数字识别的基于统计的方法进行了简要介绍和分析,并通过开发一个小型的手写体数字识别系统来进行实验。手写数字识别系统需要实现手写数字图像的读取功能、特征提取功能、数字的模板特征库的建立功能及识别功能。
2 BP算法与实现过程
2.1 BP算法基本原理
将已知输入向量和相应的输出向量(期望输出)作为训练样本,并假定即将学习的网络已被赋予一组权值。为消除梯度幅度的不利影响,利用弹性反向传播算法通过过如下步骤更新权值(图1):首先,使用初始权值(不管正确与否)从输入层开始向前传播,计算出所有神经元的输出,这样输出层的输出与期望输出(即输出值与目标值)之间存在较大的误差。然后,计算作为神经元权值函数的]误差函数(损失函数或目标函数、代价函数)的梯度,根据误差降低最快的方向来调整更新权值,通过将输出误差反向传播给隐含层来不断调整误差函数。在计算误差梯度的同时,使用与上面同样的方法更新隐含层的权值。反复迭代更新,直到损失函数达到预定的理想目标。在弹性反向传播算法的学习过程中,权值的修正值即为学习率,而梯度只影影响权值变化的方向,即正负。
图1 反向传播神经网络模型
1.2 感知器神经网络
感知器(multilayer perceptron, MLP) 神经网络是模式识别的简单二元分类人工网络, 它通过权值模仿神经细胞的突触,用激活函数模仿细胞体,偏置即为阈值。单层的感知器网络结构如图2所示。单层感知器可将外部输入x分成两类:当感知器的输出y为正数或零时,输入属于第一类;当感知器的输出为负数时,输入属于第二类。
1.3 实现过程
(1)图像读取
在本文中,设计并自建了样本的数据库,库中有0~9共10个阿拉伯数字的5000张不同的手写数字图像,均为白底黑色的bmp格式的文件, 每个数字对应500张图片。实验要从每一个数字中都随机选取450张手写图像作为训练样本,每一个数字剩下的50张作为测试样本。部分数字样张如图3所示。
图3 数字样张
(2)提取特征
本设计中的训练样本数量多,而而一般神经网络输入层的神经元数就是训练样本向量的维数,因此需要对训练样本向量做降维预处理。预处理过程就是通过灰度阈值函数将图像转换成二值图像。降维前需先将所有图像做一次缩放,以确保每个图像的输入向量都具有相同的像素。本设计选定图像缩放的高度和宽度分别为70像素点和50像素点,符合一般手写阿拉伯数字的高宽比。对这些缩放后的图像作纵横切割,如图4所示,每10×10个像素点作为一系列像素块,构成一张包含35个像素块的二值图像计算每一个像素块中0和1的占比,并用它作为模式的一个特征值,这样可以构成5x7的特征值矩阵。考虑到感知器神申经网络输入向量只能是一维,故需要将此矩阵转换成一维向量作为训练样本的输入,转置后共生成35个一维向量。
图4 缩放后的图像切割
(3)构造标签
无论是训练样本还是测试样本,都需要构造标签,前者用于映射的学习,后者用于判断训练网络的正确率。一般地,输出层神经元个数即为分类网络中的分类类别数。阿拉伯数字是10类,故输出神经元数为10。每个类由具体的500个图像构成,包含训练样本和测试样本。通过提取特征每个类均生成35个一维向量:用500个列向量(1000000000)T来标注模式1,即数字1;(0100000000)标注模式2,即数字2;(0010000000)标注模式3,即数字3;依此类推,最后的(0000000001)标注模式0,即数字0。运行代码如下:
(4)随机选定训练样本和测试样本测试
利用MATLAB中已有的rand()伪随机数生成函数来生成5000个介于0和1之间的伪随机数。将生成的伪随机数做升序排序,通过索引来记录随机数原来的位置,并将原来的位置组合成新的行向量。在本设计中,输入层的神经元有35个,输出层神经元有10个,选取25为中间隐含层神经元个数。
(5)数字识别与正确率的计算
对比测试前的标签和仿真后的输出,用测试前的标签值减去输出值,得到误差值,将误差为0的视为正确识别,求出神经网络的正确率。具体运行代码如下:
三、部分源代码
%测试
clear all;
close all
p(1:256,1)=1; %初始图像二值化像素
p1=ones(16,16);
load swjnet net; %加载训练好的网络
% test=input('Please input a test image:','s');
x=imread('3 (10).bmp'); %特征提取
bw=im2bw(x,0.5); %二值化
[i,j]= find(bw==0); %寻找数字所在的像素索引
imin=min(i); %求取数字像素占据空间的最小行索引
imax=max(i); %求取数字像素占据空间的最大行的索引
jmin=min(j); %求取数字像素占据空间的最小列的索引
jmax=max(j); %求取数字像素占据空间的最大列的索引
bwl=bw(imin:imax,jmin:jmax); %把图像由39×39缩放为实际数字像素所需的空间
rate=16/max(size(bwl)); %求取放大比率
bwl=imresize(bwl,rate); %按比率放大图像
[i,j]=size(bwl); %求取行列数
i1=round((16-i)/2); %取整
j1=round((16-j)/2);
p1(i1+1:i1+i,j1+1:j1+j)=bwl; %图像从右向暂存
function varargout = mian(varargin)
% MIAN MATLAB code for mian.fig
% MIAN, by itself, creates a new MIAN or raises the existing
% singleton*.
%
% H = MIAN returns the handle to a new MIAN or the handle to
% the existing singleton*.
%
% MIAN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MIAN.M with the given input arguments.
%
% MIAN('Property','Value',...) creates a new MIAN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before mian_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to mian_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help mian% Last Modified by GUIDE v2.5 05-Mar-2021 18:29:30% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @mian_OpeningFcn, ...'gui_OutputFcn', @mian_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before mian is made visible.
function mian_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to mian (see VARARGIN)% Choose default command line output for mian
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes mian wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = mian_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%% 特征提取
filename = dir('*.bmp'); %图像文件格式
for k=1:100p1=ones(16,16); %缩放后用于存储的像素空间x=imread(filename(k).name); %读取图像文件bw=im2bw(x,0.5); %二值化[i,j]= find(bw==0); %寻找数字所在的像素索引imin=min(i); %求取数字像素占据空间的最小行索引imax=max(i); %求取数字像素占据空间的最大行的索引jmin=min(j); %求取数字像素占据空间的最小列的索引jmax=max(j); %求取数字像素占据空间的最大列的索引 bwl=bw(imin:imax,jmin:jmax); %把图像由39×39缩放为实际数字像素所需的空间rate=16/max(size(bwl)); %求取放大比率bwl=imresize(bwl,rate); %按比率放大图像[i,j]=size(bwl); %求取行列数i1=round((16-i)/2); %取整j1=round((16-j)/2);p1(i1+1:i1+i,j1+1:j1+j)=bwl; %图像从右向暂存p1=-1.*p1+ones(16,16); %将图像反色for m=0:15 %样本特征存于输入矢量p(m*16+1:(m+1)*16,k+1)=p1(1:16,m+1);end
switch k %对应各个输入样本求取对应的目标矢量case{ 1,2,3,4,5,6,7,8,9,10}t(k+1)=0;case{ 11,12,13,14,15,16,17,18,19,20}t(k+1)=1;case{ 21,22,23,24,25,26,27,28,29,30}t(k+1)=2; case{ 31,32,33,34,35,36,37,38,39,40}t(k+1)=3;case{ 41,42,43,44,45,46,47,48,49,50}t(k+1)=4;case{ 51,52,53,54,55,56,57,58,59,60}t(k+1)=5;case{ 61,62,63,64,65,66,67,68,69,70}t(k+1)=6;case{ 71,72,73,74,75,76,77,78,79,80}t(k+1)=7;case{ 81,82,83,84,85,86,87,88,89,90}t(k+1)=8;case{ 91,92,93,94,95,96,97,98,99,100}t(k+1)=9;end
end
save swjPT p t; %保存输入矢量和目标矢量
warndlg('特征提取完毕', '提示');% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%样本训练
clear all;
load swjPT p t; %加载输入矢量和目标矢量
pr(1:256,1)=0; %初始权值设计
pr(1:256,2)=1;
net=newff(pr,[25 1],{'logsig','purelin'},'traingdx','learngdm'); %神经网络初始化net.trainParam.epocha=4500; %训练次数
net.trainParam.goal=0.001; %训练误差
net.trainParam.show=10; %显示间隔
net.trainParam.lr=0.09; %学习率
net=train(net,p,t); %样本训练
save swjnet net; %保存训练好的网络
warndlg('BP网络训练结束', '提示');% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%测试
p(1:256,1)=1; %初始图像二值化像素
p1=ones(16,16);
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
【手写数字识别】基于matlab GUI BP神经网络手写数字识别【含Matlab源码 518期】相关推荐
- 【交通标志识别】基于matlab GUI BP神经网络交通标志识别系统(含语音报警)【含Matlab源码 2240期】
⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...
- matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究
研究与开发 现代计算机 2019.04 上 文章编号:1007-1423(2019)10-0031-05 DOI:10.3969/j.issn.1007-1423.2019.10.007 基于 DPI ...
- 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
<基于边缘检测和BP神经网络的大豆杂草识别研究> 单位:吉林农业大学信息技术学院 作者:侯雨 数据获取 设备:大疆 DJI 精灵3 相机:EXMOR 1/2.3 RGB 相机 拍照:飞行高 ...
- 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...
- 【电力负荷预测】基于matlab BP神经网络电力负荷预测【含Matlab源码 278期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab BP神经网络电力负荷预测[含Matlab源码 278期] 获取代码方式2: 付费专栏Matlab智能算 ...
- 【风电功率预测】基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测【含Matlab源码 1314期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [风电功率预测]基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测[含Matlab源码 1314期] ⛄二.帝国殖民竞争算法简 ...
- 【光学】基于matlab GUI菲涅尔系数计算【含Matlab源码 1165期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI菲涅尔系数计算[含Matlab源码 1165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...
- 【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】
⛄一.身份证号码识别简介 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保 ...
- 【车牌识别】基于matlab GUI BP神经网络车牌识别(带面板)【含Matlab源码 790期】
⛄一.BP车牌识别简介(附课程作业报告) 车牌识别系统设计与实现 车牌识别系统主要分为三部分:车牌图像预处理.特征提取以及基于BP神经网络对特征进行训练和分类,流程图如图1所示. 图1 车牌识别系统组 ...
- MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)
光伏发电功率主要受太阳辐照度影响,所以准确预测太阳辐照度对光伏功率预测十分重要.程序采用小波分解先对辐照度数据进行分解,然后再用bp神经网络对分解的辐照度数据分别预测,再组合作为最后的预测结果. 人工 ...
最新文章
- 洛谷P2512 糖果传递
- 关于VC单选按钮不能设置变量以及Group属性的设置问题
- java枚举可以int值不_java – 如何通过int值迭代枚举?
- 大侠稍等!URL 中为何出现奇怪的字符
- 数据库设计:数据库设计的基本步骤介绍
- 前端学习(1539):hello world
- 为什么不能同时用const和static修饰成员函数?
- pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...
- 计算机在档案部门应用范围,计算机在档案管理中的相关运用
- php代挂程序什么原理,小新云全套代挂加速 来源于网络资源简介:01、本源码调用官方接口 联合开发网 - pudn.com...
- [跟进]_微软关闭MSN博客,腾讯第一时间抢占市场
- 学习《西方哲学史》摘录
- 32位无符号随机函数
- 最有范儿的H5制作工具—应用之星之表单控件详解
- 学生宿舍管理系统毕业设计(python)
- GPS Tools For Android
- OC 十进制 二进制 转换
- 汇编语言(王爽第三版) 实验5
- ACM中java的使用(各种比赛中)
- win10安装docker及docker安装镜像
热门文章
- Android loader 详解
- 摩托罗拉ME525/defy 中兴U880 解决QQ游戏大厅“网络连接错误,请稍候再试”问题...
- ORACLE之常用FAQ V1.0二(构架系统) (1)
- 关闭网页自动提示加入收藏
- 《Excel与VBA程序设计》第四章新鲜出炉
- [转贴]彻底解决 CrystalReports 登录失败问题。
- python+Selenium2+chrome构建动态网页爬虫工具
- 七月算法机器学习3 矩阵分析与应用
- Atitit.获取某个服务 网络邻居列表 解决方案
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??