You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Pytesseract与EasyOCR的速度对比及优化疑问

PDF转文本OCR速度慢的原因分析与优化方案

针对你在M1 Pro上用pdf2image搭配pytesseract/EasyOCR遇到的速度问题,下面从原因到优化方案逐一说明:

一、核心原因拆解

1. pytesseract的性能瓶颈

  • 图片转换冗余:pdf2image默认生成200dpi的高分辨率图片,大幅增加Tesseract的处理负担
  • 串行单页处理:代码循环逐个处理页面,完全没利用M1 Pro的多核心优势
  • 默认配置未优化:Tesseract默认没开启多线程,也没启用快速识别模式

2. EasyOCR的性能瓶颈

  • 未利用M1 GPU:EasyOCR基于深度学习模型,默认用CPU推理,M1的GPU加速完全没发挥
  • 图片无预处理:直接传入原图,高分辨率图片会让模型计算量暴增
  • 单页串行推理:没有批量处理或并行优化,单页推理自然慢

3. M1 Pro适配问题

  • pytesseract:Homebrew安装的Tesseract虽为ARM原生,但默认未开启多线程
  • EasyOCR:PyTorch的Metal加速需手动配置,否则只能靠CPU跑深度学习模型

二、针对性优化方案

针对pytesseract的优化

  1. 降低图片转换开销
    调低pdf2image的dpi参数、改用JPG格式减少体积:

    pages = convert_from_path(pdf_path, dpi=150, fmt='jpeg')
    
  2. 启用Tesseract多线程
    通过配置参数开启多线程和快速识别模式:

    # 配置多线程(设为M1 Pro核心数,比如8)+ 快速识别模式
    custom_config = r'--oem 3 --psm 6 -c num_threads=8'
    f.write(pytesseract.image_to_string(pages[i], config=custom_config))
    
  3. 并行处理多页
    用concurrent.futures利用多核并行处理:

    from concurrent.futures import ThreadPoolExecutor
    
    def process_page(page):
        custom_config = r'--oem 3 --psm 6 -c num_threads=8'
        return pytesseract.image_to_string(page, config=custom_config)
    
    with ThreadPoolExecutor(max_workers=8) as executor:
        results = list(executor.map(process_page, pages))
    
    with open('pytesseract_optimized.txt', 'w') as f:
        f.write(''.join(results))
    

针对EasyOCR的优化

  1. 开启M1 GPU加速
    配置PyTorch使用Metal后端,让模型跑在GPU上:

    import torch
    # 自动检测MPS(Metal)设备
    device = 'mps' if torch.backends.mps.is_available() else 'cpu'
    reader = easyocr.Reader(['en'], device=device)
    
  2. 图片预处理减载
    缩小图片尺寸、转灰度,降低模型计算量:

    from PIL import Image
    
    def preprocess_image(page):
        # 转灰度减少通道数
        img = page.convert('L')
        # 长边缩到1000px,保持比例
        max_dim = 1000
        w, h = img.size
        if max(w, h) > max_dim:
            scale = max_dim / max(w, h)
            img = img.resize((int(w*scale), int(h*scale)), Image.Resampling.LANCZOS)
        return numpy.array(img)
    
    processed_img = preprocess_image(pages[i])
    result = reader.readtext(processed_img, detail=0)
    
  3. 批量推理优化
    用readtext_batched批量处理页面,比单页推理效率高很多:

    processed_pages = [preprocess_image(page) for page in pages]
    results = reader.readtext_batched(processed_pages, detail=0)
    

通用优化建议

  • 优先提取原生文本:如果PDF是可编辑的(非扫描件),直接用PyPDF2或pdfplumber提取文本,完全不需要OCR,速度快几十倍
  • 缓存中间结果:重复处理同一PDF时,把转好的图片缓存到本地,避免重复转换
  • 精简语言包:只加载需要的语言(比如仅'en'),不要冗余加载多语言包

三、优化后效果参考

  • pytesseract:每页耗时可降到0.5-1秒(取决于图片分辨率和核心数)
  • EasyOCR:启用Metal后每页耗时可降到5-8秒左右

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:10:22