当前位置: 代码迷 >> 综合 >> 【图像识别】基于卷积神经网络CNN手写数字识别matlab代码
  详细解决方案

【图像识别】基于卷积神经网络CNN手写数字识别matlab代码

热度:96   发布时间:2023-12-03 22:44:25.0

1 简介

针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于原始图像包含各种各样的噪声,为了防止造成干扰,对图像进行去噪,滤波等处理;然后,在MATLAB中构建卷积神经网络(cNN)模型结构,采用CNN模型中典型的LeNET-5的卷积模型,通过对采集图像进行逐层学习,训练与测试,将学习得到的高层特征用于手写数字识别.以随机手写数字与字母进行图像验证,结果表明,该模型算法应用于手写数字或字母准确识别,可获得较高的识别率,具有一定的通用性.

就卷积神经网络而言,其低隐层包括两大部分:卷积层和采样层,高层则是逻辑回归分类器以及由全连接层与多层感知器所对应的隐含层。输入到第一个全连接层的特征图像是提取子采样层以及卷积层的特征而得到的。最后一个输出层属于分类器,以输入图像为对象可利用逻辑回归作出分类,支持向量机算法也同样可以。传统神经网络最为常见的激活函数为 ReLU 和tanh,正是由于上述函数的存在神经网络具备了非线性映射能力。站在数学的视角上对上述函数展开分析,非线性函数 ReLU 和 tanh 对两侧区表现出较小的信号增益,对中央区则表现出较大的增益,就特征空间映射而言,效果还是相当好的。ReLU和 tanh 的公式如下:

2 部分代码

%% 准备工作空间
clc
clear all
close all
%% 导入数据
digitDatasetPath = fullfile('./', '/HandWrittenDataset/');
imds = imageDatastore(digitDatasetPath, ...'IncludeSubfolders',true,'LabelSource','foldernames');% 采用文件夹名称作为数据标记
%,'ReadFcn',@mineRF% 数据集图片个数
countEachLabel(imds)numTrainFiles = 17;% 每一个数字有22个样本,取17个样本作为训练数据
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
% 查看图片的大小
img=readimage(imds,1);
size(img)%% 定义卷积神经网络的结构
layers = [
% 输入层
imageInputLayer([28 28 1])
% 卷积层
convolution2dLayer(5,6,'Padding',2)
batchNormalizationLayer
reluLayermaxPooling2dLayer(2,'stride',2)convolution2dLayer(5, 16)
batchNormalizationLayer
reluLayermaxPooling2dLayer(2,'stride',2)convolution2dLayer(5, 120)
batchNormalizationLayer
reluLayer
% 最终层
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];%% 训练神经网络
% 设置训练参数
options = trainingOptions('sgdm',...'maxEpochs', 50, ...'ValidationData', imdsValidation, ...'ValidationFrequency',5,...'Verbose',false,...'Plots','training-progress');% 显示训练进度% 训练神经网络,保存网络
net = trainNetwork(imdsTrain, layers ,options);
save 'CSNet.mat' net%% 标记数据(文件名称方式,自行构造)
mineSet = imageDatastore('./hw22/',  'FileExtensions', '.jpg',...'IncludeSubfolders', false);%%,'ReadFcn',@mineRF
mLabels=cell(size(mineSet.Files,1),1);
for i =1:size(mineSet.Files,1)
[filepath,name,ext] = fileparts(char(mineSet.Files{i}));
mLabels{i,1} =char(name);
end
mLabels2=categorical(mLabels);
mineSet.Labels = mLabels2;%% 使用网络进行分类并计算准确性
% 手写数据
YPred = classify(net,mineSet);
YValidation =mineSet.Labels;
% 计算正确率
accuracy = sum(YPred ==YValidation)/numel(YValidation);
% 绘制预测结果
figure;
nSample=10;
ind = randperm(size(YPred,1),nSample);
for i = 1:nSamplesubplot(2,fix((nSample+1)/2),i)
imshow(char(mineSet.Files(ind(i))))
title(['预测:' char(YPred(ind(i)))])
if char(YPred(ind(i))) ==char(YValidation(ind(i)))xlabel(['真实:' char(YValidation(ind(i)))])
elsexlabel(['真实:' char(YValidation(ind(i)))],'color','r')
endend% 伸缩+反色
% function data =mineRF(filename)
% img= imread(filename);
% data=uint8(255-rgb2gray(imresize(img,[28 28])));
% 
% end% 二值化 
% function data =mineRF(filename)
% img= imread(filename);
% data=imbinarize(img);
% 
% end

3 仿真结果

4 参考文献

[1]高磊, 洪奔奔, and 姚青岐. "基于卷积神经网络的随机手写数字识别." 软件 39.9(2018):5.

**部分理论引用网络文献,若有侵权联系博主删除。**

5 MATLAB代码与数据下载地址

见博客主页

  相关解决方案