关于EasyOCR无法兼容Python multiprocessing,仅适配torch多进程的咨询
EasyOCR与Python标准multiprocessing不兼容,但torch.multiprocessing可正常运行的原因及解决办法
核心原因
EasyOCR的Reader实例本质是基于PyTorch构建的模型对象,依赖PyTorch的底层张量、模型参数等结构:
- Python标准
multiprocessing默认使用原生pickle序列化跨进程传递的对象,但pickle无法正确处理PyTorch模型的底层C指针、共享内存引用等复杂结构,导致模型实例在子进程中无法正常使用。 torch.multiprocessing是PyTorch针对自身场景扩展的多进程库,它优化了对象序列化机制(支持PyTorch专属的序列化方式),还能通过共享内存减少数据拷贝,因此可以正确传递Reader实例。
注意:你提供的「可运行代码」存在误区
你给出的torch多进程代码里,target=ocr_test(reader, img)是直接调用了函数,并把函数返回值(None)传给了target参数,实际并没有启用多进程执行。正确的写法应该是:
from torch.multiprocessing import Process import easyocr import cv2 def ocr_test(reader, img): result = reader.readtext(img, detail = 0) print(result) if __name__ == '__main__': reader = easyocr.Reader(['en'], gpu=False) img = cv2.imread('./datasets/easyocrtest/sampleocrimage.png') # 正确传递函数和参数 p = Process(target=ocr_test, args=(reader, img)) p.start() p.join()
修正后依然可以正常运行,这才是torch多进程适配PyTorch对象的正确用法。
解决办法
方案1:使用torch.multiprocessing(推荐)
直接用torch.multiprocessing替代标准库,它天然适配EasyOCR的PyTorch依赖,不需要额外修改代码结构,只要保证参数传递方式正确即可。
方案2:基于标准multiprocessing的兼容写法
如果必须使用Python标准multiprocessing,不要在主进程创建Reader实例,而是在子进程内部初始化模型,避免跨进程传递模型对象:
import multiprocessing as mp import easyocr import cv2 def ocr_test(img_path): # 子进程内单独初始化Reader reader = easyocr.Reader(['en'], gpu=False) img = cv2.imread(img_path) result = reader.readtext(img, detail=0) print(result) if __name__ == '__main__': img_path = './datasets/easyocrtest/sampleocrimage.png' p = mp.Process(target=ocr_test, args=(img_path,)) p.start() p.join()
这种方式虽然会增加每个子进程的模型加载开销,但完全规避了序列化问题,适合对多进程库有硬性要求的场景。
总结
EasyOCR没有强制要求必须使用torch多进程,但由于它基于PyTorch构建,torch.multiprocessing对其模型对象的支持更完善。如果要使用标准库,核心原则是不要跨进程传递Reader实例,而是在子进程内部初始化模型。
内容的提问来源于stack exchange,提问作者user4562262
相关产品推荐
相关产品推荐

