我正在使用Java创建一种基于OCR(Optical Character Recognition,光学字符识别)的技术。我的目标是从视频文件中提取文本(后处理)。
寻找一个纯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激活函数,并且使用Resilient Back Propagation进行网络训练。
B. 对整个152维数据使用kNN(k近邻法)分类。
目前进展:
k-最近邻搜索在分类方面比神经网络(到目前为止)表现更好。然而,即使是使用kNN,我仍然发现难以对像 或
这样的字母进行分类。
此外,它将 分类为Z...这些都是异常情况之一。
我要寻找以下信息:
我想要找到以下答案:
为什么ANN表现不佳?应该使用哪种网络配置来提高性能?我们可以微调ANN以使其比kNN更好吗?
我可以使用哪些其他特征向量来使OCR更加鲁棒?
欢迎提供任何其他的性能优化建议。