首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环实现Tesseract的缓慢数字化

使用for循环实现Tesseract的缓慢数字化
EN

Stack Overflow用户
提问于 2021-03-31 15:50:37
回答 2查看 55关注 0票数 1

我正在使用Tesseract对历史文档进行数字化,并将每张图片中的文本保存为单独的.txt文件,但在尝试使用for循环自动化该过程时遇到了性能问题。

当不使用for循环时,该过程大约需要2.5秒(代码中包含“冗余”元素只是为了模仿for循环):

代码语言:javascript
复制
test=[]
for i in tqdm(range(1)):
  text = pytesseract.image_to_string(Image.open("C:/Users/user/Desktop/work/Pages/3_2\\0053.jpg"), lang='dan2')
  test.append((str(text)))
  with open("test.txt", mode = 'w') as f:
        f.write(str(text))

然而,当使用for循环时,每个图片大约需要10.5秒:

代码语言:javascript
复制
n = len(listOfPages)
PagesOfText = []

for i in tqdm(range(n)):
    for entry in listOfPages:   
        text = pytesseract.image_to_string(Image.open(entry), lang='dan2')
        PagesOfText.append((str(text)))
    

for x in range(0,n):
    with open("page"+str(x+1)+'.txt', mode = 'w') as f:
        f.write(str(PagesOfText[x]))

代码会产生很好的结果,并为每个图片保存一个“page{x}.txt”。

我能找到的唯一区别是使用了listOfPages,它是我希望数字化的目录中所有图片的列表。它有这样的输出,并且只包含4张用于测试的图片:

代码语言:javascript
复制
print(listOfPages)

'C:/Users/user/Desktop/work/Pages/3_2\0053.jpg','C:/Users/user/Desktop/work/Pages/3_2\0053.tif','C:/Users/user/Desktop/work/Pages/3_2\0055.jpg','C:/Users/user/Desktop/work/Pages/3_2\0055.tif‘

我不能理解的是,为什么从列表中提取的行为会让它变得如此缓慢。我希望我的问题没有问题,因为这是我的第一篇文章。对代码的任何建议也将不胜感激,因为我对Python和Tesseract都是新手。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2021-04-01 03:00:31

您没有提到python和tesseract版本,我假设python 3和更高版本以及tesseract 4.1。以下是pytesseract的代码:

代码语言:javascript
复制
import datetime
import glob

import pytesseract
from PIL import Image
from tqdm import tqdm

# Settings
lang = "eng"
best_data = r"f:\Project-Personal\tessdata_best\tessdata"
tessdata_dir_config = '--tessdata-dir "{}"'.format(best_data)
pytesseract.pytesseract.tesseract_cmd = r"F:\win64\bin\tesseract.exe"
listOfPages = sorted(glob.glob(r"f:\Project\tests\*.ppm"))

# OCR process
start = datetime.datetime.now()

with tqdm(total=len(listOfPages), position=0, leave=True) as pbar:
    for idx, entry in enumerate(listOfPages):
        pbar.set_description("Processing {}".format(entry))
        text = pytesseract.image_to_string(
            Image.open(entry), lang=lang, config=tessdata_dir_config
        )
        with open("page_t-{:03}.txt".format(idx), mode="w", encoding="utf8") as f:
            f.write(text)
        pbar.update(1)

end = datetime.datetime.now()
print("\nRuntime: {}".format(end - start))

你也可以尝试tesserocr,因为它直接使用tesseract API,所以它应该更快:

代码语言:javascript
复制
import datetime
import glob

from PIL import Image
from tesserocr import PyTessBaseAPI
from tqdm import tqdm

# Settings
lang = "eng"
best_data = r"f:\Project-Personal\tessdata_best\tessdata"
listOfPages = sorted(glob.glob(r"f:\Project\tests\*.ppm"))

# OCR process
start = datetime.datetime.now()

with tqdm(total=len(listOfPages), position=0, leave=True) as pbar:
    with PyTessBaseAPI(path=best_data, lang=lang) as api:
        for idx, entry in enumerate(listOfPages):
            pbar.set_description("Processing {}".format(entry))
            api.SetImage(Image.open(entry))
            text = api.GetUTF8Text()
            with open("page-{:03}.txt".format(idx), mode="w", encoding="utf8") as f:
                f.write(text)
            pbar.update(1)

end = datetime.datetime.now()
print("\nRuntime: {}".format(end - start))

如果您的python版本不支持tesserocr,您可以按照此bucket401 blog中的说明进行操作。

票数 1
EN

Stack Overflow用户

发布于 2021-03-31 16:57:39

我认为,问题在于:

代码语言:javascript
复制
for i in tqdm(range(n)):
    for entry in listOfPages:
        parse_page(entry)

您在页面上循环了两次:for i in tqdm(range(n))循环n次,for entry in listOfPages循环每i的每个值n次。两个循环中的一个就足够了。

编辑

如果你想显示进度条,你可以像这样包装tqdm中的任何iterable,它会自动处理它:

代码语言:javascript
复制
from tqdm import tqdm
import time

ll = ["any", "iterable", "you", "want"]

for el in tqdm(ll):
    time.sleep(1)

干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66883751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档