我正在使用 pytesseract 通过多处理方法进行一些 ocr。
该方法如下所示:
tess_api = PyTessBaseAPI()
Parallel(n_jobs=4)(delayed(execute)(image) for image in images)
具有以下功能:
def execute(image):
tess_api.SetImage(image)
text = tess_api.GetUTF8Text()
这将导致并发问题,因为 Worker 1 可能会在 Worker 2 执行 gettext() 之前覆盖图像
现在的想法是让每个工人拥有一个PyTessBaseAPI
. 主要的想法是做这样的事情:
tess_apis = [PyTessBaseAPI(), PyTessBaseAPI(), PyTessBaseAPI(), PyTessBaseAPI()]
然后交给tess_api[0]
工作人员 0 但我不知道如何在工作人员和实例之间建立连接。有什么建议,或者什么是更好的方法?因为我有成千上万的图像,所以我不想在 execute 函数中创建实例。
用于Pool(initializer=...)
在每个工作进程开始读取其作业队列之前初始化 Tesseract 对象一次。
tess_api = None
def initialize_worker():
global tess_api
tess_api = PyTessBaseAPI() # initialize a copy for this instance
def execute(image):
tess_api.SetImage(image)
text = tess_api.GetUTF8Text()
def main():
with multiprocessing.Pool(initializer=initialize_worker) as p:
for result in p.imap_unordered(images, chunksize=10):
# ...
这仅在您使用实际流程时才有效;如果您使用的是线程(这可能会起作用,考虑到 Tesseract 是 C 并且会释放 GIL),您可以使用contextvars
/ threading.local
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句