使用Python实现手写数字识别

引言

手写数字识别是“光学字符识别技术”(简称OCR)的一个分支,它研究的对象是:如何利用电子计算机自动辨认人手写在纸张上的阿拉伯数字。

在整个OCR领域中,最为困难的就是脱机手写字符的识别。到目前为止,尽管人们在脱机手写英文、汉字识别的研究中已取得很多可喜成就,但距实用还有一定距离。而在手写数字识别这个方向上,经过多年研究,研究工作者已经开始把它向各种实际应用推广,为手写数据的高速自动输入提供了一种解决方案。在此基础上,手写算式识别作为手写数字识别中的一项衍生分支,也逐渐被提上日程。

本文将简单介绍如何使用Python实现手写数字识别。

正文:

使用MNIST手写数据集进行手写数字识别。使用传统的多层感知机等神经网络模型不能很好地解决此类问题,因为这种模型直接读取图像的原始像素,基于图像的原始像素进行分类。然而,图像特征的提取还需要人工设计函数进行提取。卷积神经网络模型可以很好地对图像进行自动的特征提取。

MNIST数据集是什么?

(1)该数据集包含60,000个用于训练的示例和10,000个用于测试的示例。
(2)数据集包含了0-9共10类手写数字图片,每张图片都做了尺寸归一化,都是28x28大小的灰度图。
(3)MNIST数据集包含四个部分:
训练集图像:train-images-idx3-ubyte.gz(9.9MB,包含60000个样本)
训练集标签:train-labels-idx1-ubyte.gz(29KB,包含60000个标签)
测试集图像:t10k-images-idx3-ubyte.gz(1.6MB,包含10000个样本)
测试集标签:t10k-labels-idx1-ubyte.gz(5KB,包含10000个标签)

本次实验中各个模块的交互逻辑如下图所示。

代码实现:

本次使用Python进行编写代码,使用的是tensorflow中封装好的Sequential等模块。其中比较重要的步骤有:

由于图片和Excel表格是分开的,需要对数据进行比较大的处理,使得机器学习模型能够知道图片对应的数字。而这一块就比较复杂具体代码如下:


# 设置训练集图片所在文件夹路径和对应的Excel文件路径(根据实际情况修改)
train_images_folder = r'./train/train'
train_excel_path = 'train.xlsx'

# 读取训练集Excel文件数据
train_df = pd.read_excel(train_excel_path)

# 用于存储训练集图片数据和对应标签的列表
train_images_list = []
train_labels_list = []

# 遍历训练集Excel文件中的每一行数据
for index, row in train_df.iterrows():
    img_name = row['Column1']
    print(img_name)
    img_name = str(img_name)
    label = row['Column2']
    # 构建正确的图片文件路径,确保路径拼接正确
    img_path = os.path.join(train_images_folder, img_name+'.png')
    if not os.path.exists(img_path):
        print(f"警告:训练集图片 {img_path} 不存在,跳过该图片")
        continue
    img = Image.open(img_path).convert('RGB')
    img = img.resize((28, 28))
    img_array = np.array(img) / 255.0
    train_images_list.append(img_array)
    train_labels_list.append(label)

# 将列表转换为numpy数组
train_images = np.array(train_images_list)
train_labels = np.array(train_labels_list)

# 对训练集标签进行独热编码,适配多分类任务
train_labels_encoded = tf.keras.utils.to_categorical(train_labels, num_classes=10)

# 定义训练集数据生成器函数,按批次生成数据
def train_data_generator():
    batch_size = 32
    num_batches = len(train_images) // batch_size
    for i in range(num_batches):
        start_idx = i * batch_size
        end_idx = (i + 1) * batch_size
        yield train_images[start_idx:end_idx], train_labels_encoded[start_idx:end_idx]
    if len(train_images) % batch_size!= 0:
        yield train_images[num_batches * batch_size:], train_labels_encoded[num_batches * batch_size:]

在处理完数据之后,就需要构建神经网络,包括输入、输出、隐藏层,层数、以及每一层的节点数都需要提前设置。

之后便是选择使用什么优化器等进行训练模型,训练完模型之后就是评估模型的优劣,最后可以使用某一张图片,查看预测的如何。可以看见预测的还算比较准确。

如果想要进一步学习相关,可以加入公式识别等功能,并实现计算。

你可能感兴趣的:(python,计算机视觉,深度学习)