OCR算法改进

15

我正在使用Java创建一种基于OCR(Optical Character Recognition,光学字符识别)的技术。我的目标是从视频文件中提取文本(后处理)。

寻找一个纯Java的免费、开源OCR一直是一项艰巨的任务。我发现Tess4J是唯一流行的选择,但考虑到需要本地接口,我决定从头开始开发算法。

我需要创建一个可靠的OCR,能够以合理的准确度正确识别英文字母(只有计算机字体,没有手写文本),假设文本所在的视频帧区域是预定义的,并且给出了文本的颜色。

到目前为止我已经完成的内容:

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

  1. 我已经提取了用于训练分类器的特征:

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

    B. 沿8个不同角度(0, 11.25, 22.5等)的Gabor小波变换和使用所有这些角度的信号的均方值计算的能量。 (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个)来训练分类器。

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

    A. 具有1个隐藏层(120个节点)的人工神经网络(ANN)。输入层有152个节点,输出层有62个节点。隐藏层和输出层具有Sigmoid激活函数,并且使用Resilient Back Propagation进行网络训练。

    B. 对整个152维数据使用kNN(k近邻法)分类。

目前进展:

k-最近邻搜索在分类方面比神经网络(到目前为止)表现更好。然而,即使是使用kNN,我仍然发现难以对像 6m 这样的字母进行分类。

此外,它将 2 分类为Z...这些都是异常情况之一。

我要寻找以下信息:

我想要找到以下答案:

  1. 为什么ANN表现不佳?应该使用哪种网络配置来提高性能?我们可以微调ANN以使其比kNN更好吗?

  2. 我可以使用哪些其他特征向量来使OCR更加鲁棒?

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


神经网络应该可以轻松胜过KNN搜索!我建议使用常见的统计软件R来找出在你的数据集上起作用的算法,然后才开始关注你的实现。现在几乎不可能确定问题是出在你的实现、训练数据还是决策制定者身上。 - Nallath
好的。为了实现我的目标(OCR),我应该使用哪种类型的人工神经网络才能获得最佳结果?我已经使用OpenCV和Encog框架交叉检查了我的ANN实现,两个API似乎产生了类似的结果。因此,问题归结为:1)我的ANN配置不够优化(这是我认为的)或2)我用于训练ANN的特征向量不够好。请给我一个关注点的想法? - metsburg
可能是由于过度拟合或欠拟合导致结果不佳。您是否知道是否存在某些字母会导致失败,还是整个数据集表现不佳? - Nallath
你的 NN 中使用了卷积层吗? - Josep Valls
2个回答

2
kNN算法不需要像神经网络那样进行大量的调整,因此您可以轻松获得良好的性能,但是多层感知器可能会胜过kNN。目前,我认为使用深度学习可以获得最佳结果,例如您可以看一下卷积神经网络。
根据维基百科:
CNN由一个或多个卷积层组成,顶部有与典型人工神经网络相匹配的全连接层。它还使用绑定权重和池化层。这种架构使CNN能够利用输入数据的2D结构。与其他深度架构相比,卷积神经网络开始在图像和语音应用中显示出优越的结果。它们也可以通过标准反向传播进行训练。CNN比其他常规的深度前馈神经网络更容易训练,并且要估计的参数要少得多,这使它们成为一种非常有吸引力的架构。
说到您的多层感知器,有很多算法可以搜索更好的参数,例如网格搜索或群体优化。我喜欢使用遗传算法来调整NN的参数,它相当简单并且具有良好的性能。
我推荐您使用Java中一个非常不错的遗传算法框架JGap,它可以直接使用。 :)
以下是JGAP关于遗传算法的介绍,比我的任何介绍都更好:
遗传算法(GA)是一种通过自然选择过程工作的搜索算法。它们从潜在解决方案的样本集开始,然后逐渐演化成更优解的集合。在样本集中,质量较差的解决方案往往会消亡,而更好的解决方案则会交配并传播其有利特征,从而将更多具有更大潜力的解决方案引入集合中(总集合大小保持不变;每添加一个新解决方案,就会删除一个旧的解决方案)。稍微随机变异有助于确保集合不会停滞不前,简单地填充许多相同解决方案的副本。

总的来说,遗传算法通常比传统优化算法表现更好,因为它们不太可能被局部最优解误导。这是因为它们不使用单点转移规则从解决方案空间中的一个单一实例移动到另一个单一实例。相反,遗传算法利用分布在解决方案空间中的整个解决方案集,所有这些解决方案都在试验许多潜在最优解。

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

相对于其他潜在解决方案,评估一个潜在解决方案的“好坏”必须相对容易。

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

最后,遗传算法最适合需要“好”的答案的情况,即使它不是绝对最佳答案。


JGAP看起来非常有趣。我看了一下他们网站上提供的例子。你觉得它和梯度下降算法相比如何? - user4624062
梯度下降反向传播为您提供了一种优化网络权重的方法,以使用前馈神经网络逼近函数。遗传算法是一种通用优化器,可以帮助您确定网络的最佳拓扑结构和/或网络的权重。您还可以混合这两种方法,使用GA找到良好的拓扑结构,并使用反向传播计算权重 :) 但是,这可能会变得计算昂贵。 - NiziL
只是好奇,你认为SVM在OCR的分类部分会表现如何?我以前用过GA,它们非常适合程序员使用,甚至可以从头开始实现。关于使用GA进行OCR的好建议,有一天会尝试一下! - metsburg
@metsburg,实际上我从未使用过SVM,所以我不想说废话:P但是如果你想测试其他方法,我真的很推荐卷积神经网络。我看过一场关于它的会议,它似乎非常酷=)它不需要特征向量:它自己学习特征!但需要大量的训练数据(对于OCR来说非常容易找到)。 - NiziL

-1
针对特征向量:你是否对强度进行了归一化?也许可以使用直方图均衡化。
针对分类:看看 t-SNE。它是一种将高维特征降为易于聚类的二维平面的随机方法。

我对特征向量进行了归一化处理,因此输入值在[0 1]之间。 - user4624062

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接