字符识别,口算题识别论文小梗概
作者:互联网
口算题批改,在教育领域是一个比较实际的应用场景,小学生各种练习册中五花八门的数学口算题,写好答案之后通过拍照,自动批改,挑出题目中算错的题,提高作业正确率,大人小孩都需要。在小猿搜题等在线教育app里功能基本已经比较完备。
口算题识别,说白了也就是特殊场景的字符识别,其中包括印刷体(题干)和手写体(作答内容)的混合识别。通过检测模型把口算题抠出来,然后送入识别模型得到字符,再判断题目是否作答正确。
市面上常见的两个技术路线,腾讯使用ANMT,是基于2D attention单行多行统一的口算题识别模型。另一个就是CRNN的各类变种,比如百度PaddleOCR就是基于CRNN,单行字符识别,像口算题的竖式,脱式等多行公式需要检测模型来拆分和组合。
本文分别简单介绍下两篇论文和相关技术路线,快速入门一下:
Accurate Structured-Text Spotting for Arithmetical Exercise Correction
腾讯在AAAI2020上发表
简述
Arithmetical Exercise Checker (AEC)算数习题批改 检测器使用:CenterNet(两角点+中心点)检测+ANMT识别+评估逻辑 算数批改三个难点: a新刷体+手写体混在一起(有印刷体题目部分,有手写作答部分)
b手写文本锯齿状边界且各行纠缠
c语义内容可能是算数错误(比如手写题目1+9=11,逻辑语义信息很难利用上) 口算习题归纳的三个特性: 1,边界不明确2,算数模式具有局部相关性3,算数符号全局无关性
模型部分
ANMT识别模型,是基于sequence2sequence的encoder,decoder模型,是NMT模型的升级版。NMT原本是用在神经网络的翻译模块
允许水平,垂直两个方向的attention,所以能处理多行识别
传统NMT,从WHC的map上的embedding是W个xi的一维向量,每个向量CxH维度,因而无法表示有结构的公式,只能是单行公式识别。
解码时我们采用单向LSTM,常见的双向LSTM为了更多提取字符之间逻辑信息,比如215中间的1就能识别成数字1而不是字母l,但是口算题语义本来就不一定准,所以用单向LSTM
对了,检测公式时,作者发现,x方向公式容易被截断,xy两个方向权重不一样,所以在loss中对x有加强,α=2权重改善x方向别被截断
数学公式特征一,符号全局无关,算术符号去耦合:
1+1=3,使得上下文对解码器价值降低,我们使用上下文门让解码器将更多的精力放在源上下文上,也就是视觉特征的嵌入。a hidden state因而占比很大,而不是上一个状态权重很大
数学公式特征二,模式局部相关,与算术模式耦合:
比如\n后常跟着=符号。使用MD-LSTM编码,对两个轴潜入的特征进行编码,并生成相同大小的变换嵌入。此外,可训练的初始隐藏状态作为垂直位置嵌入插入到每行的开始位置,用于捕获垂直方向上的顺序信息。
我们的方法如上图,比一般的attention更路棒,如第5列,我们的方法中强制对*进行视觉嵌入防止识别错成1。
如第6列,方法有助于改善隐藏状态,能忽略进位符噪声7
除了识别分支,我们还利用候选对象来提高识别能力。通过轻微变换,小角度旋转,随即扩大,缩小,生成多个样本,选择输出相同的大多数输出。
我们还搞了一个数据集。AEC-5K 包含40种小学练习题,5000训练,300测试,平均分辨率1152*768,每张图平均8.7个公式,标注:
外轮廓(单行,多行)
字符文本注释,120种字符
借鉴(Deng et al.2017)合成了600k手写体数据
消融实验:
由于符号全局无关,我们使用来2个模块:a,上下文门,(可高0.75个点)b,算术注意力机制。(比默认的注意力机制高1.4个点)
输入图像变换为三倍(轻微旋转,分辨率变化调整大小或填充),输出都一样自然是好,输出有不一样则取相同数量多的结果,这样精度提高2个点。而且由于是并行操作,最后inference时间并没有延长
An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
arXiv:1507.05717v1,即CRNN
在2015年开创了识别序列模型的先河,奠基地位等同于检测领域的R-CNN系列
比较好的解决如何将图像转化为字符串序列问题
论文创新在于:
把序列建模和转录整合到统一框架中 相较之前所有模型四个不同的特性: 1与大多数现有的组件需要单独训练和协调的算法相比,它是端对端训练的。 2它自然地处理任意长度的序列,不涉及字符分割或水平尺度归一化。 3它不仅限于任何预定义的词汇,可以无词典的识别 4模型小,且有效 在包括IIIT-5K,Street View Text和ICDAR数据集都做了大量实验
简述:
使用深度神经网络DCNN,作用在识别领域时,难以解决长度很大变化的任务。之前的老方法有的先检测单个字符,也有的使用单词的字典做分类。(词典是包含几万个单词及单词变化的大词典)
递归神经网络RNN优点之一是在训练和测试中不需要序列目标图像中每个元素的位置。但是,将输入目标图像转换成图像特征序列的预处理步骤通常是必需的。以前用的HOG等传统特征比较独立肯定不好。换成RNN效果好了太多
小众方法比如潜入到公共向量子空间,转换为检索问题。
设计的网络CRNN,虽然由不同类型的网络架构(如CNN和RNN)组成,但可以通过一个损失函数进行联合训练。
CRNN网络结构
本文是DCNN和RNN组合,优点:
1从序列学习,不需要字符级标注(CRNN网络结构中示例图片的标注信息就是字符串“STATE”)
2使用CNN提取特征,无须传统方法预处理
3与RNN相同的性质,能产生一系列标签
4序列对象长度不限制,只需图像的高度归一化(图像可变长,标签也可变长)
5 准确率更高
6 比DCNN参数更少,占内存更小
模型第一个部分,卷积层
CNN与RNN的结合,简单直白的来说就是:通过conv,pooling把输入的图片提取得到的特征图变成高度为1,深度可设定为某个N(经典选择是N=256,512等),这样每个像素就可以有较大的感受野,同时带有原图中该列的像素信息,一共有T个这样的向量,可以作为RNN的T个输入。相较传统CNN,后者一般长宽两个方向同等看待,pool,conv尺寸一般对称,作为字符图片xy两个方向明显不一样,因而pooling除了对称的(2,2),也会有一些(2,1)来照顾高度比较小的输入图片的特征
a是LSTM的一个单元 ,b是双向LSTM
模型第二个部分,RNN层
使用RNN有三个优点
1 RNN具有很强的捕获序列内上下文信息的能力。对于基于图像的序列识别使用上下文提示比独立处理每个符号更稳定且更有帮助。一些模糊的字符在观察其上下文时更容易区分,例如,通过对比字符高度更容易识别“il”而不是分别识别它们中的每一个。
2 其次,RNN可以将误差差值反向传播到其输入,即卷积层,从而允许我们在统一的网络中共同训练循环层和卷积层。
3 RNN能够从头到尾对任意长度的序列进行操作。
长度较长时RNN会有梯度消失的问题,LSTM由于是一种带遗忘门的RNN,对较长序列建模较好,所以被采用。LSTM是定向的,它只使用过去的上下文,不是用后面的信息。
可以堆叠多个双向LSTM,得到如图b所示的双向LSTM。深层结构允许比浅层抽象更高层次的抽象,并且在语音识别任务中取得了显著的性能改进。
模型第三个部分,转录层
使用基于条件概率的CTC层来进行最后一步的转录,Connectionist Temporal Classification (CTC) layer(另大个主流路线是使用attention模型来转录)
联接时间分类CTC , 输入T个序列,是CNN的T个输出
概率值指的是每帧预测得到的向量y=y1,...yT的情况下预测得到字符标签I的概率,(忽略I中每个字符的具体像素位置)
我们使用负的log似然函数来训练网络
输入y=y1,...yT一共T个序列长度
每个yt长度为labels的字符集的长度(识别数字则是0-9的10,识别字母则a-z的26)还包括blank空字符(以及开头、结尾字符)
y_π^t是t时刻预测出π_t的概率
p(π|y) = y_π^t的T个连乘的概率
L包括所有字符集标签以及-代表的空白分隔符
如公式1, 条件概率被定义为:所有序列被映射为I的概率之和
映射B 是把预测出的“--hh-e-l-ll-oo--” 映射为 “hello”(空字符-中间相同的合并,然后去掉-)
就此,l∗ ≈ B(arg maxπ p(π|y)),使用贪婪算法,每次取最高置信度预测出的label πt,组合成I*
得到置信度最高的预测出的字符串l∗,因而这个过程不需要预先的庞大字典,比较灵活
CTC更多细节需要看CTC这篇论文A. Graves, S. Fern´andez, F. J. Gomez, and J. Schmidhu- ber. Connectionist temporal classification: labelling unseg- mented sequence data with recurrent neural networks. In ICML, 2006. 4, 5
本模型训练时,使用ADADELTA自动计算学习率,收敛速度也快些。
X是训练集,正常I是输入图片, 斜体I是 label-ground truth (字符串),损失函数为O
训练时使用SGD,特殊的是,RNN中使用反向传播时间BPTT来训练,CTC中使用前向算法进行反向传播(这是上文CTC那个论文中的设定)
BN训练RNN时很有用,加快训练
K40的GPU上,100*32的图,50小时收敛,0.16秒每张图
实验数据集:800万训练图像和单词
做了一些实验,CRNN在识别乐谱任务上效果也非常好。
——————————————————
现在(2020年)主流的序列识别模型要么是基于CTC , 要么基于attention
其他主要的流程就和CRNN这篇差不多,改改不同的backbone,很多用densenet效果会好些,LSTM部分有双向LSTM ,也有单向LSTM,也有换成GRU的,差不太多
如果是识别分式、手写公式、有结构的字符或者序列,一般用基于attention的模型,有各种各样的attention变种可以选择
后记
看完这些,希望你已经没有想看源码的冲动了。
如果是这样的话,不妨点个赞吧。
为何要点赞?
如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。
关注我CSDN和知乎专栏会更新更多相关知识
标签:字符,字符识别,算题,RNN,模型,序列,LSTM,识别,梗概 来源: https://blog.csdn.net/u012925946/article/details/110191412