基于Matlab和Mnist数据集的手写数字识别(含GUI手写板)

目录

1. Mnist数据集介绍

2. 训练步骤与结果

3. Matlab的GUI设计

4. 测试

5. Mnist数据集

6. GUI完整代码


1. Mnist数据集介绍

        Mnist数据集是美国国家标准与技术研究所发起整理的,其官网提供的数据集的下载包含四个文件:训练集、训练集标签、测试集、测试集标签

        train-images-idx3-ubyte.gz:  training set images (9912422 bytes)
        train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)
        t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)
        t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

       但是对于Matlab的deepNetworkDesigner训练模型不太方便,所以在此提供一个解析后的版本,其百度网盘链接放最后啦。数据集包括训练集和测试集,两部分分别包括0-9的手写数字图片。

图1 Mnist数据集
图2 训练集

2. 训练步骤与结果

        使用Matlab的deepNetworkDesigner训练神经网络模型,该网络模型一共有7层

        ① 输入层

        因为数据集中所有图片均为28*28的黑白图片,所有输入层的大小为28*28*1,如图3所示。

图3 图片输入层

        ② 卷积层

        卷积层的滤波器为5*5的矩阵,梯度为1,经过卷积层后,输入图片变成24*24的矩阵。滤波器数量为32个。如图4所示。

图4 卷积层

        ③ 池化层

        池化层为了减少数据量,选用图5所示的最大值池化层,大小为3*3,梯度为1,将24*24的图片缩小到8*8。

图5 池化层

        ④ 归一化

       归一化层对每个观察点的所有通道的小批数据进行独立归一化。

图6 归一化层

        ⑤ 全连接层

        全连接层的输出大小为10,即0-9十个数字

图7 全连接层

        ⑥ 激活层

图8 激活层

 

        ⑦ 输出层

图9 输出层

        完整网络模型如图10所示。

图10 完整网络模型

        导入文件夹数据,设置训练参数,如图11所示。

图11 训练参数

         训练结果如图12所示,验证准确度为:98.30%。

图12 训练结果

 

3. Matlab的GUI设计

        Matlab提供了很方便的GUI绘制app,在命令行中输入guide,打开GUI如图13所示。从左边的任务栏拖动插件到编辑区即可。设计好后点击保存即自动生成相应代码,只需要修改相应功能代码即可。

图13 GUI

        ① 普通按钮

        普通按钮如图14所示,拖到编辑区双击可以设置。主要设置参数如图15所示,从上到下依次是按钮背景颜色、按钮文本大小、按钮文本颜色、按钮文本内容、按钮标签。其中按钮标签是和程序对应起来的,每一个按钮标签对应一个函数。

图14 GUI——普通按钮
图15 GUI——普通按钮设置

        本次设计主要需要三个普通按钮,分别为加载网络(Tag:pushbutton1)、识别(Tag:pushbutton2)和清空(Tag:pushbutton3)。

图16 GUI——普通按钮

         对应的程序如下:

%加载网络
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(~, ~, ~)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global network                                       %训练的神经网络模型
[filename,filepath]=uigetfile({'*.mat'},'选择网络');  %打开文件夹,选择文件
if(isequal(filename,0)||isequal(filepath,0))         %如果取消就返回
    return;
end
load([filepath,filename], 'trainedNetwork_1');       %加载神经网络
network = trainedNetwork_1;   

%识别
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(~, ~, handles)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global network   %训练的神经网络模型
h = getframe;    %获得一帧坐标区图片
img = rgb2gray(h.cdata);   %转灰度图
I = 255 - img;             %转成黑色背景,白色字(同mnist数据集)
img = imresize(I,[28,28]); %修改图片大小(同mnist数据集)

[label,probs] = classify(network, img);  %识别图片
result = num2str(100*max(probs),3);      %图片相似度
res = strcat(result,"%");           
set(handles.edit1,'string',res)          %文本框中显示数字(edit1)
set(handles.edit2,'string',label)        %文本框中显示相似度(edit2)

%清空
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(~, ~, handles)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
cla(handles.axes1);             %清空坐标区
set(handles.edit1,'string','')  %清空文本框1
set(handles.edit2,'string','')  %清空文本框2

         ② 文本框

        文本框如图17所示,其设置与按钮类似。程序不需要修改。

图17 GUI——文本框

        ③ 静态文本

        静态文本是提示和说明作用,在文本框右边。

        ④ 坐标区

        坐标区如图18所示。在本次设计中坐标区主要作为手写板使用,其代码如下。

图18 GUI——坐标区
%手写板
function figure1_WindowButtonDownFcn(~, ~, handles)
global ButtonDown pos1
if strcmp(get(gcf, 'SelectionType'), 'normal')
    ButtonDown = 1;
    pos1 = get(handles.axes1, 'CurrentPoint');
end

function figure1_WindowButtonMotionFcn(~, ~, handles)
global ButtonDown pos1
if(ButtonDown == 1)
    pos = get(handles.axes1,'CurrentPoint');
    line([pos1(1,1) pos(1,1)], [pos1(1,2) pos(1,2)], 'Color','Black','LineStyle','-', 'LineWidth',8,'Marker','.', 'MarkerSize',20);
    pos1 = pos;
end

function figure1_WindowButtonUpFcn(~, ~, ~)
global ButtonDown
ButtonDown = 0;

function axes1_ButtonDownFcn(~, ~, ~)

        设计后的GUI如图19所示,其完整代码见最后。

图19 GUI——完整设计

        

4. 测试

图20 GUI运行
图21 GUI——加载网络按钮
图22 识别结果1
图23 识别结果2
图24 识别结果3

5. Mnist数据集

        https://pan.baidu.com/s/1Aabg7tNu6t4aAXnb1W-4MQ
        提取码:vaa9

6. GUI完整代码

function varargout = Netgui(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Netgui_OpeningFcn, ...
                   'gui_OutputFcn',  @Netgui_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

function Netgui_OpeningFcn(hObject, ~, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

function varargout = Netgui_OutputFcn(~, ~, handles) 
varargout{1} = handles.output;

%加载网络
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(~, ~, ~)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global network
[filename,filepath]=uigetfile({'*.mat'},'选择网络');
if(isequal(filename,0)||isequal(filepath,0))
    return;
end
load([filepath,filename], 'trainedNetwork_1');
network = trainedNetwork_1;

%识别
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(~, ~, handles)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global network
h = getframe;
img = rgb2gray(h.cdata);
I = 255 - img; 
img = imresize(I,[28,28]);

[label,probs] = classify(network, img); 
result = num2str(100*max(probs),3);
res = strcat(result,"%");
set(handles.edit1,'string',res)
set(handles.edit2,'string',label)

%清空
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(~, ~, handles)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
cla(handles.axes1);
set(handles.edit1,'string','')
set(handles.edit2,'string','')

%输出框1
function edit1_Callback(~, ~, ~)
function edit1_CreateFcn(hObject, ~, ~)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%输出框2
function edit2_Callback(~, ~, ~)
function edit2_CreateFcn(hObject, ~, ~)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%手写板
function figure1_WindowButtonDownFcn(~, ~, handles)
global ButtonDown pos1
if strcmp(get(gcf, 'SelectionType'), 'normal')
    ButtonDown = 1;
    pos1 = get(handles.axes1, 'CurrentPoint');
end

function figure1_WindowButtonMotionFcn(~, ~, handles)
global ButtonDown pos1
if(ButtonDown == 1)
    pos = get(handles.axes1,'CurrentPoint');
    line([pos1(1,1) pos(1,1)], [pos1(1,2) pos(1,2)], 'Color','Black','LineStyle','-', 'LineWidth',8,'Marker','.', 'MarkerSize',20);
    pos1 = pos;
end

function figure1_WindowButtonUpFcn(~, ~, ~)
global ButtonDown
ButtonDown = 0;

function axes1_ButtonDownFcn(~, ~, ~)

  • 24
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论
实现数字识别的方法有很多种,其中朴素贝叶斯算法是一种常用的方法之一。下面是基于MNIST数据集实现数字识别matlab代码,使用朴素贝叶斯算法: ```matlab % 读取MNIST数据集 [train_images, train_labels] = mnist_parse('train-images.idx3-ubyte', 'train-labels.idx1-ubyte'); [test_images, test_labels] = mnist_parse('t10k-images.idx3-ubyte', 't10k-labels.idx1-ubyte'); % 转换为灰度图像 train_images_gray = reshape(train_images, size(train_images,1)*size(train_images,2), size(train_images,3))'; test_images_gray = reshape(test_images, size(test_images,1)*size(test_images,2), size(test_images,3))'; % 将像素值归一化到[0,1] train_images_norm = double(train_images_gray) / 255; test_images_norm = double(test_images_gray) / 255; % 训练朴素贝叶斯分类器 nb_classifier = fitcnb(train_images_norm, train_labels); % 预测测试集 test_labels_pred = predict(nb_classifier, test_images_norm); % 计算准确率 accuracy = sum(test_labels_pred == test_labels) / length(test_labels); fprintf('Accuracy: %.2f%%\n', accuracy * 100); ``` 在上述代码中,我们首先使用`mnist_parse`函数读取MNIST数据集,并将图像转换为灰度图像,然后将像素值归一化到[0,1]。接着使用`fitcnb`函数训练朴素贝叶斯分类器,并使用`predict`函数预测测试集的标签。最后计算准确率并输出结果。 需要注意的是,MNIST数据集的格式有点特殊,需要使用`mnist_parse`函数进行解析。此外,朴素贝叶斯算法的优点是易于实现和快速训练,但是在一些复杂的分类问题上可能表现不佳。如果需要更高的准确率,可以尝试其他分类算法,比如支持向量机(SVM)和深度学习算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SudoReboot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值