区分垃圾中的角色:如何在OCR任务中构建健壮的神经网络模型

最近,在ABBYY识别小组中,我们越来越多地在各种任务中使用神经网络。 他们很好地证明了自己主要是针对复杂的写作类型。 在过去的文章中,我们讨论了如何使用神经网络识别日语,中文和朝鲜语脚本。

图片 关于日语和汉字识别的帖子
图片 韩文字符识别帖子

在这两种情况下,我们都使用神经网络完全替代了单个符号的分类方法。 所有方法都包括许多不同的网络,其中一些任务包括需要在不是符号的图像上充分工作。 在这种情况下,模型应该以某种方式表明我们不是符号。 今天,我们将讨论原则上为什么有必要这样做,以及可以用来达到预期效果的方法。

动机


怎么了 为什么要处理不是单独字符的图像? 看起来您可以将字符串的片段划分为字符,对所有字符进行分类,然后从中收集结果,例如,如下图所示。



是的,特别是在这种情况下,这确实可以做到。 但是,可惜的是,现实世界要复杂得多,实际上,在识别时,您必须应对几何变形,模糊,咖啡渍和其他困难。

因此,您通常必须使用以下片段:



我认为问题出在每个人面前。 根据片段的这种图像,将其明确地划分为单独的符号以便分别识别它们并不是那么简单。 我们必须提出一组关于字符之间的边界在哪里以及字符本身在哪里的假设。 为此,我们使用了所谓的线性除法图(GLD)。 在上面的图片中,此图显示在底部:绿色部分是构建的GLD的弧线,即有关各个符号位于何处的假设。

因此,针对其启动单个字符识别模块的某些图像实际上不是单个字符,而是分段错误。 并且该模块应该在其前面发出信号,很可能不是符号,从而对所有识别选项返回低置信度。 而且,如果这没有发生,那么最后,可能会选择错误的选项来按符号对片段进行分割,这将大大增加线性除法误差的数量。

除了分段错误外,模型还必须能够抵抗页面中的先验垃圾。 例如,此处还可以发送此类图像来识别单个字符:



如果仅将此类图像分类为单独的字符,则分类结果将属于识别结果。 而且,实际上,这些图像只是二值化算法的伪像,在最终结果中没有任何内容与之对应。 因此,对于他们来说,您还需要能够对分类返回低置信度。

所有类似的图片:细分错误,先验垃圾等。 在下文中,我们将其称为反例。 真实符号的图像将被称为正面示例。

神经网络方法的问题


现在让我们回想一下正常的神经网络如何识别单个字符。 通常,这是某种卷积和完全连接的层,借助这些层,可以从输入图像中形成属于每个特定类别的概率向量。



此外,类别的数量与字母的大小一致。 在神经网络的训练过程中,将提供真实符号的图像,并教授它们返回正确符号类别的高概率。

如果将分段错误和先验垃圾输入神经网络,将会发生什么? 实际上,从理论上讲,任何事情都可能发生,因为网络在学习过程中根本看不到此类图像。 对于某些图像,这可能是幸运的,并且网络将为所有类别返回低概率。 但是在某些情况下,网络可能会开始在入口处的垃圾中搜索某个符号(例如,符号“ A”)的熟悉轮廓,并以0.99的概率识别出该符号。

在实践中,例如,当我们针对日文和中文写作的神经网络模型进行工作时,使用网络输出中的粗略概率会导致出现大量分割错误。 而且,尽管事实上符号模型在图像的基础上运行良好,但无法将其集成到完全识别算法中。

有人可能会问:为什么恰恰在神经网络中会出现这样的问题? 为什么属性分类器不能同时工作,因为它们也在图像的基础上进行研究,这意味着学习过程中没有负面的例子?

我认为,根本的区别在于符号与符号图像的区别方式。 在常规分类器的情况下,一个人自己会在如何了解其设备的知识的指导下规定如何提取它们。 在神经网络的情况下,特征提取也是模型的训练部分:它们被配置为可以最佳方式区分不同类别中的字符。 并且在实践中,事实证明,人所描述的特征更能抵抗不是符号的图像:它们不太可能与真实符号的图像相同,这意味着可以向其返回较低的置信度值。

通过中心损失增强模型稳定性


因为 根据我们的怀疑,问题在于神经网络如何选择信号,我们决定尝试改进这一特定部分,即学习如何突出显示某些“好”信号。 在深度学习中,有一个单独的部分专门讨论该主题,称为“代表性学习”。 我们决定在这一领域尝试各种成功的方法。 提出了大多数解决方案用于训练面部识别问题中的表示。

文章“ 用于深度面部识别的判别性特征学习方法 ”中描述的方法似乎很好。 作者的主要思想是:为损失函数添加一个附加项,这将减少同一类元素之间特征空间中的欧几里得距离。



对于一般损失函数中该术语权重的各种值,可以在属性空间中获得各种图像:



该图显示了二维属性空间中测试样本元素的分布。 考虑了对手写数字进行分类的问题(样本MNIST)。

作者陈述的重要属性之一:增强了对于不在训练集中的人的特征的泛化能力。 某些人的脸仍位于附近,而其他人的脸则相距甚远。

我们决定检查是否保留了类似的字符选择属性。 在这种情况下,它们遵循以下逻辑:如果在特征空间中将同一类的所有元素紧凑地分组在一个点附近,则否定示例的符号将不太可能位于同一点附近。 因此,作为过滤的主要标准,我们使用了到特定类统计中心的欧几里得距离。

为了检验该假设,我们执行了以下实验:我们训练了用于从音节字母(所谓的假名)中识别一小部分日语字符的模型。 除了训练样本外,我们还检查了3个否定实例的人工基础:

  • 对-一组成对的欧洲字符
  • 裁切-日语线条的片段切成间隙,而不是字符
  • 非假名-日语字母表中与所考虑子集无关的其他字符

我们希望将经典方法与交叉熵损失函数与中心损失方法进行比较,以过滤否定样本。 否定示例的过滤标准不同。 在交叉熵损失的情况下,我们使用来自最后一层的网络响应,在中心损失的情况下,我们使用到属性空间中类的统计中心的欧几里得距离。 在这两种情况下,我们都选择了相应统计数据的阈值,从该阈值中消除了不超过3%的测试样本阳性样本,并查看了每个数据库中在此阈值消除的阴性样本的比例。


如您所见,“中心损​​失”方法确实在过滤负面示例方面做得更好。 而且,在两种情况下,我们在学习过程中都没有负面例子的图像。 这实际上非常好,因为在一般情况下,要获得OCR问题中所有负面示例的代表性基础并不是一件容易的事。

我们将此方法应用于识别日语字符的问题(在两级模型的第二级),结果令我们感到满意:线性除法错误的次数减少了数倍。 尽管错误仍然存​​在,但是它们可以根据特定类型进行分类:是带有标点符号的数字对或象形文字对。 对于这些错误,已经有可能形成一些负面例子的综合基础,并将其用于学习过程中。 关于如何做到这一点,将进一步讨论。

在训练中运用负面范例的基础


如果您有一些负面的例子,那么在学习过程中不使用它是愚蠢的。 但是,让我们考虑一下如何做到这一点。

首先,考虑最简单的方案:将所有否定示例分组到一个单独的类中,并在与该类相对应的输出层中添加另一个神经元。 现在,在输出中,我们获得了N + 1类的概率分布。 我们教了通常的交叉熵损失。

该示例是否定的标准可以认为是相应的新网络响应的值。 但是有时质量不是很高的真实字符可以归类为负面示例。 是否可以使正例和负例之间的过渡更加顺畅?

实际上,您可以尝试不增加输出总数,而只是在学习时将模型应用消极示例时,使模型返回所有​​类的低响应。 为此,我们不能将N + 1st输出明确添加到模型中,而只是将所有其他类的响应中的–max值添加到N + 1st元素中。 然后,当在输入中应用否定示例时,网络将尝试尽可能多地执行操作,这意味着最大响应将尝试使操作尽可能少。



正是这样的方案,我们在日本人的两层模型的第一层应用了第二层的“中心损失”方法。 因此,在第一个级别过滤了一些负面示例,在第二个级别过滤了一些负面示例。 结合起来,我们已经设法获得了可以嵌入到通用识别算法中的解决方案。

总的来说,有人可能会问:在“中心损失”方法中,如何使用否定示例的基础? 事实证明,我们需要以某种方式推迟在属性空间中靠近类统计中心的否定示例。 如何将此逻辑放入损失函数中?

图片 -负面例子的迹象,以及 图片 -班级中心。 然后我们可以考虑损失函数的以下加法:



在这里 图片 -中心样本与否定样本之间有一定的允许差距,在其中要对否定样本施加惩罚。

中心损失与上述添加剂的结合,例如,我们已经成功地将某些分类器应用于识别朝鲜语字符的任务。

结论


通常,当您具有相对于其余类别而言隐含的高度不平衡且没有良好代表基础的情况下,上述所有过滤所谓“否定示例”的方法都可以应用于任何分类问题。 。 OCR只是其中一个最严重的问题。

自然地,所有这些问题仅在使用神经网络作为识别单个字符的主要模型时出现。 当使用端到端线识别作为整体单独的模型时,不会出现这样的问题。

OCR新技术集团

Source: https://habr.com/ru/post/zh-CN449524/


All Articles