手写电话号码识别

1.引言

在之前的两篇博客中,我们深入探讨了手写数字识别的相关工作。第一篇博客聚焦于手写数字识别的基本基本方法,介绍了常用的图像处理技术和基础的深度学习模型。我们通过这篇博客为读者奠定了对手写数字识别领域的基本了解。
第二篇博客则深入研究了如何通过深度学习来训练一个手写数字识别的模型。我们讨论了数据集的准备、模型的设计和训练过程,为读者提供了从理论到实践的全面指南。这两篇博客奠定了我们在手写数字识别领域的技术基础。
同时,为了使这个项目更加完善,我查阅了网上的详细资料,深入了解了当前手写识别领域的最新进展。不难发现手写识别领域近年来取得了许多重要的进展,包括深度学习方法的应用、端到端的手写识别系统、多模态手写识别、增量学习和跨领域应用。这些进展为手写识别技术的发展和应用提供了新的可能性。
综合前两篇博客,接下来将深入研究如何将手写数字识别的技术拓展到手写电话号码的识别领域,以提供更广泛的实际应用价值。

2.项目概述

2.1 选择电话号码识别的原因:

手写电话号码识别作为一个项目的选择,源于对日常实际应用的深刻理解。在现代生活中,电话号码经常出现在各种场景,例如名片、手写便签、照片等。有效地从这些手写文本中提取电话号码具有广泛的应用价值。

2.2 方法概述:

为了实现手写电话号码的准确识别,我们设计了以下方法流程:

2.2.1 数字图像处理:

首先,我们通过数字图像处理阶段,对包含手写电话号码的图片进行预处理。这一阶段的关键步骤包括:

  • 图像获取: 从不同来源(照片、扫描件等)获取包含手写电话号码的图片。

  • 数字区域提取:使用图像处理技术,通过二值化和轮廓查找,提取图像中的数字区域。

  • 切割和定位: 利用图像处理技术,将图片中的电话号码分割成单个数字,并记录其在原图中的位置信息。

2.2.2 深度学习模型识别:

在数字图像处理后,我们引入深度学习模型来实现对单个数字的准确识别。这一阶段包括:

  • 模型输入: 将切割后的单个数字输入先前训练好的到深度学习模型中。
  • 模型输出: 模型输出识别结果,即单个数字的预测值。存储到一个数组中。
  • 打印输出:识别完过后,打印输出。

3.操作实例解析

3.1数字图像处理

在手写电话号码识别的项目中,数字图像处理是至关重要的一步。这一部分将详细介绍我们是如何从原始图像中提取出单个数字的区域的。

3.1.1加载原始图像:

首先,我们通过OpenCV库加载了一张手写电话号码的图像。这个图像以灰度形式存储,为后续处理做好准备。

import cv2
import matplotlib.pyplot as plt

phone_number_image = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)
3.1.2 数字区域提取:

我们使用了图像处理技术,主要包括二值化和轮廓查找,以便准确地提取出手写电话号码中的数字。首先,我们进行二值化,将图像分为字符和背景,然后通过轮廓查找找到字符的边界。

_, thresholded = cv2.threshold(phone_number_image, 128, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
3.1.3 显示原始图像:

在这一步,我们使用Matplotlib库创建了一个子图,展示了加载的原始图像。这有助于读者直观地了解我们处理的图像是什么样子的。

plt.subplot(1, 2, 1)
plt.imshow(phone_number_image, cmap='gray')
plt.title('Original Image')

在这里插入图片描述

3.1.4 显示分割后的数字区域:

接下来,我们通过遍历找到的轮廓,筛选出符合最小宽度和高度要求的数字区域,并将其存储在digit_regions列表中。然后,我们在第二个子图中展示了这些数字区域。

plt.subplot(1, 2, 2)
digit_regions = []
min_width, min_height = 10, 10

for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    if w >= min_width and h >= min_height:
        digit_region = phone_number_image[y:y + h, x:x + w]
        digit_regions.append(digit_region)

for digit_region in digit_regions:
    plt.imshow(digit_region, cmap='gray')
    plt.show()  # 显示每个数字区域

plt.title('Digit Regions')
plt.show()

在这里插入图片描述

3.2数字预测与输出

在这一部分,我们将继续对切割好的数字区域进行深度学习模型的单个预测,并将结果输出。

3.2.1初始化手写数字识别模型

首先,我们需要加载预先训练好的深度学习模型,并设置为评估模式。

pytorch_model = SimpleNet()
pytorch_model.load_state_dict(torch.load('mnist_model.pth'))
pytorch_model.eval()
3.2.2 预测数字区域:

对于每个数字区域,将其转为 PIL Image,并进行预处理操作,包括缩放、转为张量、归一化。将处理后的数字区域传入预训练的 PyTorch 模型进行推理。获取推理结果,并将结果添加到 predicted_digits 列表中。

predicted_digits = []

for i, digit_region in enumerate(digit_regions):
    # 将数字区域转为 PIL Image,并进行预处理
    digit_image = Image.fromarray(digit_region)
    transform = transforms.Compose([
        transforms.Resize((28, 28)),
        transforms.ToTensor(),
        transforms.Normalize((0.5,), (0.5,))
    ])
    digit_image = transform(digit_image)
    digit_image = digit_image.unsqueeze(0)  # 添加批次维度

    # 使用 PyTorch 模型进行推理
    with torch.no_grad():
        output = pytorch_model(digit_image)

    # 获取预测结果
    _, predicted = torch.max(output, 1)
    predicted_digits.append(str(predicted.item()))  # 转为字符串
3.2.3输出预测结果列表:

将预测结果列表中的数字连接成一个连续的字符串,并输出。

# 输出预测结果列表
predicted_phone_number = ''.join(predicted_digits)
print("结果为:", predicted_phone_number)
3.2.4显示切割好的数字区域及其预测结果:

使用 Matplotlib 将切割好的数字区域及其对应的预测结果横向显示出来,方便观察。

# 横向显示切割好的数字区域及其预测结果
fig, axes = plt.subplots(1, len(digit_regions), figsize=(12, 4))

for i, digit_region in enumerate(digit_regions):
    axes[i].imshow(digit_region, cmap='gray')
    axes[i].set_title(predicted_digits[i])
    axes[i].axis('off')  # 隐藏坐标轴

plt.show()

4.错误分析

就预测结果而言,存在一些误识别的情况,应该是数据偏差导致模型无法泛化到新的情况。同时模型的结构也过于简单,无法捕捉复杂的手写数字特征。

4.1改进方法

  • 增加训练数据: 引入更多多样性的手写数字,尤其是那些模型容易误识别的样本,以提高泛化能力。
  • 模型调优: 尝试调整模型的超参数、增加网络层数或神经元数量,以提高模型的复杂度和表达能力。
  • 数据预处理: 检查图像预处理阶段是否存在问题,例如阈值设置、图像大小等,以确保数字区域清晰可辨。

当然,以上结果均来自于经验的猜测,后续有时间会去进行验证。

5.总结

这篇博客探讨了一个小型手写数字识别项目的思路和实现过程。通过前两篇博客,我们首先介绍了手写数字识别的基础知识,并详细讲解了如何使用深度学习训练一个手写数字识别模型。随后,我们提出并尝试将这一模型应用于手写电话号码的识别。

在手写电话号码识别的项目中,我们通过数字图像处理将包含电话号码的图片分割成单个数字的图片,并利用之前训练好的手写数字识别模型对每个数字进行识别。尽管项目在实践中遇到了一些挑战,包括阈值设定、模型预测准确性等方面的问题,但这些问题为我提供了宝贵的学习经验。

这个小项目仅仅是探索深度学习在实际问题中应用的冰山一角。虽然取得了一些成果,但也暴露出很多不足之处。未来,我将着手改进这个项目,探索新的方法来提高识别准确性、增强模型的鲁棒性,并解决其他可能存在的问题。这个过程将是一个不断学习、不断改进的循环,希望通过这个小小的项目能够激发更多关于深度学习应用的思考和探索。

6.参考文献

[1]过去几十年在线手写识别的进展Computer Science Review ( IF 12.9 ) Pub Date : 2022-11-02 , DOI: 10.1016/j.cosrev.2022.100515
[2]什么是手写识别?手写识别的方法、好处和挑战-网易伏羲
[3] 人工智能最新研究发展方向–一文诠释最前沿的OCR文字识别技术【干货普及知识点】 - 知乎
[4]一种基于自学习的手写表格数字字符串快速识别的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值