开源代码:https://github.com/MalongTech/research-charnet
论文:https://arxiv.org/abs/1910.07954v1
在这里非常感谢作者 “码隆科技”,让我有机会能这么轻松的看完一篇论文,非常感谢。我保存这篇论文来记录自己的学习。
自然图像文本识别一直被认为是两个连续但独立的问题:文字检测和文字识别。由于深度神经网络的成功,这两个任务都取得了很大的进展。文字检测的目的是对每一个文本实例预测一个文本框。当前最好的文字检测方法都是从目标检测或分割框架扩展而来。基于文字检测的结果,文字识别的目标是从被抠出来的文本图片中识别出一连串字符。一般来说,文字识别被转换为一个序列标记问题,通常用基于卷积神经网络(CNNs)特征的递归神经网络(RNNs)来解决。这种解决方案目前是最好的。
然而,通过这样两阶段的方法实现文本识别通常有很多限制。首先,独立地学习这两个任务是一个次优的问题,因为这样很难完全利用文本本身的性质。比如说,联合的文字检测和识别可以提供丰富的上下文信息并且两个任务可以实现互补。最近的工作已经证明这样的联合学习可以提升两者的准确率。第二,两阶段的方法通常需要多个连续的步骤,这样使整个系统变得复杂,并且使得识别结果很大程度上依赖于检测性能的好坏。
最近,已经有很多方法尝试去开发一个统一的文字检测与识别框架(也叫端到端识别)。比如说,[2, 4] 通过添加一个 RNN 的分支到文字检测模型来实现端到端识别,并且取得了很好的性能。虽然这些方法可以用单个模型完成文字检测与识别,但是他们本质上还是属于两阶段的框架。因此还是有以下几个缺点。第一,他们仍然使用 RNN 序列模型去识别文字。基于 RNN 的模型是比较难与 CNN 文本检测模型进行联合优化的。因此这样的模型需要大量的样本去训练,并且需要一个精心设计的复杂的训练策略。这些问题限制了端到端模型的发展。第二,当前这些两阶段的框架都需要 RoI Pooling。因此,很难精确的抠出精确的文本区域。通常会有很多背景被包含在抠出来的特征中。这不可避免的限制了文字识别的性能,尤其是对于多方向或者弯曲文本。
为了克服上述 RoI Pooling 的限制,He 等人 [2] 提出一个文本对齐层去精确的计算任意方向文本实例的卷积特征,提升整个系统的性能。[4] 也提出在卷积特征上进行多种仿射变换来增强文本信息。但是,这些方法对于弯曲文本并不适用。此外,很多高性能的方法把单词作为基本单元。但是,以单词作为基本单元,通常需要把随后的文字识别转换为序列标定问题。如前面所述,这样会引入 RNN 并且导致很多问题。此外,不像英文有很清晰的单词的定义,很多语言比如说中文只有字符能作为一个清晰的基本单元。因此,相比单词,字符是一个清晰并且更具有一般性的基本单元。更重要的是,字符识别是直截了当的并且可以直接使用一个简单的 CNN(而不是RNN)模型来完成。
贡献:在这篇文章中,我们提出以单个字符作为基本单元的,用于端到端文字检测与识别的卷积字符网络(简称 CharNet)。此外,我们第一次用单个 CNN 模型来解决端到端文字检测和识别,并且显著提升了当前两阶段方法的性能。我们提出的 CharNet 可以直接进行字符检测与识别,还有文本实例(比如,单词)检测。因此我们不需要基于 RNN 的单词识别分支,从而导致一个简单,紧凑且性能强大的模型。这个模型可以直接输出单词的文本框,字符框以及对应的字符类别,如图1所示。我们总结我们的主要贡献如下:
第一, 我们提出了一个单阶段的,用于联合文本检测与识别的 CharNet。我们引入了一个新的字符检测与识别的分支。这个分支被无缝整合进当前的文本检测模型中。我们利用字符作为基本单元,因此避免 RoI Pooling 以及 RNN 识别分支带来的影响。这两者是当前两阶段模型的主要限制。
第二, 我们开发了一个迭代字符检测方法。这个方法可以更好的迁移这个模型从合成数据上学到的字符检测能力到真实数据上,从而生成真实数据上的字符标注。这使得我们的方法可以使用真实数据训练而无需额外的人工字符级别的标注。
第三, CharNet 稳定地超过最近的两阶段端到端识别框架,比如说 [2, 5, 4,6]。我们把 ICDAR 2015 上端到端识别的最好结果从 65.33% 提升到 71.08%(使用通用字典),也把 Total-Text 上最好的结果从 54.0% 提升到 69.23%。此外,即使完全不使用字典,我们的方法也可以达到很不错的精度。比如说,在 ICDAR 2015 可以取得 67.24%。
在这一章,我们首先详细地描述我们提出的 CharNet。然后,我们将描述我们提出的迭代字符检测方法。这个方法可以利用合成数据自动生成真实图像上的字符级标注。在这个工作中,我们使用“文本实例”代表一个高层次的文本概念。依赖于上下文,一个文本实例可能是一个单词或者一行文本。
如之前讨论,当前的端到端文字识别算法普遍被 RoI 与 RNN 识别所限制。我们提出的 CharNet 是一个单阶段的卷积架构,主要由两个分支组成:(1)一个用于单字符检测与识别的字符分支;(2)一个预测文本实例外接框的文本实例检测分支。这两个分支是并行的,组成一个联合文字检测与识别网络,如图 2 所示。这两个分支可以被无缝地整合在一起,组成一个可以端到端训练的模型。训练这样一个模型需要字符级标注和文本实例级标注。在测试的时候,CharNet 可以在一次前向传播中直接输出文本实例外接框,以及字符外接框和对应的字符类别。
大多数当前的文本数据集不包括字符级标注,因为获取这样的标注是比较耗时的。如前文所述,我们开发了一个迭代的学习方法去自动生成这样的标注。我们的方法使得我们的模型可以先从有字符标注的合成数据上学习字符检测的能力,然后渐渐迁移这个能力到真实数据上。这使得我们的模型可以自动生成真实数据的字符标注,并以弱监督的方式学习。
主干网络。我们使用 ResNet-50 以及 Hourglass 作为我们的主干网络。对于 ResNet-50,类似于 [9], 我们采用 4 倍下采样的特征图作为我们的最终特征图。由于我们采用高分辨率的特征图,因此我们的 CharNet 可以检测非常小的文本。对于 Hourglass 结构,我们堆叠两个 Hourglass 模块,如图 2 所示。最终的特征图也被上采样到原图的 1/4 大小。我们使用 Hourglass 网络的两个变种,Hourglass-88 和 Hourglass-57。Hourglass-88 从 [3] 中的 Hourglass-104 修改而来。我们移除了两个下采样阶段并且把每个 Hourglass 模块最后阶段的层数减半。通过进一步移除每个阶段一半的层数,我们构造了 Hourglass-57。对于两种变种,我们都没有像 CornerNet [3] 一样采用中间监督。
当前基于 RNN 的识别方法主要在单词级别进行识别。相比单个字符分类,这种方法的搜索空间很大,因此比较复杂并且通常需要大量的训练数据以及更长的训练时间。最近的工作表明,如果引入编码了丰富字符信息的字符级注意力机制,这些基于 RNN 的识别方法的性能可以得到显著的提高。这些注意力机制使模型有能力去更准确的识别字符并且减小了搜索空间,带来了性能提升。这表明,对于基于 RNN 的文字识别来说,准确的标示字符的位置是非常重要的。这启发了我们去尝试直接简化识别为单字符识别。
为了这个目标,我们引入一个新的字符分支到我们的模型中。这个字符分支的功能是检测和识别单个字符。这个字符分支使用字符作为基本单元,输出字符的外接框以及字符的类别。具体来说,这个分支由一系列卷积层组成,密集地在主干网络的最终特征图上滑动。他的输入特征图的分辨率是原图的 1/4。这个分支包含三个子分支,分别用于文本实例分割,字符检测以及字符识别。文本实例分割分支和字符检测分支有 2 个 3x3 的卷积层以及 1 个 1x1 的卷积层。字符识别分支还有一个额外的 3x3 卷积层,总计 4 层。
文本实例分割子分支使用一个二值掩码图作为监督,输出一个 2 通道的特征图,分别代表有文字和没有文字的概率。字符检测分支输出一个 5 通道的特征图,在每个位置估计一个字符外接框。与 EAST [9] 相似,我们用 5 个参数去参数化这个外接框,分别代表当前位置到 4 个边界的距离以及整个框的角度。对于字符识别子分支,我们生成一个 68 通道的特征图。每个通道代表一种特定字符类别出现的概率。我们考虑 68 种字符,包括 26 个英文字母,10 个数字以及 32 个特殊字符。所有输出特征图的空间分辨率都是相同的(1/4 原图)。在测试的时候,我们保留置信度大于 0.95 的那些字符框作为我们的结果。每个生成的字符框还对应一个字符类别。我们从 68 通道的字符识别特征图上使用 Softmax 获取这个类别。
训练字符分支需要字符级别的标注。相比单词级别的标注,字符级标注需要花费更多的人力去获取所以要昂贵得多。为了避免这个额外代价,我们开发了一种迭代字符检测机制。我们将在 2.4 节描述这个方法。
因为我们最终需要文本实例级别的输出。所以我们设计文本检测分支去检测文本实例(单词或者文本行)。这些检测出来的文本实例可以提供丰富的上下文信息去帮助我们合并这些检测出来的字符成为完整的文本实例(然后作为他们的识别结果)。没有文本实例而直接使用字符的信息(比如说字符位置或者几何特征)去合并字符非常复杂,尤其是当多个文本实例位置比较接近或者文本是多方向或弯曲的时候。根据不同类型的文本实例,我们的文本实例检测分支可以有多种形式(也可以直接使用当下的文本实例检测方法)。在这里,我们以多方向单词和弯曲文本行作为例子。
多方向文本。我们使用稍做修改的 EAST 检测器作为我们的文本实例检测分支。它包含两个子分支,一个用于文本实例分割,另一个用于文本实例的外接框检测。对于文本实例分割,我们生成一个 2 通道特征图,分别指示是文本的概率和不是文本的概率。外接框被 5 个参数参数化,其中 4 个表示当前位置到四个边界的距离,1 个用于表示文本方向。我们用两个 3x3 卷积外加一个 1x1 卷积生成这些预测。当测试的时候,我们选择置信度大于 0.95 的外接框作为最终检测。
弯曲文本。对于弯曲文本,类似于Textfield [8], 我们使用一个额外的方向场去编码方向信息。方向场分支,与上面的文本实例与字符分支平行,被用于分离邻接的文本实例。
最终结果生成。我们使用这些检测到的文本实例级外接框去合并字符检测的结果,作为最终文本实例检测和识别结果。如果一个字符与一个文本实例的 IoU 大于 0,那么这个字符就被分配到这个文本实例。最终 CharNet 的输出是文本实例的外接框,以及它所包含字符的外接框和对应的字符类别。
训练我们的模型既需要字符级标注(以及对应的字符类别)也需要单词级标注。但是,因为获取字符级标注是比较昂贵的,所以目前的大多数数据集(比如说 ICDAR 2015 或者 Total-Text)都不包括字符级标注。因此,我们开发了一个迭代字符检测方法,使得我们的模型可以使用合成数据(比如说 Synth800k [1])生成真实数据上的字符级标注。这个字符生成方法使得 CharNet 可以以弱监督的方式来训练(只使用单词级别的人工标注)。
一个更直接的方法是直接用合成数据训练 CharNet。但是因为合成数据和真实数据有巨大的差异,这样的方法很难在真实数据上取得满意的结果。如表 1 所示,这样的方法只能得到比较低的文字检测和识别准确率。然而,相比文本识别器,我们观察到文本检测器更容易从合成数据上泛化到真实数据上。如 [7] 所示,只使用英文和中文训练的文本检测器也可以检测其他语言的文字。这个现象启发我们利用字符检测器的泛化能力去提升整个系统的泛化能力。
从本质上讲,我们的方法是从一个在合成数据上训练的模型开始,然后渐渐地提升模型的泛化能力。其中的关键是迁移模型在合成数据上学到的文本检测能力到真实数据上。我们使用一个迭代的过程。使得我们的模型能渐渐地产生“正确”的字符外接框。我们使用一个简单的规则去判断一组字符外接框是否正确:如果在一个文本实例中,我们的算法检测到的字符外接框的个数等于这个文本实例的人工标注的字符个数,那么我们就认为这组字符外接框是正确的。注意虽然大多数数据集没有单字符标注,但大多数端到端的文字识别数据集都包含人工标注的每个文本实例的字符串。下面是我们提出的迭代文字检测算法的详细描述:
我们首先在包含文本实例标注和单个字符标注的合成数据上训练一个初始的模型。然后我们用这个模型在真实数据的训练集图片上去测试。这样我们就可以得到由这个模型预测的训练集上的字符外接框;
我们利用前面描述的判断正确字符框的规则筛选出正确的字符框。然后通过对应这些字符框与人工标注的识别字符串,我们可以得到这些字符框的字符类别。然后我们使用这些字符标注去训练我们的模型。注意我们没有使用前面我们模型预测的字符类别,因为我们发现这些预测很多都是错误的,会导致我们模型的性能变差;
然后我们迭代上述过程。随着迭代的进行,我们模型字符检测的能力渐渐增强,反过来我们预测的“正确的”字符标注的个数也会渐渐增长,如图 3 和表 2 所示。
我们在 ICDAR 2015 上评估我们的迭代字符检测算法。首先,如表 1 所示,如果直接使用只在合成数据训练的模型,我们的算法很难达到比较好的准确率。这表明合成数据与真实数据之前存在巨大的差异,导致了较差的泛化能力。我们也通过一些实验评价我们提出的迭代字符检测算法提取字符标注的能力。如表 2 所示,随着迭代的进行,我们的方法可以为越来越多的单词提取字符级别的标注,随之也带来端到端识别性能的提升。最后我们可以为训练集中 92.65% 的单词提取字符标注。这些训练数据已经足够我们训练一个端到端的文字识别模型。
因为我们的方法是一个端到端的文字阅读框架。所以我们的算法理所当然的也可以进行单纯地文字检测。在这一节,我们评价我们算法的文字检测性能,以及联合优化两个任务对检测带来的性能提升。
如表 3 所示,在 ICDAR 2015 上,不使用联合优化,我们的检测基线检测算法已经可以超过之前最好的两个算法。如果使用端到端联合优化,我们的算法可以远远的超过这两个算法。值得注意的是,在我们的框架下面,联合优化可以对检测算法带来更大的提升。这可以证明我们的算法更利于识别算法帮助检测算法。如表 5 和表 6 所示,我们算法在 Total-text 和 MLT 2017 上也达到了最好的检测性能。
在这一节,我们展示我们算法的端到端文字识别的结果。我们在 ICDAR 2015 和 Total-text 上评价我们的算法。表 4、表 5 所示,我们的算法在这两个数据集上都达到了当前最好的性能。
我们提出单阶段端到端文字阅读框架 - CharNet。在 CharNet 中,我们引入了一个新的字符检测与识别分支。这个字符分支可以被无缝地整合进文字检测框架,从而形成了第一个可以同时解决文字检测与识别两个问题。我们的框架可以避免使用基于 RNN 的识别分支。我们展示通过我们提出的 CharNet,文字检测与文字识别可以被更有效地训练并且可以更好地协作,从而提升了整个系统的精度。进一步,我们也提出了一个迭代字符检测算法。它可以迁移网络从合成数据上学到的知识到真实数据上。另外,CharNet 是一个紧凑的模型,有更少的模型参数,并且可以处理弯曲的文本。在 ICDAR2015、MLT 2017 和 Total-text 上广泛实验表明,CharNet 一致地超过了当前的方法。