C++ - Tesseract 令人失望的性能
Posted
技术标签:
【中文标题】C++ - Tesseract 令人失望的性能【英文标题】:C++ - Disappointing performance with Tesseract 【发布时间】:2013-07-10 02:23:41 【问题描述】:我工作的公司正在考虑将其当前的 OCR 引擎(Nuance 的 OmniPage)转换为开源替代品,例如 Tesseract。
为了获得一些性能基准(执行速度和准确性)来比较两者,我设计了一个非常简单的程序,以了解 Tesseract 3.2 C API 的性能。
我的初步观察(其中一些可能是错误的,请随时纠正我在 cmets 中的解释):
准确度很好。它与我们当前的引擎相比非常出色。 输出格式仅提供已识别的文本,而不是原始图像中文本位置的预览。 有可能采用 hOCR 格式并将其转换为更具视觉吸引力的其他格式,但我未能在 Windows 上找到适合商业用途的开源转换器(我找不到ExactCODE's hocr2pdf 的源代码或可执行文件)。我可以编写一个简单的脚本来转换检测到的每个段落的 bbox,然后添加一个style
元素来设置 left
、right
、width
、height
和 @ html 标记的 987654329@ 属性,所以这个限制很小。
Leptonica(Tesseract 使用的图像库)appears not to support reading complex PDF files。尽管这确实为迁移增加了一点开发开销(因为它不是开箱即用的),但这并不是什么大问题,因为我们的产品中已经有模块可以从 PDF 文件中提取图像。
执行速度非常慢(至少与 Nuance 的 OmniPage 相比)。在我的机器上,Tesseract 花了 2 分钟多一点的时间来转换这个问题结束时的文件。 Nuance 的 OmniPage 用了不到 3 分 30 秒的时间来转换 10 个大文档(包括提供的图像)。 (我不记得确切的时间,但显然仅提供的图像不到 15 秒)
如果只考虑其他因素,迁移可能没有太大问题。然而,这种性能限制是致命的。
然后,我心想:Tesseract 与商业同类产品相比如何表现如此糟糕? Google 肯定会追求性能。
所以,我几乎可以肯定问题出在我身上。我要么没有以正确的方式使用 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 和 delete
s 上。
我真的希望我们迁移到开源库而不是商业产品,所以如果有人可以帮助我使用 API 获得更好的性能,我将不胜感激。除非我能得到显着的改进来获得类似于当前引擎的性能结果,否则迁移不会发生。
非常感谢您宝贵的时间。
这是我的测试集中的一张图片:
【问题讨论】:
【参考方案1】:我认为您对此无能为力。没错,与 OmniPage 或 ABBYY 等商业引擎相比,Tesseact 的速度非常慢。每个比较测试都表明这一点。这些公司以从事 OCR 为生,对速度、准确性和其他因素非常重视。
【讨论】:
我想这确实是合乎逻辑的。我曾假设谷歌会追求性能,但也许他们只是不需要高速度,也不需要针对他们的需求进行优化。谢谢你的回答。 :) 需要注意的一点是,谷歌似乎没有将 tesseract 用于他们自己的应用程序(至少与我们看到的代码不同),因为他们在这些应用程序中实现的性能和准确性在于与 tesseract 不同的球场。对于他们的一些开发人员来说,这似乎更像是一个侧面或 20% 的项目。以上是关于C++ - Tesseract 令人失望的性能的主要内容,如果未能解决你的问题,请参考以下文章