一、获取代码方式

获取代码方式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期】相关推荐

  1. 【交通标志识别】基于matlab GUI BP神经网络交通标志识别系统(含语音报警)【含Matlab源码 2240期】

    ⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...

  2. matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究

    研究与开发 现代计算机 2019.04 上 文章编号:1007-1423(2019)10-0031-05 DOI:10.3969/j.issn.1007-1423.2019.10.007 基于 DPI ...

  3. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究

    <基于边缘检测和BP神经网络的大豆杂草识别研究> 单位:吉林农业大学信息技术学院 作者:侯雨 数据获取 设备:大疆 DJI 精灵3 相机:EXMOR 1/2.3 RGB 相机 拍照:飞行高 ...

  4. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...

  5. 【电力负荷预测】基于matlab BP神经网络电力负荷预测【含Matlab源码 278期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab BP神经网络电力负荷预测[含Matlab源码 278期] 获取代码方式2: 付费专栏Matlab智能算 ...

  6. 【风电功率预测】基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测【含Matlab源码 1314期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [风电功率预测]基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测[含Matlab源码 1314期] ⛄二.帝国殖民竞争算法简 ...

  7. 【光学】基于matlab GUI菲涅尔系数计算【含Matlab源码 1165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI菲涅尔系数计算[含Matlab源码 1165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  8. 【身份证识别】基于matlab GUI BP神经网络身份证识别【含Matlab源码 2239期】

    ⛄一.身份证号码识别简介 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开始建立自己的安全保 ...

  9. 【车牌识别】基于matlab GUI BP神经网络车牌识别(带面板)【含Matlab源码 790期】

    ⛄一.BP车牌识别简介(附课程作业报告) 车牌识别系统设计与实现 车牌识别系统主要分为三部分:车牌图像预处理.特征提取以及基于BP神经网络对特征进行训练和分类,流程图如图1所示. 图1 车牌识别系统组 ...

  10. MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

    光伏发电功率主要受太阳辐照度影响,所以准确预测太阳辐照度对光伏功率预测十分重要.程序采用小波分解先对辐照度数据进行分解,然后再用bp神经网络对分解的辐照度数据分别预测,再组合作为最后的预测结果. 人工 ...

最新文章

  1. 洛谷P2512 糖果传递
  2. 关于VC单选按钮不能设置变量以及Group属性的设置问题
  3. java枚举可以int值不_java – 如何通过int值迭代枚举?
  4. 大侠稍等!URL 中为何出现奇怪的字符
  5. 数据库设计:数据库设计的基本步骤介绍
  6. 前端学习(1539):hello world
  7. 为什么不能同时用const和static修饰成员函数?
  8. pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...
  9. 计算机在档案部门应用范围,计算机在档案管理中的相关运用
  10. php代挂程序什么原理,小新云全套代挂加速 来源于网络资源简介:01、本源码调用官方接口 联合开发网 - pudn.com...
  11. [跟进]_微软关闭MSN博客,腾讯第一时间抢占市场
  12. 学习《西方哲学史》摘录
  13. 32位无符号随机函数
  14. 最有范儿的H5制作工具—应用之星之表单控件详解
  15. 学生宿舍管理系统毕业设计(python)
  16. GPS Tools For Android
  17. OC 十进制 二进制 转换
  18. 汇编语言(王爽第三版) 实验5
  19. ACM中java的使用(各种比赛中)
  20. win10安装docker及docker安装镜像

热门文章

  1. Android loader 详解
  2. 摩托罗拉ME525/defy 中兴U880 解决QQ游戏大厅“网络连接错误,请稍候再试”问题...
  3. ORACLE之常用FAQ V1.0二(构架系统) (1)
  4. 关闭网页自动提示加入收藏
  5. 《Excel与VBA程序设计》第四章新鲜出炉
  6. [转贴]彻底解决 CrystalReports 登录失败问题。
  7. python+Selenium2+chrome构建动态网页爬虫工具
  8. 七月算法机器学习3 矩阵分析与应用
  9. Atitit.获取某个服务 网络邻居列表 解决方案
  10. Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??