9

我工作的公司正在考虑将其当前的 OCR 引擎(Nuance 的 OmniPage)转换为开源替代品,例如 Tesseract。

为了获得一些性能基准(执行速度和准确性)来比较两者,我设计了一个非常简单的程序来了解 Tesseract 3.2 C API 的性能。

我最初的观察(其中一些可能不正确,请随时在评论中纠正我的解释):

  • 准确度很好。它与我们当前的引擎相比非常好。
  • 输出格式仅提供已识别的文本,而不是原始图像中文本位置的预览。有可能采用hOCR 格式并将其转换为其他更具视觉吸引力的格式,但我未能在 Windows 上找到适合商业用途的开源转换器(我无法从ExactCODE 的 hocr2pdf 中找到源代码或可执行文件)。我可以编写一个简单的脚本,为每个段落转换检测到的 bbox,并添加一个设置 HTML 标记的、、和属性的style元素,所以这个限制很小。leftrightwidthheightposition
  • Leptonica(Tesseract 使用的图像库)似乎不支持阅读复杂的 PDF 文件。尽管这确实为迁移增加了少量的开发开销(因为它不是开箱即用的),但这并不是什么大问题,因为我们的产品中已经有模块可以从 PDF 文件中提取图像。
  • 执行速度非常慢(至少与 Nuance 的 OmniPage 相比)。在我的机器上,Tesseract 花了 2 分钟多一点的时间来转换这个问题结束时的文件。Nuance 的 OmniPage 用了不到 3 分 30 秒的时间来转换 10 个大文档(包括提供的图像)。(我不记得确切的时间,但显然仅提供的图像不到 15 秒)

如果只考虑其他因素,迁移可能没有太大问题。然而,这种性能限制是致命的。

然后,我心想:Tesseract 与商业同类产品相比如何表现如此糟糕?谷歌肯定会追求性能。

所以,我几乎可以肯定问题出在我身上。我要么没有以正确的方式使用 API,要么没有更改我应该更改的设置,要么没有更改我现在缺少的其他设置。

这是我的测试程序中与 Tesseract 相关的部分:

#include "baseapi.h"
#include "allheaders.h"

// ...
// Tesseract initialization
tesseract::TessBaseAPI api;
api.Init("", "eng+deu+fra");
api.SetPageSegMode(tesseract::PageSegMode::PSM_AUTO_OSD);
api.SetVariable("tessedit_create_hocr", "1"); // for the hOCR output

// ...
// OCR
PIX* pixs = pixRead(image_path.c_str());
STRING result;
api.ProcessPages(image_path.c_str(), NULL, 0, &result);

// ... write the result to a file

我尝试了不同的页面分割模式并且没有激活 hocr 格式的创建,结果和以前一样失望。我还尝试对图像应用一些预处理脚本,看看它是否有助于检测,但没有成功。我尝试只使用一本字典进行测试,但它对性能没有太大影响。我在使用多页 TIF 文件和单页 TIF 图像时也遇到了同样的性能问题,并且还没有尝试其他格式。

使用 VerySleepy 对应用程序的快速分析表明,大部分执行时间都花在了与边界框相关new的 s 和s 上。delete

我真的希望我们迁移到开源库而不是商业产品,所以如果有人可以帮助我使用 API 实现更好的性能,我将不胜感激。除非我能得到显着的改进来获得类似于当前引擎的性能结果,否则迁移不会发生。

非常感谢您宝贵的时间。

这是我的测试集中的一张图片:

示例 OCR 图像

4

1 回答 1

9

我不认为你可以做些什么。没错,与 OmniPage 或 ABBYY 等商业引擎相比,Tesseact 的速度非常慢。每个比较测试都表明这一点。这些公司以从事 OCR 为生,对速度、准确性和其他因素非常重视。

于 2013-07-18T07:25:14.450 回答