OCR算法改进

Posted

技术标签:

【中文标题】OCR算法改进【英文标题】:OCR algorithm improvement 【发布时间】:2014-07-15 07:20:49 【问题描述】:

我正在创建一个基于 Java 的 OCR。我的目标是从视频文件中提取文本(后处理)。

这是一个艰难的搜索,试图找到完全适用于 Java 的免费、开源 OCR。我发现 Tess4J 是唯一流行的选项,但鉴于对本机界面的需求,我不知何故倾向于从头开始开发算法。

鉴于文本在视频帧中所在的区域是预先定义的,我需要创建一个可靠的 OCR,以合理的准确度正确识别英文字母(仅限计算机字体,而不是手写文本)。我们也可以假设文本的颜色是给定的。

到目前为止我做了什么:

(所有图像处理都使用 Java 绑定为 openCV 完成)

    我提取了用于训练分类器的特征:

    A.将字符图像下采样到 12 X 12 分辨率后的像素强度。 (144 个特征向量)

    B. Gabor 小波变换跨越 8 个不同的角度(0、11.25、22.5 ...等),并使用所有这些角度的信号均方值计算能量。 (8个特征向量)

A+B 给了我图像的特征向量。 (共152个特征向量)

我有 62 个分类类,即。 0,1,2...9 | a,b,c,d...y,z | A,B,C,D...Y,Z

我使用 20 x 62 个样本(每个类 20 个)训练分类器。

    对于分类,我使用了以下两种方法:

    A.具有 1 个隐藏层(120 个节点)的 ANN。输入层有 152 个节点,输出有 62 个节点。隐藏层和输出层有 sigmoid 激活函数,网络使用弹性反向传播进行训练。

    B.对整个 152 个维度进行 kNN 分类。

我的立场:

k-最近邻搜索被证明是比神经网络更好的分类器(到目前为止)。但是,即使使用 kNN,我也很难对以下字母进行分类: 或 。

此外,它将 归类为 Z... 仅举几例异常情况。

我在寻找什么:

我想了解以下内容:

    为什么 ANN 表现不佳?我应该使用什么网络配置来提高性能?我们能否对 ANN 进行微调,使其性能优于 kNN 搜索?

    我可以使用哪些其他特征向量来使 OCR 更加健壮?

欢迎任何其他性能优化建议。

【问题讨论】:

神经网络的性能应该优于 KNN 搜索,而且不会出汗!我可以推荐使用 R,一个常用的统计软件来找出哪些算法适用于你的数据集,然后才开始专注于你的实现。现在几乎不可能判断问题出在您的实施、训练数据还是决策者中。 好的。我应该使用什么类型的 ANN 来获得我的目标 (OCR) 的最佳结果?我已经使用 OpenCV 和 Encog 框架交叉检查了我的 ANN 实现,这两个 API 似乎都产生了相似的结果。因此,它归结为 1)我的 ANN 配置是次优的(这是我认为的)或 2)我用来训练 ANN 的特征向量不符合标准。请给我一个想法,我应该关注哪里? 可能是您的结果过拟合或欠拟合。您是否知道是否有某些字母失败了,或者是整个数据集表现不佳? 您是否在 NN 中使用任何卷积层? 【参考方案1】:

kNN 算法不需要太多的调整,不像神经网络,所以你可以很容易地获得良好的性能,但是多层感知器可能会优于 kNN。目前,我认为使用深度学习可以达到最好的效果,你应该看看卷积神经网络。

来自***:

CNN 由一个或多个卷积层组成,具有完全 连接层(匹配那些典型的人工神经 网络)在顶部。它还使用绑定权重和池化层。这 架构允许 CNNs 利用 2D 结构 输入数据。与其他深度架构相比,卷积 神经网络开始在两个图像中都显示出优异的结果 和语音应用。他们也可以接受标准培训 反向传播。 CNN 比其他常规、深度、 前馈神经网络,并且具有更少的参数 估计,使它们成为一种极具吸引力的架构。

谈到您的 MLP,有很多算法可以搜索更好的参数,例如网格搜索或群体优化。我喜欢使用遗传算法来调整神经网络的参数,它非常简单,并且性能很好。

我推荐你JGap,一个不错的java遗传算法框架,可以开箱即用:)

这是JGAP对遗传算法的介绍,比我的任何介绍都好:

遗传算法 (GA) 是通过 自然选择的过程。他们从一组样本开始 潜在的解决方案,然后朝着一组更优化的方向发展 解决方案。在样本集中,较差的解决方案往往会死亡 出局,而更好的解决方案配合并传播其优势 特征,从而在集合中引入更多的解决方案 更大的潜力(总集合大小保持不变;对于每个新的 添加解决方案,删除旧解决方案)。一点随机突变有帮助 保证一个集合不会停滞不前,只会填满无数 相同解决方案的副本。

一般来说,遗传算法往往比传统算法效果更好 优化算法,因为它们不太可能误入歧途 由局部最优。这是因为他们不使用单点 从解决方案中的单个实例移动的转换规则 空间到另一个。相反,GA 会利用一整套 解决方案遍布整个解决方案空间,所有这些都是 试验许多潜在的最佳方案。

但是,为了使遗传算法有效地工作,一些 必须满足条件:

评估潜在解决方案的“好”程度必须相对容易 是相对于其他潜在的解决方案。

必须可以将潜在的解决方案分解为离散的部分 可以独立变化。这些部分成为了“基因” 遗传算法。

最后,遗传算法最适合以下情况: “好”的答案就足够了,即使它不是绝对的最佳答案。

【讨论】:

JGAP 似乎很有趣。我查看了他们在其网站上提供的示例。您如何将其与梯度下降算法进行比较? @Dien 梯度下降反向传播为您提供了一种优化网络权重的方法,用前馈神经网络逼近一个函数。遗传算法是一种通用优化器,它可以帮助您确定网络的最佳拓扑和/或网络的权重。您也可以混合使用这两种方法,使用 GA 找到一个好的拓扑,然后使用反向传播计算权重 :) 但是,它的计算成本可能会很高。 只是好奇,您认为 SVM 在 OCR 的分类部分会表现如何?我以前用过 GA,它们对程序员非常友好,你甚至可以“从头开始”实现。使用 GA 进行 OCR 的好建议,总有一天会尝试的! @metsburg 实际上,我从不使用 SVM,所以我不想说废话 :P 但是如果你想测试其他方法,我真的推荐你卷积神经网络。我看过一个关于它的会议,看起来真的很酷 =) 它不需要特征向量:它自己学习特征!但是需要大量的训练数据(这对于 OCR 来说真的很容易找到)【参考方案2】:

对于特征向量:您是否对强度进行了归一化?也许使用直方图均衡化。

分类:看t-SNE。它是一种将高维特征减少为更易于聚类的二维平面的随机方法。

【讨论】:

我对特征向量进行了归一化。所以输入值在 [0 1] 中。

以上是关于OCR算法改进的主要内容,如果未能解决你的问题,请参考以下文章

JavaCV - 改进 ocr

使用模糊文本改进 Tesseract OCR 结果

有没有办法用小字体改进 tesseract OCR?

如何使用 Pytesseract 文本识别改进 OCR?

改进 OCR/图像识别的预处理

使用 OpenCV 改进文本二值化/OCR 预处理