【深度学习】基于知识库的手写体数字识别(Matlab代码实现)
随着我国现代技术的不断发展,手写数字识别技术中需要处理的数据样本量及特征指标大幅增加,也对处理数据模型和方法提出了更高的要求。支持向量机(SVM)、逻辑回归模型(LR)及决策树模型(DT)等新兴机器的学习方法虽然能够处理小样本等分类问题,但在处理多样本多特征数据时分类精度还有待改进。因此,本文以提升模型处理多样本和多特征指标数据集的分类预测性能为目标,对不同的基础模型进行集成应用分析。手写数字识别
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
随着我国现代技术的不断发展,手写数字识别技术中需要处理的数据样本量及特征指标大幅增加,也对处理数据模型和方法提出了更高的要求。支持向量机(SVM)、逻辑回归模型(LR)及决策树模型(DT)等新兴机器的学习方法虽然能够处理小样本等分类问题,但在处理多样本多特征数据时分类精度还有待改进。因此,本文以提升模型处理多样本和多特征指标数据集的分类预测性能为目标,对不同的基础模型进行集成应用分析。手写数字识别是计算机视觉的一项典型应用,其成果可广泛应用于邮政编码识别、统计报表识别、考试成绩判定等领域。针对单幅图像中多个手写数字的自动分割及识别问题,文中采用自适应二值化方法实现手写数字与背景的分割,利用基于方向投影的改进算法将各个数字依次进行分割提取,通过手写Minist训练数据集对卷积神经网络的LeNet-5模型进行训练,利用Tensorflow实现了单幅图像内多个手写数字的分割与识别。实验结果表明,文中方法具有较高的可靠性,训练后的模型对新的手写数字平均识别率在92%以上,达到了预期的效果。所以针对手写数字识别模型偏大、嵌入式系统芯片运算量有限等问题,开展基于机器视觉的手写数字识别系统设计研究。
一、研究背景与意义
手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一。由于手写数字的随意性很大,如笔画粗细、字体大小、倾斜角度等因素都有可能直接影响到字符的识别准确率,所以手写体数字识别是一个很有挑战性的课题。手写体数字识别技术具有广泛的应用前景,如例行年检、人口普查、财务、税务、邮件分拣等领域。
二、理论基础
手写体数字识别是一个跨学科的复杂问题,综合了图像处理、模式识别、机器学习等多个领域的知识。其识别过程一般包含图像预处理、特征提取、分类器的设定及其后处理等步骤。
- 图像预处理:主要解决定位、图像二值化、平滑化(去噪)、字符切分、规范化等问题。图像二值化是指将整个图像呈现出明显的黑白效果。此外,还需要正确分割整幅文档图像中的手写体数字,并进行归一化处理。
- 特征提取:从经过预处理后的数字图像中,提取出用以区分与其他数字类别的本质属性并数值化,形成特征矢量的过程。常见的手写体数字特征有模板特征、统计特征、结构特征和变换特征。
- 分类器:不同的分类方式对应不同的分类器,如神经网络、支持向量机等。利用训练出的分类器,对特征提取后的手写体数字进行分类识别。
三、算法流程
- 读入手写数字图片进行归一化处理,统一尺寸。默认为24×24图形块,并通过ostu算法进行二值化。
- 对二值化图像进行图像细化等形态学操作,并按照算法要求进行特征提取。
- 载入模板矩阵进行对比,选用欧式距离测度,得到识别结果。
在特征提取阶段,根据手写数字图像本身的结构特征,通过计算端点、指定方向直线的交叉点个数来作为特征向量。
四、模式识别
基于知识库的手写体数字识别系统,首先对0-9这10个数字进行结构分析并建模,然后提取相关特征,最后构造模板库。在实验过程中,选择规范手写和自由手写两组样本对知识库进行参数调整。通过计算样本对应分量的算术平均值获得知识库中特征向量的每个分量。
五、应用前景与挑战
手写体数字识别技术目前被广泛应用于财务报表、银行票据、户籍登记、税务信息、统计信息等方面。然而,该技术仍面临一些挑战,如手写体数据标注需要大量的人力、物力和时间,且标注质量难以保证;手写体识别模型在面对不同字体、不同书写风格的手写体时,泛化能力较弱;深度学习模型需要大量的计算资源进行训练和推理,对于一些资源有限的场景,难以应用。
六、结论与展望
基于知识库的手写体数字识别技术取得了一定的成果,但仍需进一步优化和改进。未来的研究可以集中在提高模型的泛化能力、优化算法流程、降低计算资源消耗等方面。同时,也可以探索将深度学习与其他技术相结合,以提高手写体数字识别的准确性和效率。
📚2 运行结果
点击运行之后会自动进入放有手写数字的文件夹,然后选择你想要识别的数字确定即可自动识别。
识别成功!
这里再展示一个数字6吧!
识别成功!
其他的数字也是一样的操作。
部分代码:
clc; clear all; close all;
load Data.mat;
[FileName,PathName,FilterIndex] = uigetfile({'*.jpg;*.tif;*.png;*.gif', ...
'所有图像文件';...
'*.*','所有文件' },'载入数字图像',...
'.\\images\\手写数字\\t0.jpg');
if isequal(FileName, 0) || isequal(PathName, 0)
return;
end
fileName = fullfile(PathName, FileName);
I = imread(fileName);
flag = 1;
I1 = Normalize_Img(I);
bw1 = Bw_Img(I1);
bw2 = Thin_Img(bw1);
bw = bw2;
sz = size(bw);
[r, c] = find(bw==1);
rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)];
vs = rect(1)+rect(3)*[5/12 1/2 7/12];
hs = rect(2)+rect(4)*[1/3 1/2 2/3];
pt1 = [rect(1:2); rect(1:2)+rect(3:4)];
pt2 = [rect(1)+rect(3) rect(2); rect(1) rect(2)+rect(4)];
k1 = (pt1(1,2)-pt1(2,2)) / (pt1(1,1)-pt1(2,1));
x1 = 1:sz(2);
y1 = k1*(x1-pt1(1,1)) + pt1(1,2);
k2 = (pt2(1,2)-pt2(2,2)) / (pt2(1,1)-pt2(2,1));
x2 = 1:sz(2);
y2 = k2*(x2-pt2(1,1)) + pt2(1,2);
if flag
figure('Name', '数字识别', 'NumberTitle', 'Off', 'Units', 'Normalized', 'Position', [0.2 0.45 0.5 0.3]);
subplot(2, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold');
subplot(2, 2, 2); imshow(I1, []); title('归一化图像', 'FontWeight', 'Bold');
hold on;
h = rectangle('Position', [rect(1:2)-1 rect(3:4)+2], 'EdgeColor', 'r', 'LineWidth', 2);
xlabel('数字区域标记');
subplot(2, 2, 3); imshow(bw1, []); title('二值化图像', 'FontWeight', 'Bold');
subplot(2, 2, 4); imshow(bw, [], 'Border', 'Loose'); title('细化图像', 'FontWeight', 'Bold');
hold on;
h = [];
for i = 1 : length(hs)
h = [h plot([1 sz(2)], [hs(i) hs(i)], 'r-')];
end
for i = 1 : length(vs)
h = [h plot([vs(i) vs(i)], [1 sz(1)], 'g-')];
end
h = [h plot(x1, y1, 'y-')];
h = [h plot(x2, y2, 'm-')];
legend([h(1) h(4) h(7) h(8)], {'水平线', '竖直线', '左对角线', '右对角线'}, 'Location', 'BestOutside');
hold off;
end
v{1} = [1:sz(2); repmat(hs(1), 1, sz(2))]';
v{2} = [1:sz(2); repmat(hs(2), 1, sz(2))]';
v{3} = [1:sz(2); repmat(hs(3), 1, sz(2))]';
v{4} = [repmat(vs(1), 1, sz(1)); 1:sz(1)]';
v{5} = [repmat(vs(2), 1, sz(1)); 1:sz(1)]';
v{6} = [repmat(vs(3), 1, sz(1)); 1:sz(1)]';
v{7} = [x1; y1]';
v{8} = [x2; y2]';
for i = 1 : 8
num(i) = GetImgLinePts(bw, round(v{i})-1);
end
num(9) = sum(sum(endpoints(bw)));
result = MaskRecon(Datas, num);
msgbox(sprintf('识别结果:%d', result), '提示信息', 'modal');
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]徐云,杨承翰,高磊.利用机器视觉的手写数字识别系统设计研究[J].自动化仪表,2022,43(09):10-13.DOI:10.16086/j.cnki.issn1000-0380.2021100030.
[2]黄贻望,雷彪.基于SVM的数字识别系统设计[J].信息技术与信息化,2022(12):52-57.
🌈4 Matlab代码实现
更多推荐
所有评论(0)