我正在使用Tesseract对历史文档进行数字化,并将每张图片中的文本保存为单独的.txt文件,但在尝试使用for循环自动化该过程时遇到了性能问题。
当不使用for循环时,该过程大约需要2.5秒(代码中包含“冗余”元素只是为了模仿for循环):
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秒:
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张用于测试的图片:
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都是新手。
非常感谢
发布于 2021-04-01 03:00:31
您没有提到python和tesseract版本,我假设python 3和更高版本以及tesseract 4.1。以下是pytesseract的代码:
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,所以它应该更快:
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中的说明进行操作。
发布于 2021-03-31 16:57:39
我认为,问题在于:
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,它会自动处理它:
from tqdm import tqdm
import time
ll = ["any", "iterable", "you", "want"]
for el in tqdm(ll):
time.sleep(1)干杯!
https://stackoverflow.com/questions/66883751
复制相似问题