我们有一个在谷歌云平台上运行的管道:
大多数时候,一切正常,提取的文本是正确的,除了一些作物。
一个例子是格式中的多行裁剪,经常输出错误,例如:
35LURC194- -> output as SSLUBe404-
6 6
(这是一个稍微修改过的问题实例,但你明白了要点)
现在,事情变得奇怪了。
作为我们调试过程的一部分,我们在本地运行相同的代码,并且对于 OCR 文本在生产(云)上出现错误的每个实例,它在本地机器上都能准确运行!
本地环境和云环境的区别是:
本地 | 云 | |
---|---|---|
操作系统 | Arch Linux | Debian Slim Buster Docker 镜像 |
Python版本 | 3.10.10 | 3.8.6 |
内存 | 8GB | 3GB |
环境 | 本地人 | Docker 容器(云运行) |
到目前为止我们尝试过的事情:
我们对可能导致这种情况的原因已经用尽了所有想法,这真的令人费解。在两种情况下,直到 tesseract 处理步骤之前的所有内容都是相同的,因此问题必须与 Tesseract 本身或环境有关,但是,除了操作系统本身之外,一切都是相同的。
很想听听关于我们还可以尝试什么的任何想法,或者其他人是否有类似的经历。
所以最后确实是版本问题,跟语言数据文件的版本有关
这个答案为我解决了这个问题,我基本上用
wget
下载了语言数据文件,将它们复制到Dockerfile中到/usr/share/tesseract-ocr/4.00/tessdata
(目录可以根据您的操作系统而有所不同)并且它就像一个魅力。
仍然奇怪的是,通常安装提供这种语言文件的软件包应该足够了(例如 Debian 上的
apt install tesseract-ocr-eng
)但在我的情况下,这些提供的版本没有给我正确的输出。
注意:帮助我找到解决方案的一个重要步骤实际上是在本地运行容器(通常它在 GCP 上的 Cloud Run 中运行),这允许更快的调试和实验。