OCR算法改进

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (158)

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

这是一个困难的搜索,试图找到完全在Java上工作的免费、开放源码的OCR。我发现Tess4J是唯一受欢迎的选择,但考虑到对本机接口的需求,我不知何故倾向于从头开始开发算法。

我需要创建一个可靠的OCR,以合理的准确性正确识别英文字母(只有电脑字体,而不是手写文本),因为视频帧中的文本所在区域是预先定义的。我们也可以假定文本的颜色是给定的。

我迄今所做的:

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

  1. 我使用以下方法提取了用于训练分类器的特征:像素强度,下降后-采样字符图像到12×12分辨率.(144个特征向量)B.Gabor小波变换,涉及8个不同的角度(0,11.25,22.5.等),以及用信号的均方值计算出的能量。(8个特征向量)

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

我有62个分类课,即。0,1,2.9\x{e76f}a,b,c,d.y,z\x{e76f}A,B,C,D.

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

  1. 对于分类,我使用了以下两种方法:一个隐藏层(120个节点)的神经网络。输入层有152个节点,输出层有62个节点。隐藏层和输出层具有乙状结肠激活功能,网络使用弹性回传进行训练。B.对整个152个维度进行KNN分类。

我的立场是:

最近邻搜索是一个比神经网络更好的分类器(到目前为止)。然而,即使使用KNN,我也发现很难将字母分类如下:

此外,它还在分类。

提问于
用户回答回答于

关于特征向量:你把强度标准化了吗?也许使用直方图均衡。

用户回答回答于

KNN算法与神经网络不同,不需要进行大量的调整,因此可以很容易地获得良好的性能,但多层感知器的性能可能优于KNN。目前,我认为最好的效果是通过深入学习,你应该看看卷积神经网络的例子。

维基百科:

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

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

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

遗传算法(GA)是通过自然选择过程进行搜索的算法。它们从一组潜在解开始,然后演化成一组更优的解。在样本集中,较差的解决方案往往会消失,而更好的解决方案则会匹配和传播它们的优势特性,从而在具有更大潜力的集合中引入更多的解决方案(总集大小保持不变;对于添加的每一个新解决方案,都会删除一个旧的解决方案)。一个小的随机突变有助于保证一个集合不会停滞,只需填充大量相同解决方案的副本。一般来说,遗传算法往往比传统的优化算法工作得更好,因为它们不太可能被局部Optima引入歧途。这是因为它们没有利用单点转换规则从解决方案空间中的单个实例移动到另一个实例。相反,GA利用了一组分布在整个解决方案空间中的解决方案,所有这些方案都在许多潜在的Optima上进行实验。然而,为了使遗传算法有效工作,必须满足以下几个标准:评估一个潜在的解决方案相对于其他潜在解决方案的“好”程度必须相对容易。必须有可能将潜在的解决方案分解为可以独立变化的离散部分。这些部分成为遗传算法中的“基因”。最后,遗传算法最适合于“好”答案就足够的情况,即使它不是绝对最好的答案。

扫码关注云+社区

领取腾讯云代金券