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

Streamlit Cloud部署EasyOCR时模型下载无限卡顿的解决办法咨询

Streamlit Cloud部署EasyOCR时模型下载无限卡顿的解决办法咨询

我太懂这种卡在模型下载环节的崩溃感了!之前帮好几个开发者排查过Streamlit Cloud上跑EasyOCR的类似问题,给你几个亲测有效的思路:

1. 别每次处理文件都重新初始化EasyOCR Reader

你现在的代码里,每次调用process_ocr_pdf都会新建一个easyocr.Reader实例,这意味着每处理一次文件就会触发一次模型下载/加载——Streamlit Cloud的会话环境本来就有资源限制,反复初始化很容易把模型下载流程卡崩。

最有效的解决办法是把Reader的初始化逻辑抽出来,用Streamlit的@st.cache_resource装饰器缓存起来,整个会话周期里只会加载一次模型:

# 把Reader初始化移到函数外,用缓存装饰器复用实例
@st.cache_resource
def get_easyocr_reader():
    return easyocr.Reader(['en'], gpu=False, verbose=False)

def process_ocr_pdf(pdf_file):
    """Main function to process PDF and extract text using OCR."""
    try:
        reader = get_easyocr_reader()  # 直接用缓存好的Reader实例
        # 重置文件指针到开头
        pdf_file.seek(0)
        
        # 提取图片
        images = extract_images_from_pdf(pdf_file)
        if not images:
            return None
            
        # 提取文本从每张图片
        texts = []
        for img in images:
            text = extract_text_from_image(reader, img)
            if text:
                texts.append(text)
                
        return texts if texts else None
        
    except Exception as e:
        print(f"Failed to process the file: {e}")
        return None

2. 显式指定CPU模式并关闭冗余日志

有时候EasyOCR会在GPU检测环节出隐性问题,哪怕日志显示用CPU,也可能卡在模型初始化。创建Reader的时候可以显式加gpu=False,再加上verbose=False减少日志输出(过多的日志也会拖慢Streamlit会话的响应速度):

reader = easyocr.Reader(['en'], gpu=False, verbose=False)

3. 检查PDF图片的大小问题

如果你的PDF里是高清大图,extract_images_from_pdf生成的图片尺寸会很大,EasyOCR处理超大图片的时间会极长,看起来像“无限卡顿”。可以在处理前给图片做压缩:

from PIL import Image
import numpy as np

# 新增图片压缩函数
def resize_image(img, max_width=1000):
    # 假设img是PIL Image对象
    width_percent = (max_width / float(img.size[0]))
    new_height = int((float(img.size[1]) * float(width_percent)))
    img = img.resize((max_width, new_height), Image.Resampling.LANCZOS)
    return np.array(img)

# 在处理图片的循环里调用压缩
for img in images:
    resized_img = resize_image(img)
    text = extract_text_from_image(reader, resized_img)
    if text:
        texts.append(text)

4. 规避Streamlit Cloud的会话资源限制

如果你的PDF页数太多,Streamlit Cloud免费版的会话内存/CPU可能扛不住,也会出现“假卡顿”。可以在代码里加个进度提示(比如st.progress),让你能看到当前处理到哪张图片,避免误以为是无限卡顿;也可以限制单次处理的图片数量,比如只处理前10张,先验证流程是否能跑通。

建议你先试第一个缓存Reader的方案,这是解决这类问题最常用的办法,如果还是不行,再依次排查后面的点。

备注:内容来源于stack exchange,提问作者IGRISGOD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:49:52