当前位置: 首页 > news >正文

从图像到精准文字:基于PyTorch与CTC的端到端手写文本识别实战

在数字化时代,手写文本识别(Handwritten Text Recognition,HTR)作为人工智能领域的重要研究方向之一,广泛应用于文档数字化、历史资料保存、自动化数据录入等多个领域。本文将深入探讨如何利用 IAM 手写数据库(IAM Handwriting Database)构建一个高效、准确的手写文本识别系统,采用 PyTorch 框架,并结合 Connectionist Temporal Classification(CTC)损失函数进行训练和推理。


一、IAM 手写数据库简介

IAM 手写数据库是一个广泛使用的英文手写文本数据集,包含了多位作者手写的文本样本。该数据库提供了丰富的手写行图像及其对应的文本标注,适用于训练和评估手写文本识别模型。

IAM 手写数据库官网:https://fki.tic.heia-fr.ch/databases/iam-handwriting-database

在这里插入图片描述


二、构建手写文本识别模型

PyTorch 官方网站:https://pytorch.org/

Gradio 官方网站:https://gradio.app/

1. 数据预处理

在使用 IAM 数据库进行训练之前,首先需要对数据进行预处理。这包括读取图像文件、解析标注文件、进行图像尺寸调整和归一化处理等。特别地,对于标注文件中的 | 字符,应替换为空格,以确保标签的正确性。

def parse_annotations(anno_path="/content/lines.txt"):pairs = []with open(anno_path, "r", encoding="utf-8") as f:for line in f:if line.startswith("#"):  # 跳过注释continueparts = line.strip().split(" ")if parts[1] != "ok":  # 有些行无效continueline_id = parts[0]subdir = line_id[:3]subsub = line_id[:7]img_path = f"/content/lines/{subdir}/{subsub}/{line_id}.png"if os.path.exists(img_path):text = " ".join(parts[8:])text = text.replace("|", " ")  # 替换为真实空格pairs.append((img_path, text))return pairs

2. 模型架构设计

构建手写文本识别模型时,常采用卷积神经网络(CNN)与循环神经网络(RNN)的结合。CNN用于提取图像特征,RNN用于序列建模,CTC 损失函数用于处理输入与输出长度不一致的问题。以下是一个基于 PyTorch 的模型示例:

import torch
import torch.nn as nnclass CRNN(nn.Module):def __init__(self, num_classes):super().__init__()self.cnn = nn.Sequential(nn.Conv2d(1, 64, 3, 1, 1), nn.ReLU(), nn.MaxPool2d(2,2),nn.Conv2d(64,128,3,1,1), nn.ReLU(), nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,1,1), nn.ReLU(),nn.Conv2d(256,256,3,1,1), nn.ReLU(), nn.MaxPool2d((2,1)))self.rnn = nn.LSTM(256*4, 256, bidirectional=True, num_layers=2, batch_first=True)self.fc = nn.Linear(512, num_classes)def forward(self, x):x = self.cnn(x)  # (B, C, H, W)b,c,h,w = x.size()x = x.permute(0,3,1,2).contiguous().view(b,w,c*h)  # (B, W, C*H)x, _ = self.rnn(x)x = self.fc(x)return x

3. 模型训练与评估

在模型训练过程中,使用 CTC 损失函数进行优化。训练过程中,监控损失值的变化,以评估模型的学习进展。以下是训练循环的示例代码:

import torch.optim as optim
import torch.nn as nnmodel = CRNN(num_classes=len(char2idx)+1).cuda()
criterion = nn.CTCLoss(blank=0, zero_infinity=True)
optimizer = optim.AdamW(model.parameters(), lr=1e-3)for epoch in range(50):model.train()total_loss = 0for imgs, labels, lengths in train_loader:imgs = imgs.cuda()labels = labels.cuda()logits = model(imgs)  # (B, W, num_classes)log_probs = logits.log_softmax(2).permute(1,0,2) # for CTC: (T,B,C)input_lengths = torch.full(size=(logits.size(0),), fill_value=logits.size(1), dtype=torch.long).cuda()loss = criterion(log_probs, labels, input_lengths, lengths.cuda())optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}/50, Loss: {total_loss/len(train_loader):.4f}")

三、模型推理与展示

训练完成后,可以使用 Gradio 库构建一个简单的 Web 界面,进行模型推理展示。用户可以上传手写文本图像,模型将返回识别结果。

import gradio as gr
import torch
import cv2def recognize(img):img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)img = cv2.resize(img, (128,32))img = img.astype("float32")/255.0img = torch.tensor(img).unsqueeze(0).unsqueeze(0).cuda()model.eval()with torch.no_grad():logits = model(img)return decode_greedy(logits)[0]demo = gr.Interface(fn=recognize, inputs="image", outputs="text")
demo.launch()

通过上述代码,用户可以在浏览器中上传手写文本图像,实时获取识别结果,极大地方便了手写文本的数字化处理。


四、进一步的优化与探索

尽管上述模型已能实现基本的手写文本识别,但仍有提升空间。例如,可以尝试更深层次的网络结构、更复杂的 RNN 模型(如 GRU、Transformer)、数据增强技术等,以提高模型的准确性和鲁棒性。

此外,结合外部词典进行后处理、使用注意力机制进行序列建模、采用端到端的序列到序列模型等方法,也可能带来性能的提升。

http://www.dtcms.com/a/411297.html

相关文章:

  • 使用 PyTorch 实现 CIFAR-10 图像分类:从数据加载到模型训练全流程
  • 网站开发公司能否挣钱怎么在网站空间上传文件
  • 亭湖区建设局网站楼盘网站开发报价
  • java后端工程师进修ing(研一版‖day49)
  • opendds初入门之对inforepo模式运行探索
  • 简单公司网站最全的域名后缀
  • 比邻智联发布生活物联网家电应用白皮书和Cat.1模组新品
  • 第七章 Spring-Boot框架
  • 网站html静态化解决方案网站制作公司 北京
  • 金仓数据库实现电子证照系统从MongoDB平滑迁移,国产化替代迎来新典范
  • CAN总线学习(四)错误处理 STM32CAN外设一
  • 【OpenGL】LearnOpenGL学习笔记28 - 延迟渲染 Deferred Rendering
  • 莱芜梆子网站昆山网站建设需要多少钱
  • 站长交流装潢设计什么意思
  • web核心—HTTP
  • 线程池导入大数据量excel
  • Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
  • 全国免费发布信息网站大全wordpress 修改文章id
  • 公司网站设计费计入什么科目app科技网站建设
  • 从需求到实现:如何解决证件照标准化难题的?
  • C++第九篇:friend友元
  • 软件工程咋理解?用 “开奶茶店” 讲透瀑布模型 / 敏捷开发
  • 如何在WordPress中添加短代码
  • 资源型网站建设 需要多大硬盘招牌设计 创意logo
  • 数据库索引简介
  • 基于三角测量拓扑聚合优化的LSTM深度学习网络模型(TTAO-LSTM)的一维时间序列预测算法matlab仿真
  • 关键词网站查询产品展示网站源码php
  • TOGAF ® 标准与循环经济:为可持续与责任型 IT 而设计
  • C盘内存不足,清除或转移VS2022缓存文件Cache
  • 玉米病叶识别数据集,可识别褐斑,玉米锈病,玉米黑粉病,霜霉病,灰叶斑点,叶枯病等,使用yolo,coco,voc对4924张照片进行标注