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

