2

我一直在尝试使用 Tesseract 来识别一系列图像中的一些数字,在寻求建议后,我做了一些改进。到目前为止,我已经尝试了以下步骤:

  • 以适当的阈值对图像进行二值化以挑选出数字
  • 将 Tesseract 限制为仅数字
  • 使用多种方法放大图像(getScaledInstance with Image.SCALE_SMOOTH, AffineTransform using AffineTransformOp.TYPE_BICUBIC)
  • 探索不同的 Tesseract 页面分割模式。目前使用模式 6。

这些数字在形状上都是相同的,并且完全对齐,尽管它们的边缘有些锯齿状。处理后的图像示例:

在此处输入图像描述 在此处输入图像描述

Tesseract 对这些没问题,但它经常混淆 8 与 3、6 与 5、9 与 5。

我一直在寻找一些不同的方法来平滑图像并尝试不同的比例,但我也想知道仅仅通过训练 Tesseract 的过程是否更有意义。只有 10 个可能的值总是几乎相同,看起来学习识别它们应该不会太难,但训练 Tesseract 似乎也很痛苦。

关于如何在这些图像上从 Tesseract 获得最后一点准确性的任何建议?

我正在使用 tess4j 和 Java,因此特别感谢 Java 特定的建议和库。虽然我愿意自己实现算法,但我不想重新发明轮子。

4

1 回答 1

4

我尝试了更多的预处理想法,但没有取得太大进展,包括各种类型的灰度、图像颜色反转、调整大小和替代二值化策略。这些都没有比我原来的、未调整大小的二值化得到改进。最终,我决定试一试 Tesseract 培训。我按照这里的说明进行操作: Manual Tesseract Training Walkthrough

我很难找到任何可以在 64 位 Windows 中实际运行的程序来帮助我,最终我手动完成了大部分工作。我使用 jTessBoxEditor 编辑手动生成的 .box 文件,尽管我还在文本编辑器中进行了一些编辑,以添加框文件生成器丢失的缺失字符的条目。我只有这些小 tiffs 可以解决,所以我的培训文件不符合 Tesseract wiki 指南,但是很好。

使用 box.train 时出现一些错误:

FAIL! apply_boxes BOXFILE LINE ... failure! COULDN'T FIND A MATCHING BLOB

在无效的谷歌搜索之后,我决定忽略它们并继续前进。

尝试运行 cntraining 时出现更多错误:

Error: Illegal number of feature sets!
signal_termination_handler:Error:Signal_termination_handler called:Code 3001

在进行了更多无效的谷歌搜索之后,我基本上尝试依次省略每个 .tr 文件,以查看是哪个文件导致了问题。最终我能够用 1 个丢失的文件完成 cntraining。我不知道这对我的输出有什么影响,但我再次决定忽略它并继续前进。

我在运行 combine_tessdata 时遇到了另一个问题:

Error opening unicharset file
Error combining tessdata files into foo.traineddata

这是因为我需要将我的 lang 前缀放在 unicharset 文件之前,而本教程并未指示我这样做。之后,我成功地构建了一个经过训练的数据文件。不知道它是否会起作用,我把它放到我的 tessdata 目录中,将我的语言切换到新的训练语言并再次尝试。

瞧,太完美了。它现在似乎可以 100% 准确地识别我的数字(至少在我有限的样本量中)。我正在做的唯一预处理是将图像二值化,无需进一步清理或重新缩放。

因此,显然,对于一个小字符集,手动训练是值得的。我大概花了 3 个小时来摸索找到有效的工具,并在整个过程中拼凑起来。作为参考,我从 14 个 tif 开始,与我最初的帖子中的那些类似。其中四个在此过程中出现了一个或另一个错误,加上我从 cntraining 中省略的 1(但没有从其他任何东西中......?),所以就像.. 9 和 2/3 的图像进行训练。这显然已经足够了,这要归功于我的角色的一致性。

于 2015-02-26T06:12:35.617 回答