【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】
?一、手寫數字識別技術簡介
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的視為正確識別,求出神經網絡的正確率。具體運行代碼如下:
?二、部分源代碼
function varargout = num_sb(varargin)
% NUM_SB MATLAB code for num_sb.fig
% NUM_SB, by itself, creates a new NUM_SB or raises the existing
% singleton*.
%
% H = NUM_SB returns the handle to a new NUM_SB or the handle to
% the existing singleton*.
%
% NUM_SB(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in NUM_SB.M with the given input arguments.
%
% NUM_SB(‘Property’,‘Value’,…) creates a new NUM_SB or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before num_sb_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to num_sb_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 num_sb
% Last Modified by GUIDE v2.5 02-Jun-2022 18:36:45
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @num_sb_OpeningFcn, …
‘gui_OutputFcn’, @num_sb_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% — Executes just before num_sb is made visible.
function num_sb_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 num_sb (see VARARGIN)
% Choose default command line output for num_sb
handles.output = hObject;
clear global;clc
set(gcf,‘name’,‘手寫數字識別’); %修改GUI的界面名稱
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes num_sb wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% — Outputs from this function are returned to the command line.
function varargout = num_sb_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)
ol_0=[1 7 10]; %歐拉數為0的數
ol_1=[2 3 4 5 6 8]; %歐拉數為1的數
load pic1.mat;
[Fnameh,Pnameh]=uigetfile({‘.’;‘.jpg’;'.png’});%Fnameh顯示的文件名稱,Pnameh顯示的文件路徑
filename=[Pnameh,Fnameh];%存儲文件的路徑及名稱
I=imread(filename); %讀取圖像
imshow(I);
I_out=grow(I);
L=length(I_out);
num=zeros(1,L);
for i=1:L
I1=I_out(i);
I1=cell2mat(I1);
figure,imshow(I1)
Io=~imbinarize(I1,graythresh(I1));
Io=imdilate(Io,strel(‘disk’,3));
ol=bweuler(Io);
if ol==-1
num(i)=8;
else
GJ=chuli(I1);
xsd=zeros(1,10);
GJpass=imresize(GJ,[512 512]);
if ol1
for j=1:6
xsd(j)=corr2(GJpass,GJ2(:,:,ol_1(j)));
end
xsd=abs(xsd);
% wz=find(xsdmax(xsd));
num(i)=ol_1(xsdmax(xsd))-1;
elseif ol0
for j=1:3
xsd(j)=corr2(GJpass,GJ2(:,:,ol_0(j)));
end
xsd=abs(xsd);
% wz=find(xsdmax(xsd));
num(i)=ol_0(xsdmax(xsd))-1;
else
for j=0:9
xsd(j+1)=corr2(GJpass,GJ2(:,:,j+1));
end
xsd=abs(xsd);
num(i)=find(xsd==max(xsd))-1;
end
end
?三、運行結果
?四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1]王錦.基于彈性BP算法的手寫數字識別[J].新鄉學院學報. 2021,38(06)
3 備注
簡介此部分摘自互聯網,僅供參考,若侵權,聯系刪除
總結
以上是生活随笔為你收集整理的【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 58品牌公寓馆
- 下一篇: openstack的四层组网