pytorch crnn 笔记(二)

crnn的论文、原理,训练等。

CRNN论文地址:http://arxiv.org/abs/1507.05717(作者是华中科技大学的老师

代码:https://github.com/Sierkinhane/crnn_chinese_characters_rec

先读readme.md,作者的开发环境是pytorch1.2,我的是pytorch1.5.1,之前有easydict和tensorboardX没有安装,直接两个命令安装:

pip install easydict
pip install tensorboardX

 

pytorch crnn 笔记(二)_第1张图片

然后直接测试:

python demo.py --image_path images/test.png --checkpoint output/checkpoints/mixed_second_finetune_acc_97P7.pth

图片:

输出正常:

>python demo.py --image_path images/test.png --checkpoint output/checkpoints/mixed_second_finetune_acc_97P7.pth
demo.py:24: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  config = yaml.load(f)
loading pretrained model from output/checkpoints/mixed_second_finetune_acc_97P7.pth
torch.Size([1, 512, 1, 124])
torch.Size([124, 1, 6736])
results: 男装、女装、童装、婴儿装、内衣、服饰、泳衣、家用饰品、针纺织品、服装面料及辅
elapsed time: 0.7549798488616943

 

论文阅读:

摘要:

基于图像的序列识别一直是计算机视觉领域的一个长期研究课题。本文研究了场景文本识别问题,这是在基于图像的序列识别中最重要和最具挑战性的任务之一。提出了一种新的神经网络结构,将特征提取、序列建模和转录集成到一个统一的框架中。与以前的场景文本识别系统相比,该体系结构具有四大特点:(1)端到端可训练,与大多数现有的算法相比,这些算法的组成部分都是单独训练和调整的。(2) 它自然地处理任意长度的序列,不涉及字符分割或水平尺度标准化。(3) 不受限于任何预定义的词汇,并在无词典和基于词典的场景中的文本识别任务中取得显著成就。(4) 它产生了一个有效的较小的模型,对于实际应用场景更为实用。在标准基准上的实验,包括IIIT-5K、街景文本和ICDAR实验数据表明,该算法优于现有技术。此外,本文提出的算法在基于图像的乐谱识别中取得了良好的效果,这明显验证了它的通用性。

1、简介

最近,主要是受deep神经网络模型在不同的视觉环境下任务的成功刺激,特别是Deep Convolutional Neural Networks
(DCNN),社会出现了一股强劲的神经网络复苏。然而,最近的大部分与深度神经网络有关的工作都是致力于检测或分类对象类别[12,25]。本文研究计算机视觉中的一个经典问题:基于图像的序列识别。在现实世界中,一个稳定的视觉对象,如场景文本、笔迹和乐谱,倾向于以顺序的形式出现,而不是孤立地。不像一般的物体识别,识别序列类对象通常需要系统进行预测一系列对象标签,而不是单个标签。因此,对这类对象的识别可以自然地转换为序列识别问题。类似序列的物体的另一个独特属性是它们的长度可能会有很大的变化。例如,英语单词可以由2个组成字符如“OK”或15个字符,如“congratulations”。因此,最流行的深度模型DCNN[25,26]不能直接应用于序列预测,因为DCNN模型通常作用于有固定尺寸输入和输出,因此不能生成可变长度的标签序列。

人们已经做了一些尝试,来解决对于特定的类似序列的对象(例如场景文本)的识别问题。例如,[35,8]中的算法首先检测个体字符,然后使用来自标记字符进行训练图像的DCNN模型。这种方法通常需要训练一个强大的字符检测器,以便从原始单词图像中准确地检测和裁剪出每一个字符。一些其他的方法(如[22])将场景文本识别视为一个图像分类问题,并指定一个类标签一个英语单词(共90K个单词)。结果导致了获得了大型训练模型和大量的类,这很难推广到其他类型的顺序类物体,如中文文本、乐谱等,因为这类物体的基本组合数序列可以大于100万。综上所述,目前基于DCNN的系统不能直接用于基于图像的序列识别。

递归神经网络(RNN)模型是深层神经网络家族的另一个重要分支,主要用于处理序列问题。RNN的优点之一是它在训练和测试时不需要序列对象中每个元素的位置。但是,一个将输入的目标图像转换到图像特征序列中的预处理步骤通常是必不可少的。例如,Graves等人[16] 摘录手写文本的几何或图像特征集,而Su和Lu[33]则将单词图像转换成序列图像HOG特征。预处理步骤独立于管道中的后续组件,因此基于RNN的系统不能以端到端方式训练和优化。

几种不是基于神经网络的传统的场景文本识别方法也给这一领域也带来了深刻的见解和新颖的表现。例如,阿尔马赞等人[5] Rodriguez Serrano等人[30]提出在一个通用的向量子空间嵌入单词图像和文本字符串,并将单词识别转换为检索问题。Yao等人[36]和Gordo等人[14]使用中级特征进行场景文本识别。尽管如此在标准基准上取得了良好的表现,这些方法通常优于以前基于神经网络的算法[8,22],以及本文提出的方法。

本文的主要贡献是一种新颖的神经网络网络模型,其网络结构专门设计用于识别图像中类似序列的物体。提出的神经网络模型称为卷积递归神经网络(CRNN),因为它是一个DCNN和RNN的组合。对于类似序列的对象,相比与传统的神经网络模型,CRNN具有一些独特的优点:1)它可以直接从序列标签(例如单词)中学习,不需要详细的注释(例如字符);2)它在直接从图像数据学习信息表示方面具有DCNN相同的性质,既不需要手工设计的特征,也不需要预处理步骤,包括二值化/分割、构件定位等;3)它具有与RNN相同的特性,能够产生一系列标签;4)它不受类似序列的对象的长度的限制,只需要在训练和测试阶段将高度标准化;5)它在场景文本(单词识别)上取得了比现有技术更好或更具竞争力的性能[23, 8];6)它包含的参数比标准的DCNN模型少得多,占用的存储空间更少。

2、提出的网络体系结构

 CRNN的网络架构,如图1所示,由三部分组成,包含,从下到上依次是,卷积层,循环层和转录层。在CRNN的底部,卷积层自动从每个输入图像中提取特征序列。在卷积网络之上,是一个递归网络用于对特征序列的每个帧进行预测,由卷积层输出。在CRNN顶部的转录层用来将递归层的每帧预测转化为一个标签序列。尽管CRNN由不同类型的网络架构(如CNN和RNN)组成,它可以使用一个损失函数联合训练。

pytorch crnn 笔记(二)_第2张图片

2.1、特征序列提取

在CRNN模型中,卷积层的组件是通过从标准CNN模型中提取卷积层和最大池层来构造的(完全连接的层被移除)。该组件用于从输入图像中提取序列特征表示。在输入网络之前,所有图像都需要缩放同样的高度。然后从卷积层分量产生的特征图中提取特征向量序列,作为递归层的输入。具体地说,特征的每个特征向量在特征图上从左到右生成序列按列显示。这意味着第i个特征向量是所有映射的第i列的连接。我们的设置中的每一列的宽度都固定为一个像素。

局部区域上运行时,它们是平移不变性。因此,每一列的特征映射对应于原始图像的矩形区域(称为感受野),并且这种矩形区域和它们相应的从左到右的特征图的顺序相同。如图2所示,特征序列中的每个向量与感受野相关,可以将其视为该区域的图像描述子。

pytorch crnn 笔记(二)_第3张图片

深卷积特征具有鲁棒性、丰富性和可训练性,被广泛应用于各种视觉识别任务[25,12]。以前的一些方法利用CNN学习了类似序列的对象的鲁棒表示,如场景文本[22]。然而,这些方法通常由CNN提取整个图片的整体表示,然后采集局部深度特征,识别序列类对象的各个组成部分。因为CNN需要输入图像缩放到一个固定大小,以满足CNN的固定输入维度,它不适用于类似序列的对象因为它们的长度变化很大。在CRNN中,为了对类序列对象的长度变化保持不变,我们将深度特征转化为序列表示。

2.2、序列标记

在卷积层的顶部建立一个深度双向递归神经网络作为递归层。递归层预测特征序列\mathbf{x} = x_{1}, ..., x_{T}中每个帧x_{t}的标签分布y_{t}。递归层的优点有三个方面。首先,RNN具有很强的捕获序列内上下文信息的能力。使用上下文线索进行基于图像的序列识别比单独处理每个符号更稳定和有用。以场景文本识别为例,宽字符可能需要几个连续的帧来完全描述(参见图2)。另外,有些模棱两可的字符更容易在观察他们的上下文时区分,例如通过对比字符高度来识别“il”比分别识别它们更容易。其次,RNN可以将误差差分反向传播到它的输入端,即卷积层,使我们能够在一个统一的网络中联合训练递归层和卷积层。第三,RNN能够对任意长度序列进行运算,从头到尾遍历。

pytorch crnn 笔记(二)_第4张图片

传统的RNN单元在输入层和输出层之间有一个自连接的隐藏层。每次在序列中接收到帧x_{t}时,它都用一个非线性函数更新其内部状态h_{t},该函数将当前输入x_{t}和过去的状态h_{t-1}作为其输入:h_{t} = g(x_{t},h_{t-1})。然后基于h_{t}y_{t}进行了预测。这样,过去的上下文\left \{ x_{t^'} \right \}_{t^{'} < t } 被捕获并用于预测。然而,传统的RNN单元存在消失梯度问题[7],这限制了它所能储存的上下文范围,并增加训练过程的负担。长-短术语存储器[18,11](LSTM)是一种RNN单元是专门为解决这个问题而设计的。LSTM(如图3所示)由一个存储单元和三个乘法门组成,即输入、输出和遗忘门。从概念上讲,记忆单元存储过去的上下文,并且输入和输出门允许记忆单元存储上下文很长一段时间。同时,遗忘门可以清除记忆单元的记忆。LSTM的特殊设计使得它能够捕捉到长程相关性,这种依赖性通常发生在基于图像的序列中。

LSTM是定向的,它只使用过去的上下文。然而,在基于图像的序列中,来自两个方向的上下文是有用的,并且是互补的。因此,我们遵循[17]并结合两个LSTM,一个向前一个向后,变成一个双向的LSTM。此外,可以堆叠多个双向LSTM,从而得到深的双向LSTM,如图3.b所示。与浅层结构相比,深层结构允许更高层次的抽象,并且在语音识别任务中取得了显著的性能改进[17]。

在递归层中,误差差分沿图3.b所示箭头的相反方向传播,即通过时间的反向传播(BPTT)。在递归层的底部,传播的差分序列被连接成映射,将特征映射转换为特征序列的操作逆操作,并反馈给卷积层。在实践中,我们创建了一个自定义的网络层,称为“映射到序列”,作为卷积层和递归层之间的桥梁。

2.3、转录

转录是将RNN的每帧预测转化为标签序列的过程。从数学上讲,转录是以每帧预测为条件,寻找概率最高的标签序列。在实践中,有两种转录模式,即无词典转录和基于词典的转录。词典是一组约束预测的标签序列,例如拼写检查词典。在无词典模式下,预测是在没有任何词典的情况下生成的。在基于词典的模式中,通过选择概率最高的标签序列来进行预测。

2.3.1标签序列的概率

我们采用了Grave等人[15]提出的连接时间分类(CTC)层中定义的条件概率。根据每帧预测,定义标签序列 l 的概率\mathbf{y} =y_{1},...,y_{T},它忽略 l 中每个标签的位置。因此,当我们以该概率的负对数似然作为训练网络的目标时,只需要图像及其相应的标记序列,这样就可以避免标记单个字符位置的工作。

条件概率的表达式简单描述如下:输入是序列\mathbf{y} =y_{1},...,y_{T},其中T是序列长度。其中每一个y_{t}\in \Re ^{ | \pounds^{'}|}是集合\pounds ^{'}=\pounds\cup 上的概率分布,其中 \pounds包含任务中的所有标签(例如,所有英文字符),以及用 表示的“空白”标签。序列到序列的映射函数 \ss 定义在序列\pi \in \pounds ^{'T}上,其中T是长度。 \ss 首先移除重复的标签,然后移除'空白,把\pi映射到 l 上。例如, \ss  将“--hh-e-l-ll-oo--”('-'代表'blank')映射到“hello”。然后,条件概率被定义为 \ss 映射到 l上的所有\pi的概率和:

                             p(\mathbf{l}|\mathbf{y})=\sum _{\mathbf{\pi} :\ss (\mathbf{\pi})=\mathbf{l}}p(\mathbf{\pi} |\mathbf{y})                                                            (1)

 

其中\pi的概率定义为p(\mathbf{\pi }|\mathbf{y})=\prod _{t=1}^Ty_{\pi_{t}}^{t}  ,y_{\pi_{t}}^{t}是时间戳t上有标记\pi_{t}的概率。直接计算公式1在计算上是不可行的,因为求和项的数量是指数级的。然而,使用在[15]所述的前向后算法可以有效的计算等式1。

2.3.2、无词典转录

在这种模式下,将具有等式1中定义的概率最高的序列\mathbf{l}^{*}作为预测。由于不存在精确求解的可跟踪算法,我们采用[15]中采用的策略。序列\mathbf{l}^{*}近似由\mathbf{l}^{*}\approx \ss (arg\,max_{\pi }p(\pi|\mathbf{y})),即,取每个时间戳t的最可能标签\pi _{t},以及将结果序列映射到\mathbf{l}^{*}上。

2.3.3基于词典的转录

在基于词典的模式中,每个测试样本都与一个词典D相关。基本上,标签序列是通过在词典中选择在等式1中定义的条件概率最高的序列来识别的,即\matnbf{l}^{*}=arg\,max_{\mathbf{l}\in D}p(\mathbf{l}|\mathbf{y})。然而,对于大型词典,如50k单词Hunspell拼写检查词典[1],对词典进行彻底搜索会非常耗时,即计算字典中所有序列的方程1,并选择概率最大的一个。为了解决这个问题,我们观察到在2.3.2中描述的通过无词典转录预测的标签序列在编辑距离度量下通常接近真实值。这表明我们可以将搜索限制在最近邻候选N_{\delta }(\mathbf{l}'),其中 \delta 是最大编辑距离,\mathbf{l}'是从\mathbf{y}以无词典模式转录的序列:

                    \mathbf{l}^{*}=arg\,max_{\mathbf{l}\in N_{\delta }(\mathbf{l}')}p(\mathbf{l}|\mathbf{y})                                  (2)

BK树数据结构[9]是一种特别适用于离散度量空间的度量树,可以有效地找到候选 N_{\delta }(\mathbf{l}')。BK-tree的搜索时间复杂度为O\,log(|D|),其中|D|为词典大小。因此,这个方案很容易扩展到非常大的词库。在我们的方法中,为词典离线构造一个BK树。然后利用该树进行快速在线搜索,找到与查询序列具有小于或等于δ编辑距离的序列。

2.4、网络训练

\chi =\left \{ \mathbf(I_i), \mathbf{l}_i\right \}_i 表示训练数据集,其中I_i 是训练图像,\mathbf{l}_i是真实标签序列。目标是最小化真实条件概率的负对数可能性:

                        O =-\sum _{\mathbf{I_{i},\mathbf{l}_{i}}\in\chi}log\,p(\mathbf{l_i}|\mathbf{y_i})                                   (3)

其中\mathbf{y}_i是由\mathbf{I}_i的递归层和卷积层产生的序列。该目标函数直接从图像及其真实标签序列计算成本值。因此,网络可以在成对的图像和序列上进行端到端的训练,省去了在训练图像中手动标记所有单个分量的过程。

网络采用随机梯度下降(SGD)训练。梯度由反向传播算法计算。具体而言,在转录层中,误差差分通过前后向算法进行反向传播,如[15]所述。在递归层中,采用时间反向传播(BPTT)来计算误差差分。

为了优化,我们使用ADADELTA[37]自动计算每个维度的学习率。与传统的动量[31]方法相比,ADADELTA不需要手动设置学习速率。更重要的是,我们发现使用ADADELTA的优化比动量法收敛更快。

3、实验

为了评价所提出的CRNN模型的有效性,我们对场景文本识别和乐谱识别这两个具有挑战性的视觉任务进行了实验。数据集和训练与测试的设置见第3.1节、场景文本图像的CRNN详细设置见第3.2节,综合比较结果见第3.3节。为了进一步证明CRNN的通用性,我们在第3.4节的一个乐谱识别任务上验证了该算法的通用性。

3.1、数据集

在所有的场景文本识别实验中,我们使用了Jaderberg等人发布的合成数据集(Synth)[20] 作为训练数据。该数据集包含800万个训练图像及其对应的真实词。这样的图像由合成文本引擎生成非常逼真。我们的网络只对合成数据进行一次训练,然后在所有其他真实的测试数据集上进行测试,而不需要对它们的训练数据进行任何微调。尽管CRNN模型完全是用合成文本数据训练的,但它在标准文本识别基准测试的真实图像上运行良好。

四种常用的场景文本识别基准用于性能评估,即ICDAR2003(IC03)、ICDAR2013(IC13)、IIT 5k单词(IIT5k)和街景文本(SVT)。

IC03[27]测试数据集包含251个带有标记文本边框的场景图像。跟随Wang等人[34],我们忽略包含非字母数字字符或少于三个字符的图像,并获得一个包含860个裁剪文本图像的测试集。每个测试图像都与一个50个单词的词汇相关联,这个词汇由Wang等人定义[34]。一个完整的词典是通过合并所有每幅图像的词典来构建的。另外,我们使用一个50k单词的词典,由Hunspell拼写检查字典[1]中的单词组成。

pytorch crnn 笔记(二)_第5张图片

IC13[24]测试数据集继承了IC03中的大部分数据,包含1015个真实裁剪单词图像。

IIIT5k[28]包含从互联网上收集的3000个裁剪单词的测试图像。每个图像都与50个单词的词典和1k个单词的词典相关联。

SVT[34]测试数据集由249幅从谷歌街景中收集的街景图片组成。从中裁剪出647个单词的图像。每一个单词图像都有一个50个单词的词汇,由Wang等人定义[34]。

3.2、实施细节

表1总结了我们在实验中使用的网络配置。卷积层的架构基于VGG VeryDeep架构[32]。为了使它适合于识别英语文本做了一个轻微调整。在第3层和第4层,我们采用1×2大小的矩形池窗口代替传统的方形池窗口。这个调整会产生宽度更大的特征映射,因此特征序列更长。例如,包含10个字符的图像的大小通常为100×32,从中可以生成25帧的特征序列。这个长度超过了大多数英语单词的长度。除此之外,矩形池窗口产生矩形的感受野(如图2所示),这有助于识别一些形状狭窄的字符,如“i”和“l”。

该网络不仅具有深层卷积层,而且具有递归层。众所周知,这两种方法都很难训练。我们发现,批量规范化[19]技术对于训练这种深度的网络是非常有用的。在第5和第6卷积层之后分别插入两个批量归一化层。采用批量规范化层,大大加快了训练过程。

我们在Torch7[10 ]框架内实现网络,并自定义实现LSTM单元(在Torch7/CUDA中)、转录层(C++)和BK树数据结构(C++)。实验在2.50ghz英特尔(R)至强(R)E5-2609 CPU、64GB RAM和NVIDIA(R)Tesla(TM)K40 GPU的工作站上进行。用ADADELTA训练网络,将参数ρ设为0.9。在训练过程中,为了加速训练过程,所有的图像都被缩放到100×32。训练过程大约需要50个小时才能达到收敛。测试图像被缩放到高32。宽度与高度成比例缩放,但至少为100像素。在没有词典的IC03上,平均测试时间为0.16s/样本。对IC03的50k字典进行近似字典搜索,参数δ取3。测试每个样本平均需要0.53s。

3.3、比较评价

由提出的CRNN模型和最新技术(包括基于深层模型的方法)获得的上述四个公共数据集的所有识别精度如表2所示。

pytorch crnn 笔记(二)_第6张图片

在词汇受限的情况下,我们的方法始终优于大多数最先进的方法,并且平均优于[22]中提出的最佳文本阅读器。具体地说,我们在IIIT5k和SVT上获得了优于[22]的性能,只是在使用“完整”词典时在IC03上实现了更低的性能。请注意,[22]中的模型是在特定字典上训练的,即每个单词都与一个类标签相关联。与[22]不同的是,CRNN不仅能够识别已知字典中的单词,而且能够处理随机字符串(如电话号码)、句子或其他类似中文单词的脚本。因此,CRNN的结果在所有测试数据集上都是有竞争力的。

在无约束词库的情况下,我们的方法在SVT上取得了最好的性能,但在IC03和IC13上仍然落后于一些方法[8,22]。请注意,表2中“None”列中的空白表示这些方法在没有词典的情况下无法应用于识别,或者没有报告在无限制情况下的识别精度。我们的方法只使用带单词级标签的合成文本作为训练数据,这与photocorr[8]有很大不同,后者使用790万个带字符级注释的实词图像进行训练。文献[22]在无约束词典的情况下表现最好,这得益于它的大词典,但它并不是前面提到的严格无约束的模型。从这个意义上说,我们在无限制词典案例中的结果仍然是有希望的。

为了进一步了解该算法相对于其他文本识别方法的优势,我们对E2E-Train、Conv-Ftrs、CharGT-Free、unconstraint和Model-Size进行了综合比较,如表3所示。

pytorch crnn 笔记(二)_第7张图片

E2E训练:这个栏目展示的是某个文本阅读模型是否可以进行端到端的训练,不需要任何预处理,或者可以通过几个独立的步骤进行训练,这表明这种方法训练起来既优雅又干净。从表3可以看出,只有基于深层神经网络(包括[22,21]和CRNN)的模型才具有这种特性。

Conv Ftrs: 这一列是用来说明一种方法是直接使用从训练图像中学习的卷积特征还是手工特征作为基本表示。

CharGT Free:此列指示字符级别的注释对于训练模型是否是必需的。由于CRNN的输入和输出标签可以是一个序列,所以不需要字符级的注释。

Unconstrained: 此列表明受约束的模型是否约束到特定字典,无法处理字典外的单词或随机序列。

请注意,尽管最近通过标签嵌入[5,14]和增量学习[22]获得的模型取得了很高的竞争性能,但它们都局限于特定的字典。

模型大小:此列展示所学模型占用存储空间大小。在CRNN中,所有层都有权共享连接,而不需要完全连接的层。因此,CRNN的参数个数比CNN[22,21]的变体模型要少得多,因此与[22,21]相比,模型要小得多。我们的模型有830万个参数,仅占用33MB RAM(每个参数使用4字节的单精度浮点数),因此它可以很容易地移植到移动设备上。

表3详细地展示了不同方法之间的差异,充分展示了CRNN相对于其他竞争方法的优势。

另外,为了检验参数δ的影响,我们在式2中实验了不同的δ值。在图4中,我们将识别精度绘制为δ的函数。δ越大,候选词越多,基于词典的转录就越准确。另一方面,由于BK树搜索时间较长,以及用于测试的候选序列数量较多,计算量随着δ的增大而增加。在实践中,我们选择δ=3作为精度和速度之间的折衷。

3.4、乐谱识别

乐谱通常由一系列排列在五线谱上的音符组成。在图像中识别乐谱被称为光学音乐识别(OMR)问题。以前的方法通常需要图像预处理(主要是二进制化)、谱线检测和单个音符识别[29]。我们将OMR问题归结为一个序列识别问题,并利用CRNN直接从图像中预测出音符序列。为简单来说,我们只识别音高,忽略所有和弦,对所有乐谱采用相同的大调音阶(C大调)。

 

据我们所知,目前还没有公开的数据集来评估基音识别算法。为了准备CRNN所需的训练数据,我们从[2]中收集了2650幅图像。每幅图像包含一个乐谱片段,包含3到20个音符。我们手动标记所有图像的真实标签序列(非ezpitches序列)。通过对采集到的图像进行旋转、缩放和噪声污染,并用自然图像替换背景,将采集到的图像增加到265k个训练样本。为了测试,我们创建了三个数据集:1)“Clean”,其中包含从[2]收集的260幅图像。示例如图5.a所示;2)“合成”是使用上述增强策略从“Clean”创建的。它包含200个样本,其中一些样本如图5.b所示;3)“真实世界”,其中包含200张用手机摄像头从音乐书籍中采集的乐谱片段图像。示例如图5.c.所示

pytorch crnn 笔记(二)_第8张图片

由于训练数据有限,我们使用简化的CRNN配置以减少模型容量。与表1指定的配置不同,第4和第6卷积层被移除,并且2层双向LSTM被2层单向LSTM取代。网络是在成对的图像和相应的标签序列上训练。评价识别性能有两种方法:1) 片段准确度,即乐谱片段的正确识别百分比;2)平均编辑距离,即预测音高序列和基本标签。为了进行比较,我们评估了两个商用OMR引擎,即Capella Scan[3]和PhotoScore[4]。

pytorch crnn 笔记(二)_第9张图片

表4.总结了结果。CRNN的性能大大超过了这两个商用系统。Capella Scan和PhotoScore系统在干净数据集上的性能良好,但在合成数据和真实数据上性能明显下降。其主要原因是它们依赖于稳健的二值化来检测谱线和音符,但由于灯光条件差、噪声污染和背景复杂等原因,二值化步骤往往在合成数据和真实数据上失败。CRNN,另一方面,使用了对噪声和失真具有很强鲁棒性的卷积特征。此外,CRNN中的递归层可以利用乐谱中的上下文信息。每个音符不仅可以通过自己识别,而且也被附近的音符所识别。因此,通过与附近的音符进行比较,可以识别出一些音符,例如:对比它们的垂直位置。

结果表明了CRNN的通用性,它可以很容易地应用于其他基于图像的序列识别问题,只需要最少的领域知识。与Capella Scan和PhotoScore相比,我们的基于CRNN的系统还处于初级阶段,缺少许多功能。但它为OMR提供了一种新的方案,并在基音识别方面显示出了很好的应用前景。

4、结论

本文提出了一种新的神经网络结构,称为卷积递归神经网络(CRNN),它综合了卷积神经网络(CNN)和递归神经网络(RNN)的优点。CRNN能够输入不同尺寸的输入图像,并产生不同长度的预测结果。它直接运行在粗略的标签上(例如单词),在训练阶段不需要对每个单独的元素(例如字符)进行详细的注释。此外,由于CRNN抛弃了传统神经网络中使用的全连接层,因此它可以得到一个更紧凑、更有效的模型。这些特性使得CRNN成为一种很好的基于图像的序列识别方法。

在场景文本识别基准测试上的实验结果表明,与传统方法以及其他基于CNN和RNN的算法相比,CRNN具有更好或更具竞争力的性能。这证实了该算法的优越性。此外,在光学音乐识别(OMR)基准测试中,CRNN明显优于其他竞争对手,这验证了CRNN的通用性。

实际上,CRNN是一个通用的框架,因此它可以应用于其他领域和问题(如汉字识别),其中涉及到图像序列预测。进一步提高CRNN的速度,使其在实际应用中更加实用,是值得进一步探索的另一个方向。

 

参考:crnn(基于pytorch、python3) 实现不定长中文字符识别

你可能感兴趣的:(文字识别)