mli*_*ner 3 c++ python performance tesseract
这是一个长镜头,但我不得不问。我需要任何可能使 Tesseract OCR 引擎更快的想法。我正在处理由大约 2000 万页文本组成的 200 万个 PDF,我需要尽可能地发挥性能。目前的估计是,如果我什么都不做,这将需要大约一年的时间才能完成。
我已经调整了输入图像以在那里获得一些提升,但我需要考虑其他方法。我认为对图像的改进不会让我在这一点上有所作为。
例如:
目前,Tesseract 由我们的任务运行器 Celery 运行,它使用多处理来完成其工作。这样,我可以使服务器看起来像这样:
我(显然?)不知道我在说什么,因为我是一名 Python 开发人员,而 Tesseract 是用 C++ 编写的,但是如果有任何方法可以在这里得到提升,我会喜欢想法。
我也有巨大的 OCR 需求,而 Tesseract 太慢了。我最终选择了一个类似于这个的自定义前馈网络。不过,您不必自己构建它;您可以使用像Nervana neon这样的高性能库,它恰好易于使用。
那么问题有两个部分:
1) 将字符与非字符分开。
2) 将字符馈送到网络。
假设您按 size 批量输入字符1000
,将每个字符调整为尺寸8 x 8
(64 像素),并且您想要识别 26 个字母(小写和大写)和 10 个数字和 10 个特殊字符(总共 72 个字形)。然后解析所有 1000 个字符最终成为两个(非关联!)矩阵产品:
(A
点B
)点C
。
A
将是一个1000 x 64
矩阵,B
将是一个64 x 256
矩阵,C
将是一个256 x 72
矩阵。
对我来说,这比 Tesseract 快几个数量级。只需对您的计算机执行这些矩阵产品的速度进行基准测试(元素是浮点数)。
矩阵乘积是非关联的,因为在第一个乘积之后,您必须应用一个称为 ReLU 的(廉价)函数。
我花了几个月的时间才从头开始工作,但 OCR 是我项目的主要部分。
此外,分割字符并非易事。根据您的 PDF,它可以是任何东西,从简单的计算机视觉练习到人工智能中的开放研究问题。
我并不是说这是最简单或最有效的方法……这就是我所做的!