OCR 算法改进

2022-09-03 16:16:29

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

这是一个困难的搜索,试图找到完全在Java上运行的免费开源OCR。我发现Tess4J是唯一流行的选择,但考虑到对本机界面的需求,我不知何故倾向于从头开始开发算法。

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

到目前为止,我所做的工作:

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

  1. 我提取了用于训练分类器的功能:

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

    B. Gabor小波在8个不同角度(0,11.25,22.5 ...etc)以及使用所有这些角度的信号均方值计算的能量。(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激活功能,并且网络使用弹性反向传播进行训练。

    B. kNN 分类,适用于整个 152 个维度。

我的立场:

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

此外,它被分类2为Z...仅举几例异常。

我要找的:

我想找出以下几点:

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

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

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


答案 1

与神经网络不同,kNN算法不需要太多的调整,因此您可以轻松获得良好的性能,但是多层感知器的性能可能会超过kNN。目前,我认为最好的结果是使用深度学习,例如,你应该看看卷积神经网络。

来自维基百科:

CNN由一个或多个卷积层组成,其顶部有完全连接的层(与典型的人工神经网络中的层相匹配)。它还使用绑砝码和池化层。此体系结构允许 CNN 利用输入数据的 2D 结构。与其他深度架构相比,卷积神经网络开始在图像和语音应用中显示出卓越的结果。他们也可以用标准的反向传播来训练。CNN比其他常规的、深度的、前馈的神经网络更容易训练,并且需要估计的参数要少得多,这使得它们成为一个非常有吸引力的架构。

说到你的MLP,有很多算法可以搜索更好的参数,例如网格搜索或群体优化。我喜欢使用遗传算法来调整NN的参数,它非常简单,并且会产生良好的性能。

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

以下是JGAP对遗传算法的介绍,这比我的任何演示都要好:

遗传算法(GA)是通过自然选择过程工作的搜索算法。他们从一组潜在解决方案的样本开始,然后向一组更优化的解决方案发展。在样本集中,较差的解往往会消亡,而较好的解会交配并传播其有利特征,从而将更多具有更大潜力的解引入到集合中(总集大小保持不变;对于每个添加的新解,都会删除一个旧解)。一点点随机突变有助于保证一个集合不会停滞不前,只是简单地填满同一解决方案的大量副本。

一般来说,遗传算法往往比传统的优化算法工作得更好,因为它们不太可能被局部最优引入歧途。这是因为它们不使用单点转换规则从解决方案空间中的一个实例移动到另一个实例。相反,GA利用了分布在整个解决方案空间的整套解决方案,所有这些解决方案都在对许多潜在的最优值进行试验。

但是,为了使遗传算法有效工作,必须满足以下几个标准:

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

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

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


答案 2

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

分类:查看 t-SNE。它是一种将高维特征简化为更易于抓取的2D平面的随机方法。


推荐