【深度学习】基于知识库的手写体数字识别(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

随着我国现代技术的不断发展,手写数字识别技术中需要处理的数据样本量及特征指标大幅增加,也对处理数据模型和方法提出了更高的要求。支持向量机(SVM)、逻辑回归模型(LR)及决策树模型(DT)等新兴机器的学习方法虽然能够处理小样本等分类问题,但在处理多样本多特征数据时分类精度还有待改进。因此,本文以提升模型处理多样本和多特征指标数据集的分类预测性能为目标,对不同的基础模型进行集成应用分析。手写数字识别是计算机视觉的一项典型应用,其成果可广泛应用于邮政编码识别、统计报表识别、考试成绩判定等领域。针对单幅图像中多个手写数字的自动分割及识别问题,文中采用自适应二值化方法实现手写数字与背景的分割,利用基于方向投影的改进算法将各个数字依次进行分割提取,通过手写Minist训练数据集对卷积神经网络的LeNet-5模型进行训练,利用Tensorflow实现了单幅图像内多个手写数字的分割与识别。实验结果表明,文中方法具有较高的可靠性,训练后的模型对新的手写数字平均识别率在92%以上,达到了预期的效果。所以针对手写数字识别模型偏大、嵌入式系统芯片运算量有限等问题,开展基于机器视觉的手写数字识别系统设计研究。

📚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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写体数字识别是一项非常常见的任务,可以应用于许多领域,如金融、医疗等。本文介绍基于知识库手写体数字识别的Python实现。 1. 数据集准备 我们使用MNIST数据集,它包含许多手写数字的图像。可以使用以下代码从Keras库中下载数据集: ```python from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() ``` 在MNIST数据集中,每个图像都是28x28像素。我们可以将每个像素的值缩放到0到1之间,这样可以提高训练的效率。 ```python train_images = train_images.astype('float32') / 255 test_images = test_images.astype('float32') / 255 ``` 2. 创建知识库 我们可以使用K-最近邻算法(KNN)来创建知识库。KNN是一种常见的机器学习算法,它可以用于分类和回归。 在KNN中,我们需要计算测试图像与训练图像之间的距离。然后,我们选择距离最近的k个训练图像,并将它们的标签作为预测结果。 下面是一个简单的KNN实现: ```python from collections import Counter import numpy as np class KNN: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y def predict(self, X): predictions = [] for i in range(len(X)): distances = np.sqrt(np.sum((self.X_train - X[i])**2, axis=1)) k_nearest_neighbors = self.y_train[np.argsort(distances)[:self.k]] most_common = Counter(k_nearest_neighbors).most_common(1) predictions.append(most_common[0][0]) return np.array(predictions) ``` 3. 训练和测试模型 现在,我们可以使用KNN来训练和测试我们的模型。在这里,我们使用前1000个样本来训练模型,并使用下一个1000个样本来测试模型。 ```python knn = KNN(k=3) knn.fit(train_images[:1000].reshape(-1, 784), train_labels[:1000]) predictions = knn.predict(test_images[1000:2000].reshape(-1, 784)) accuracy = np.mean(predictions == test_labels[1000:2000]) print('Accuracy: %.2f%%' % (accuracy * 100)) ``` 输出: ``` Accuracy: 89.20% ``` 4. 可视化结果 最后,我们可以可视化一些测试图像和它们的预测结果: ```python import matplotlib.pyplot as plt for i in range(10): plt.subplot(2, 5, i+1) plt.imshow(test_images[i+1000], cmap='gray') plt.title(predictions[i]) plt.axis('off') plt.show() ``` 输出: ![image](https://user-images.githubusercontent.com/26833433/119172020-9ab2f100-ba8c-11eb-8b7d-8e1d3cc1c6c5.png) 以上就是基于知识库手写体数字识别的Python实现。虽然KNN算法相对简单,但它在许多任务中表现出色,特别是在小型数据集上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值