如何加速 Tesseract OCR

7

我正在尝试对大量文档进行OCR(每天超过30万份)。目前我正在使用Tesseract .NET包装器,质量很好,但速度不够快。平均20个任务并行扫描同一PDF文件的半页所需的时间为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);
        }

我通常会先将图片的分辨率减半并转换为灰度图像,然后使用OCR技术进行识别。但这个过程比较耗时,你有什么提高效率的方法吗?我的需求只是单行文本的识别结果,不需要对文本进行分段。也许我可以尝试使用Matlab for c#来加速处理过程。


你是否为每一页创建一个新引擎(调用 new TesseractEngine)? - GWigWam
@GWigWam 是的,目前它是这样工作的。我很确定它不支持并行使用。 - TestzWCh
1
你说得对,它不支持并行使用。然而创建它的成本很高。 - GWigWam
1
@GWigWam 好的,这让我开始思考并检查了一下没有创建引擎的处理时间,它比创建引擎的时间少了约0.3~0.4秒。在进行一些微调后可能会有所帮助,但仍然不够。无论如何还是谢谢。 - TestzWCh
1
这仍然是一个20%的改进,尽管我希望它能做得更多。 - GWigWam
1个回答

7
目前,您需要为扫描的每一页创建一个新的TesseractEngine对象。由于引擎需要读取“tessdata”文件,因此创建引擎的成本很高。
您提到您有20个并发任务正在运行。由于引擎不能同时处理多个页面,您需要为每个任务创建一个引擎,并重复使用该引擎处理该任务处理的所有页面。您可以简单地调用using (var page = Engine.Process(pix))来使用现有的引擎处理下一页。
重复使用引擎应该能显著提高性能,因为您只需要创建20个引擎而不是300k个。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接