C ++ - 使用Tesseract令人失望的性能

时间:2013-07-11 17:26:20

标签: c++ performance ocr tesseract

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

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

我的初步观察(其中一些可能已关闭,请随时在评论中纠正我的解释):

  • 准确性很好。它与我们目前的发动机相比非常好。
  • 输出格式仅提供已识别的文本,而不是预览文本在原始图像中的位置。 有可能采用hOCR格式并将其转换为其他更具视觉吸引力的东西,但我未能在Windows上找到适合商业用途的开源转换器(我找不到)来自ExactCODE's hocr2pdf的源或可执行文件。我可能编写一个简单的脚本,可以为每个段落转换检测到的bbox,只需添加style元素即可设置leftright,{{1 HTML标记的{}},widthheight属性,因此此限制很小。
  • Leptonica(Tesseract使用的图像库)appears not to support reading complex PDF files。虽然这确实为迁移添加了一个小的开发开销(因为它不是开箱即用的),但它并不是一个问题,因为我们的产品中已经有模块从PDF文件中提取图像。 / LI>
  • 执行速度非常慢(至少与Nuance的OmniPage相比)。在我的机器上,Tesseract花费了超过2分钟的时间在这个问题的最后转换文件。 Nuance的OmniPage花了不到3分30秒的时间来转换10个大文件(包括提供的图像)。 (我不记得到底有多长时间,但仅显示所提供图像的时间不到15秒)

如果只是关于其他因素,那么迁移可能没有太多问题。但是,这种性能限制是一个杀手锏。

然后,我心想:与其商业等价物相比,Tesseract的表现如何糟糕?谷歌肯定会为表现而努力。

所以,我几乎可以肯定这个问题来自我。我要么没有以正确的方式使用API​​,我也没有改变我应该或其他我刚才缺少的设置。

以下是与Tesseract相关的测试程序部分:

position

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

使用VerySleepy对应用程序进行快速分析表明,大部分执行时间都花费在与#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 new相关的边界框上。

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

非常感谢你宝贵的时间。

以下是我的测试集中的图片:

Sample OCR image

1 个答案:

答案 0 :(得分:10)

我认为你不能为此做点什么。这是对的,与OmniPage或ABBYY等商业引擎相比,Tesseact的速度非常慢。每个比较测试都显示出来。这些公司正在以OCR为生,对速度,准确性和其他因素非常认真。