日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】

發(fā)布時間:2024/5/14 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?一、手寫數(shù)字識別技術(shù)簡介

1 案例背景
手寫體數(shù)字識別是圖像識別學科下的一個分支,是圖像處理和模式識別研究領域的重要應用之一,并且具有很強的通用性。由于手寫體數(shù)字的隨意性很大,如筆畫粗細、字體大小、傾斜角度等因素都有可能直接影響到字符的識別準確率,所以手寫體數(shù)字識別是一個很有挑戰(zhàn)性的課題。在過去的數(shù)十年中,研究者們提出了許多識別方法,并取得了一定的成果。手寫體數(shù)字識別的實用性很強,在大規(guī)模數(shù)據(jù)統(tǒng)計如例行年檢、人口普查、財務、稅務、郵件分揀等應用領域都有廣闊的應用前景"。
本案例講述了圖像中手寫阿拉伯數(shù)字的識別過程,對手寫數(shù)字識別的基于統(tǒng)計的方法進行了簡要介紹和分析,并通過開發(fā)一個小型的手寫體數(shù)字識別系統(tǒng)來進行實驗。手寫數(shù)字識別系統(tǒng)需要實現(xiàn)手寫數(shù)字圖像的讀取功能、特征提取功能、數(shù)字的模板特征庫的建立功能及識別功能。

2 BP算法與實現(xiàn)過程
2.1 BP算法基本原理
將已知輸入向量和相應的輸出向量(期望輸出)作為訓練樣本,并假定即將學習的網(wǎng)絡已被賦予一組權(quán)值。為消除梯度幅度的不利影響,利用彈性反向傳播算法通過過如下步驟更新權(quán)值(圖1):首先,使用初始權(quán)值(不管正確與否)從輸入層開始向前傳播,計算出所有神經(jīng)元的輸出,這樣輸出層的輸出與期望輸出(即輸出值與目標值)之間存在較大的誤差。然后,計算作為神經(jīng)元權(quán)值函數(shù)的]誤差函數(shù)(損失函數(shù)或目標函數(shù)、代價函數(shù))的梯度,根據(jù)誤差降低最快的方向來調(diào)整更新權(quán)值,通過將輸出誤差反向傳播給隱含層來不斷調(diào)整誤差函數(shù)。在計算誤差梯度的同時,使用與上面同樣的方法更新隱含層的權(quán)值。反復迭代更新,直到損失函數(shù)達到預定的理想目標。在彈性反向傳播算法的學習過程中,權(quán)值的修正值即為學習率,而梯度只影影響權(quán)值變化的方向,即正負。

圖1 反向傳播神經(jīng)網(wǎng)絡模型

1.2 感知器神經(jīng)網(wǎng)絡
感知器(multilayer perceptron, MLP) 神經(jīng)網(wǎng)絡是模式識別的簡單二元分類人工網(wǎng)絡, 它通過權(quán)值模仿神經(jīng)細胞的突觸,用激活函數(shù)模仿細胞體,偏置即為閾值。單層的感知器網(wǎng)絡結(jié)構(gòu)如圖2所示。單層感知器可將外部輸入x分成兩類:當感知器的輸出y為正數(shù)或零時,輸入屬于第一類;當感知器的輸出為負數(shù)時,輸入屬于第二類。

1.3 實現(xiàn)過程
(1)圖像讀取

在本文中,設計并自建了樣本的數(shù)據(jù)庫,庫中有0~9共10個阿拉伯數(shù)字的5000張不同的手寫數(shù)字圖像,均為白底黑色的bmp格式的文件, 每個數(shù)字對應500張圖片。實驗要從每一個數(shù)字中都隨機選取450張手寫圖像作為訓練樣本,每一個數(shù)字剩下的50張作為測試樣本。部分數(shù)字樣張如圖3所示。

圖3 數(shù)字樣張
(2)提取特征
本設計中的訓練樣本數(shù)量多,而而一般神經(jīng)網(wǎng)絡輸入層的神經(jīng)元數(shù)就是訓練樣本向量的維數(shù),因此需要對訓練樣本向量做降維預處理。預處理過程就是通過灰度閾值函數(shù)將圖像轉(zhuǎn)換成二值圖像。降維前需先將所有圖像做一次縮放,以確保每個圖像的輸入向量都具有相同的像素。本設計選定圖像縮放的高度和寬度分別為70像素點和50像素點,符合一般手寫阿拉伯數(shù)字的高寬比。對這些縮放后的圖像作縱橫切割,如圖4所示,每10×10個像素點作為一系列像素塊,構(gòu)成一張包含35個像素塊的二值圖像計算每一個像素塊中0和1的占比,并用它作為模式的一個特征值,這樣可以構(gòu)成5x7的特征值矩陣。考慮到感知器神申經(jīng)網(wǎng)絡輸入向量只能是一維,故需要將此矩陣轉(zhuǎn)換成一維向量作為訓練樣本的輸入,轉(zhuǎn)置后共生成35個一維向量。

圖4 縮放后的圖像切割

(3)構(gòu)造標簽
無論是訓練樣本還是測試樣本,都需要構(gòu)造標簽,前者用于映射的學習,后者用于判斷訓練網(wǎng)絡的正確率。一般地,輸出層神經(jīng)元個數(shù)即為分類網(wǎng)絡中的分類類別數(shù)。阿拉伯數(shù)字是10類,故輸出神經(jīng)元數(shù)為10。每個類由具體的500個圖像構(gòu)成,包含訓練樣本和測試樣本。通過提取特征每個類均生成35個一維向量:用500個列向量(1000000000)T來標注模式1,即數(shù)字1;(0100000000)標注模式2,即數(shù)字2;(0010000000)標注模式3,即數(shù)字3;依此類推,最后的(0000000001)標注模式0,即數(shù)字0。運行代碼如下:

(4)隨機選定訓練樣本和測試樣本測試
利用MATLAB中已有的rand()偽隨機數(shù)生成函數(shù)來生成5000個介于0和1之間的偽隨機數(shù)。將生成的偽隨機數(shù)做升序排序,通過索引來記錄隨機數(shù)原來的位置,并將原來的位置組合成新的行向量。在本設計中,輸入層的神經(jīng)元有35個,輸出層神經(jīng)元有10個,選取25為中間隱含層神經(jīng)元個數(shù)。

(5)數(shù)字識別與正確率的計算
對比測試前的標簽和仿真后的輸出,用測試前的標簽值減去輸出值,得到誤差值,將誤差為0的視為正確識別,求出神經(jīng)網(wǎng)絡的正確率。具體運行代碼如下:

?二、部分源代碼

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’,‘手寫數(shù)字識別’); %修改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]; %歐拉數(shù)為0的數(shù)
ol_1=[2 3 4 5 6 8]; %歐拉數(shù)為1的數(shù)
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

?三、運行結(jié)果



?四、matlab版本及參考文獻

1 matlab版本
2014a

2 參考文獻
[1]王錦.基于彈性BP算法的手寫數(shù)字識別[J].新鄉(xiāng)學院學報. 2021,38(06)

3 備注
簡介此部分摘自互聯(lián)網(wǎng),僅供參考,若侵權(quán),聯(lián)系刪除

總結(jié)

以上是生活随笔為你收集整理的【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。