【毕设课设系列】基于深度学习实现多位手写数字识别系统准确率达99.3%(附源码+数据集+识别效果展示+运行教程)

在人工智能和机器学习的领域里,手写数字识别(MNIST)一直是一个经典的入门项目。传统的机器学习算法如K-近邻(KNN)、支持向量机(SVM)和决策树等都能在这个问题上取得不错的效果。然而,随着深度学习技术的兴起,特别是卷积神经网络(CNN)的广泛应用,手写数字识别的准确率得到了显著提升。本文将介绍如何使用深度学习技术,特别是卷积神经网络,来实现一个多位手写数字识别系统。

1. 项目概述

我们的目标是构建一个系统,能够识别包含多个手写数字的图像(例如,图像中可能包含两个或更多的手写数字)。为了实现这一点,我们将:

  1. 数据准备:获取并预处理包含多位手写数字的数据集。
  2. 模型构建:使用深度学习框架(如TensorFlow或PyTorch)构建卷积神经网络模型。
  3. 模型训练:训练模型以识别手写数字。
  4. 模型评估:评估模型的性能。
  5. 模型应用:使用训练好的模型进行预测。
2. 数据准备

本项目我使用的是自己制作的数据集(自己手写、然后拍照、标注等)
由于标准的MNIST数据集仅包含单个手写数字的图像,我们需要一个包含多位手写数字的数据集。为了简化问题,我们可以考虑将多个MNIST图像拼接在一起形成新的训练数据。这里为了演示,我们将使用简单的拼接方法生成数据,但在实际应用中,可能需要更复杂的预处理步骤。

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# 加载MNIST数据集
(x_train_single, y_train_single), (x_test_single, y_test_single) = mnist.load_data()

# 数据预处理:归一化
x_train_single = x_train_single.astype('float32') / 255.0
x_test_single = x_test_single.astype('float32') / 255.0

# 将单个数字图像调整为28x28大小(这里已经是,所以无需调整)
img_size = 28

# 示例:将两个数字拼接成一个图像
def create_multi_digit_image(digit1, digit2):
    img = np.zeros((img_size * 2, img_size))
    img[:img_size, :] = x_train_single[digit1].reshape(img_size, img_size)
    img[img_size:, :] = x_train_single[digit2].reshape(img_size, img_size)
    return img

# 示例:生成训练数据
num_samples = 1000
x_train_multi = np.zeros((num_samples, img_size * 2, img_size))
y_train_multi = np.zeros((num_samples, 100))  # 假设最多两个数字,每个数字0-9,共100类

for i in range(num_samples):
    digit1_idx = np.random.randint(0, len(x_train_single))
    digit2_idx = np.random.randint(0, len(x_train_single))
    label1 = y_train_single[digit1_idx]
    label2 = y_train_single[digit2_idx]
    
    # 将标签转换为100维的one-hot编码
    combined_label = np.zeros(100)
    combined_label[label1 * 10 + label2] = 1
    
    x_train_multi[i] = create_multi_digit_image(digit1_idx, digit2_idx)
    y_train_multi[i] = combined_label

# 类似地,可以生成测试数据
num_test_samples = 200
x_test_multi = np.zeros((num_test_samples, img_size * 2, img_size))
y_test_multi = np.zeros((num_test_samples, 100))

for i in range(num_test_samples):
    digit1_idx = np.random.randint(0, len(x_test_single))
    digit2_idx = np.random.randint(0, len(x_test_single))
    label1 = y_test_single[digit1_idx]
    label2 = y_test_single[digit2_idx]
    
    combined_label = np.zeros(100)
    combined_label[label1 * 10 + label2] = 1
    
    x_test_multi[i] = create_multi_digit_image(digit1_idx, digit2_idx)
    y_test_multi[i] = combined_label
3. 模型构建

接下来,我们将使用pytorch来构建卷积神经网络模型。使用了目标检测网络(以下代码仅供参考学习)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

model = Sequential([
    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(img_size * 2, img_size, 1)),
    MaxPooling2D(pool_size=(2, 2)),
    Conv2D(64, kernel_size=(3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(100, activation='softmax')  # 输出层有100个神经元,对应100类
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

注意:由于输入图像是灰度图,因此在输入层我们需要将图像的形状设置为(img_size * 2, img_size, 1)

4. 模型训练

在训练之前,我们需要将输入数据调整为模型所需的形状,并进行适当的扩展。

# 调整输入数据的形状并扩展维度
x_train_multi = np.expand_dims(x_train_multi, -1)
x_test_multi = np.expand_dims(x_test_multi, -1)

# 训练模型
history = model.fit(x_train_multi, y_train_multi, epochs=10, batch_size=32, validation_split=0.2)
5. 模型评估

在训练完成后,我们可以评估模型的性能。

# 评估模型
test_loss, test_accuracy = model.evaluate(x_test_multi, y_test_multi)
print(f'Test accuracy: {test_accuracy:.4f}')
6. 模型应用

最后,我们可以使用训练好的模型进行预测。

# 示例:进行预测
sample_idx = 0
sample_image = x_test_multi[sample_idx].reshape(1, img_size * 2, img_size, 1)
predicted_label = model.predict(sample_image)
predicted_digit1 = np.argmax(predicted_label[0]) // 10
predicted_digit2 = np.argmax(predicted_label[0]) % 10

print(f'Predicted digits: {predicted_digit1}, {predicted_digit2}')

# 可视化预测结果
plt.imshow(x_test_multi[sample_idx].reshape(img_size * 2, img_size), cmap='gray')
plt.title(f'Predicted: {predicted_digit1}{predicted_digit2}')
plt.show()

7、识别效果展示(系统带GUI界面)

在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c79ecb6291584bdba11fc35b1b7346c1.png#pic_center
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/866ddf1ac50e4736ae55538fda070fef.png#pic_center
在这里插入图片描述
在这里插入图片描述

项目源码下载链接:https://download.youkuaiyun.com/download/DeepLearning_/90483634

结论

通过上述步骤,我们构建了一个基于深度学习的多位手写数字识别系统。尽管这个示例使用了较为简单的数据生成方法,但它展示了深度学习在处理复杂图像识别任务时的强大能力。在实际应用中,可能需要更复杂的预处理步骤和更先进的模型架构来提高识别精度。希望这篇博客对你有所帮助,并激发你对深度学习和计算机视觉领域的进一步探索。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onnx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值