Java OCR算法改进

Java OCR算法改进,java,opencv,ocr,knn,neural-network,Java,Opencv,Ocr,Knn,Neural Network,我正在创建一个基于Java的OCR。我的目标是从视频文件中提取文本(后处理) 这是一个艰难的搜索,试图找到纯粹在Java上工作的免费开源OCR。我发现Tess4J是唯一流行的选项,但考虑到对本机接口的需要,我不知何故倾向于从头开始开发算法 我需要创建一个可靠的OCR,能够以合理的精度正确识别英文字母(仅计算机化字体,而非手写文本),因为视频帧中的文本区域是预定义的。我们也可以假设文本的颜色是给定的 到目前为止我所做的: (使用openCV的Java绑定完成所有图像处理) 我提取了用于训练分类器的

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

这是一个艰难的搜索,试图找到纯粹在Java上工作的免费开源OCR。我发现Tess4J是唯一流行的选项,但考虑到对本机接口的需要,我不知何故倾向于从头开始开发算法

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

到目前为止我所做的:

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

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

    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个)训练分类器

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

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

    B.整个152个尺寸的kNN分类

  • 我的立场:

    到目前为止,k-最近邻搜索是比神经网络更好的分类器。然而,即使使用kNN,我发现很难对字母进行分类,如: 或者

    此外,它还被归类为Z。。。仅举几个反常现象

    我在找什么:

    我想了解以下情况:

  • 为什么安表现不佳?我应该使用什么样的网络配置来提高性能?我们是否可以微调ANN,使其性能优于kNN搜索

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


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

    对于特征向量:您是否规范化了强度?也许可以使用直方图均衡化


    分类:看一看。这是一种将高维特征简化为更容易聚类的二维平面的随机方法。

    kNN算法与神经网络不同,不需要太多调整,因此可以轻松获得良好的性能,但多层感知器的性能可能优于kNN。目前,我认为使用深度学习可以达到最佳效果,您应该以卷积神经网络为例

    来自维基百科:

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

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

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

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

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

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

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

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

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

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


    神经网络应该比KNN搜索更出色,而且不会出一身冷汗