如何加速 tesseract OCR

Posted

技术标签:

【中文标题】如何加速 tesseract OCR【英文标题】:How to speed up tesseract OCR 【发布时间】:2017-11-03 12:02:00 【问题描述】:

我正在尝试对很多文档进行 OCR(我的意思是每天 300k + 范围)。目前我正在使用Tesseract wrapper for .NET,它的质量都很好,但速度还不够好。我从同一个 pdf 并行扫描半页的 20 个任务平均每次扫描需要 2,546 秒。我使用的代码:

using (var engine = new TesseractEngine(Tessdata, "eng", EngineMode.TesseractOnly))
        
            Page page;
            page = engine.Process(image, srcRect);        
            var text = page.GetText();
            return Task.FromResult(text);
        

我得到的平均时间是在将图像分辨率降低一半并将其转换为灰度之后。有什么想法可以加快这个过程吗?我不需要分割文本,只需一行中的文本。我应该使用Matlab for c#?

【问题讨论】:

你是否为每个页面创建一个新引擎(调用new TesseractEngine)? @GWigWam 是的,目前它就是这样工作的。我很确定它不支持并行使用 你是对的,它不支持并行使用。但是创建它的成本很高。 @GWigWam 好的,这让我思考,我在没有创建引擎的情况下检查了处理时间,它让我少了大约 0.3~0.4 秒。经过一些调整后可能会有所帮助,但仍然不够。还是谢谢 这仍然是 20% 的改进,尽管我希望它会做得更多。 【参考方案1】:

目前,您为扫描的每个页面创建一个新的TesseractEngine 对象。创建引擎的成本很高,因为它会读取“tessdata”文件。

您说您有 20 个并行任务正在运行。由于引擎不能一次处理多个页面,您需要为每个任务创建一个引擎并将其重用于任务处理的所有页面。您只需调用using (var page = Engine.Process(pix)) 即可使用现有引擎处理下一页。

重用引擎应该会显着提高性能,因为您只需创建 20 个引擎而不是 300k。

【讨论】:

我不会说处理时间减少 10% 是“显着的”,但这取决于 太好了,为我节省了 1-2 秒。总比没有好 意思是,40% 到 80% 的时间?不错!

以上是关于如何加速 tesseract OCR的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 tesseract 不要忽略单词之间的空格?

如何通过Tesseract开源OCR引擎创建Android OCR应用

如何在任何位置使用 tesseract ocr 和 php

如何一次运行多种语言的 tesseract?

如何在 Windows 上训练 Tesseract

如何提高tesseract的OCR结果