Crnn中文end-to-end识别

本文介绍了一种使用CRNN模型进行中文文字识别的方法,通过生成大量合成数据进行模型训练,并结合CTPN实现了场景文字的检测与识别。
中文识别利用crnn训练英文的网络来训练中文,字符个数5529左右,中文的顺序按照tesseract开源项目复制过来的。

github: 
https://github.com/bear63/sceneReco 
model: 
https://pan.baidu.com/s/1i5OLwt3 crnn文字识别模型 
https://pan.baidu.com/s/1i4Hd9zv ctpn文字检测模型 
1:样本获取

**算法论文:**
      Synthetic Data for Text Localisation in Natural Images
      Github: https://github.com/ankush-me/SynthText
**词库:**
     https://pan.baidu.com/s/10anmu  + 英文词汇 经过处理后得到大约500兆
     6000万词组
**字体:**
    ubntu系统下支持中文的字体,选了大概10种字体左右
**背景图片库:**
   http://zeus.robots.ox.ac.uk/textspot/static/db/bg_img.tar.gz
   大约有一万张分割好的图片
**算法大致过程:**
   随机从背景图片库中选出一张图片,随机从词库中选出一些词组,与背景图片分割                 -      的块进行匹配,选好字体,颜色,大小,变换等信息,将词组写入背景块中。  
   扣取背景块矩形框作为一个个样本。
**样本类似**

虎头山 
王兴海 
航天技术学院 
古木剑


2:网络设计:

网络结构 
网络分析: 
1:input: 输入文字块,归一化到32*w 即height缩放到32,宽度按高度的比率缩 放,当然,也可以缩放到自己想要的宽度,如128(测试时统一缩放到[32,128],训练时为批次训练,缩放到[32,Wmax]) 
下面以32*128(w,h)分析 
2:conv3层时数据大小为256*8*32,两个pooling层宽高各除以4 
3:pooling2层时 步长为(2,1) dilation (1,1) 
所以此时输出为256*4*33 
4:bn层不改变输出的大小(就是做个归一化,加速训练收敛,个人理解),同样p3层时,w+1,所以pooling3层时,输出为512*2*34 
5:conv7层时,kernel 为2*2,stride(1,1) padding(0,0) 
Wnew = (2 + 2 * padW - kernel ) / strideW + 1 = 1 
Hnew = 33 
所以conv7层输出为512*1*33 
6: 后面跟两个双向Lstm,隐藏节点都是256 
Blstm1输出33*1*256 
Blstm2输出33*1*5530 5530 = 字符个数 + 非字符 = 5529 + 1 
最终的输出结果直观上可以想象成将128分为33份,每一份对应5530个类别的概率

3:实验结果

自动生成差不多150万个样本,测试集1500张左右,测试集全对率62%左右。因为硬件限制,所以样本较少,感觉样本数量应该要几千万甚至上亿,模型才会比较稳定。150万个样本训练也没收敛,还有2.5左右的cost.

4:CTPN+CRNN整合场景文字检测识别结果

没有进行版面分析,所以识别结果没有按顺序输出 
其中标点符号训练集较少,错得较多。整体识别率感觉还行,如果加大训练样本至几千万,上亿,模型应该会比较稳定,识别也会比较好 
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

端到端神经网络模型(End-to-End Neural Network Models)是深度学习领域中的一个重要概念,其核心思想在于将整个问题的解决过程整合到一个统一的模型中进行优化,而不需要传统方法中常见的多个独立阶段或预处理步骤。这种方法通过联合学习(joint learning)来优化模型的所有参数,以确保最终输出达到最优效果,而不是在每个阶段中分别优化局部最优解 [^4]。 ### 模型特性 端到端模型的一个显著特点是其训练过程的简洁性和统一性。相比于需要多个独立步骤进行训练的模型,端到端模型可以直接从输入数据(通常是原始数据)映射到最终输出结果,避免了中间步骤可能引入的误差或信息丢失。例如,在文本阅读任务中,只有基于深度神经网络的某些模型(如 [22, 21] 和 CRNN)具备这种端到端可训练的特性,这使得它们在训练过程中更加优雅和高效 [^1]。 ### 应用场景 端到端神经网络模型广泛应用于多种任务,包括但不限于自然语言处理(NLP)、计算机视觉(CV)和语音识别。例如,在序列到序列(Sequence-to-Sequence)学习中,端到端模型被用于将一个输入序列转换为一个输出序列,这种方法在机器翻译和文本摘要等任务中取得了显著成果 [^3]。 ### 优势与挑战 端到端模型的主要优势在于其能够直接优化最终目标,而不是中间步骤的局部最优解。这种联合优化的方式可以提高模型的整体性能,并减少手工设计特征或规则的需求。然而,端到端模型也存在一些挑战,例如需要大量的数据和计算资源来进行训练,以及模型的可解释性较低。 ### 与模型规模的关系 在深度学习的发展过程中,模型规模的扩展(如更大的网络结构、更多的训练数据)被认为是推动该领域成功的关键因素之一。端到端模型通常受益于这种规模扩展,因为它们能够利用大规模数据和复杂网络结构来进一步提升性能 [^2]。 以下是一个简单的端到端模型的示例代码,用于演示如何构建一个端到端的神经网络: ```python import torch import torch.nn as nn class EndToEndModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(EndToEndModel, self).__init__() self.layer1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.layer2 = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.layer1(x) out = self.relu(out) out = self.layer2(out) return out # 实例化模型 model = EndToEndModel(input_size=10, hidden_size=20, output_size=5) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 示例数据 input_data = torch.randn(1, 10) target = torch.randn(1, 5) # 前向传播 output = model(input_data) loss = criterion(output, target) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() ``` 该代码展示了如何构建一个简单的端到端神经网络模型,并进行训练。通过这种方式,模型可以直接从输入数据中学习到输出结果的映射关系。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值