简介:这是一份面向Python开发者与办公自动化需求者的图片文字提取工具包,基于easyOCR库实现离线OCR识别,可在64位Windows系统上批量抓取图片中的文本,适用于文档数字化、发票处理、表单录入等场景。压缩包共4862个文件,约808.61MB,以py源码、pyc字节码、pyd扩展模块和h头文件为主,同时包含dll动态库、ttf字体、png图标及大量txt说明与msg日志文件,完整保留了easyOCR运行所需的依赖环境与语言模型资源。目前已有1307人学习下载。工具支持中英文等多语言识别,提供批量处理、参数自定义、多线程加速与异常捕获等能力,读者可直接运行现成脚本,也可基于源码进行二次开发,快速搭建属于自己的图片文字提取流程。
1. 从一张截图说起:为什么我最后还是选了 easyOCR 来搭文字提取环境
上周帮同事处理一批扫描件,对方甩过来一个压缩包,文件名就叫「图片文字提取工具.zip」。我第一反应是找在线接口,结果内网环境根本连不出去,只能老老实实在本机搭一套离线 OCR。试了三个方案,要么装完跑不起来,要么中文识别率惨不忍睹,最后回到 easyOCR 这条路上,才算把环境跑通。这篇笔记就记录我从零搭这套文字提取环境的完整过程,包括版本怎么选、依赖怎么装、模型怎么下、跑不通怎么救。如果你也卡在「图片文字提取工具怎么安装」「easyOCR 环境搭建」这类问题上,照着走一遍基本能复现。整套环境适合需要在本地批量处理图片文字、又不想依赖外部服务的开发者,新手跟着命令走也能跑通,熟手可以重点看版本差异和那几个容易翻车的参数。
2. 环境准备:Python 版本、依赖和模型文件的取舍
2.1 Python 版本别乱选,3.8 到 3.11 是安全区
easyOCR 对 Python 版本不算挑剔,但也不是随便哪个都能装。我一般会锁定 3.9 或 3.10,这两个版本在 PyTorch 和 OpenCV 的轮子兼容性上最稳。3.12 刚出那阵子我试过一次,torch 的预编译包还没跟上,pip 装到一半就开始编译源码,等了二十分钟直接报错退出。3.7 及以下就更别碰了,不少依赖已经停止维护。
先确认本机 Python 版本:
python --version # 期望输出 Python 3.9.x 或 3.10.x如果版本不对,常见做法是用 conda 单独开一个环境,别去动系统自带的 Python:
conda create -n ocr_env python=3.10 -y conda activate ocr_env这里-n ocr_env是环境名,随便起,但建议带 ocr 字样方便识别;python=3.10明确指定小版本,避免 conda 给你解析到 3.12。激活之后所有安装动作都在这个环境里做,装坏了直接conda env remove -n ocr_env删掉重来,不影响主机。
2.2 核心依赖三件套:torch、opencv、easyocr
easyOCR 本身是个上层封装,真正干活的是 PyTorch 做推理、OpenCV 做图像预处理。安装顺序有讲究,先装 torch 再装 easyocr,否则 pip 可能给你拉一个 CPU 版本的 torch 凑合,后面跑起来慢得你想砸键盘。
CPU 版本这样装:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install opencv-python-headless pip install easyocr--index-url指向 PyTorch 官方轮子仓库,能避开从源码编译。opencv-python-headless是不带 GUI 的版本,服务器上跑不需要弹窗,体积也小一圈。如果你本机有 NVIDIA 显卡并且装了对应驱动,可以把第一行换成 CUDA 版本,具体命令去 PyTorch 官网查对应 CUDA 版本的索引地址,别照抄别人的,显卡驱动版本对不上照样报错。
装完验证一下:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())" python -c "import easyocr; print(easyocr.__version__)"第一行会输出 torch 版本和 CUDA 是否可用。如果是False但你确实有显卡,多半是装成了 CPU 版,回退重装。第二行能打印出版本号就说明 easyocr 导入没问题。
2.3 模型文件:第一次运行会自动下载,但你可以提前备好
easyOCR 默认在第一次调用Reader时下载检测和识别模型,中文模型大概几十兆到一百多兆。内网或者网络不稳的环境,这一步经常卡住甚至超时。我一般会提前把模型目录配好,让它下到指定位置,方便后续迁移和复用。
import easyocr # model_storage_directory 指定模型存放目录 # download_enabled=True 表示允许自动下载 reader = easyocr.Reader( ['ch_sim', 'en'], model_storage_directory='./ocr_models', download_enabled=True, gpu=False )['ch_sim', 'en']是语言列表,ch_sim 是简体中文,en 是英文,两个一起传能处理中英混排。model_storage_directory建议设成项目下的固定目录,这样换机器时整个目录拷过去就能离线用。gpu=False强制走 CPU,如果你确认 CUDA 可用就改成 True。第一次运行会看到下载进度条,下完之后目录里会出现.pth模型文件,之后就不再重复下载了。
提示:模型下载失败时先看报错里的 URL,如果是连接超时,多半是网络问题;如果是 403 或 404,检查 easyocr 版本和模型仓库是否匹配,版本太老可能指向已失效的地址。
3. 安装落地:从 pip 到跑通第一张图
3.1 用 requirements.txt 固定版本,别让 pip 自由发挥
直接pip install easyocr会拉最新版,今天装和下周装可能拿到不同版本,依赖冲突就是这么来的。我习惯先冻结一份依赖清单:
pip freeze > requirements.txt然后在干净环境里按清单装:
pip install -r requirements.txt如果是从零开始,可以先装一次,确认能跑通之后立刻 freeze,把这份清单作为基线。团队协作时把 requirements.txt 提交到仓库,别人复现你的环境就少踩很多坑。注意 torch 的版本号里带+cpu或+cu118这种后缀,freeze 出来的清单换机器可能装不上,这种情况我一般手动把 torch 那几行改成不带后缀的通用版本,或者单独写一个安装脚本处理。
3.2 写一个最小可运行脚本,先验证再批量
环境装完别急着上批量任务,先用一张图跑通全流程。准备一张带文字的图片,比如截图或者扫描件,存成test.png:
import easyocr # 初始化 Reader,指定中英文 reader = easyocr.Reader(['ch_sim', 'en'], gpu=False) # readtext 返回列表,每项是 (bbox, text, confidence) results = reader.readtext('test.png') for bbox, text, conf in results: # conf 是置信度,低于 0.5 的基本可以忽略 if conf > 0.5: print(f'{conf:.2f} {text}')readtext的返回值里,bbox是文本框四个角的坐标,text是识别出的文字,conf是置信度。实际用的时候我一般会过滤掉置信度低于 0.5 的结果,那些多半是噪点或者误检。如果这张图能正常输出文字,说明环境没问题,可以进入批量处理阶段。
3.3 批量处理时的参数调优:batch_size 和 workers
单张跑通之后,批量处理才是真正的战场。easyOCR 的readtext支持传batch_size和workers,但这两个参数不是越大越好。我试过在一台 8 核机器上把 workers 开到 8,结果内存直接飙满,进程被系统杀掉。
import easyocr import os reader = easyocr.Reader(['ch_sim', 'en'], gpu=False) image_dir = './images' for fname in os.listdir(image_dir): if not fname.lower().endswith(('.png', '.jpg', '.jpeg')): continue fpath = os.path.join(image_dir, fname) # batch_size 控制单次送入模型的图片数量 # workers 控制并行读取的线程数,CPU 环境建议 0 或 1 results = reader.readtext(fpath, batch_size=1, workers=0) texts = [t for _, t, c in results if c > 0.5] print(fname, '->', ' '.join(texts))batch_size=1是最稳的,显存或内存不够时优先降这个。workers=0表示不用多线程,CPU 环境下多线程反而可能因为 GIL 和内存拷贝拖慢速度。如果确实要提速,先把 batch_size 调到 4 或 8 试试,观察内存占用,别一上来就拉满。
注意:批量处理大量图片时,Reader 对象只初始化一次,放在循环外面。每次循环都 new 一个 Reader 会反复加载模型,慢到怀疑人生。
4. 避坑与排查:那些让我重装三次的问题
4.1 现象:ImportError: libGL.so.1 找不到
原因:opencv-python 依赖系统里的 libGL 库,但很多精简版 Linux 镜像不带这个库。解决:要么装opencv-python-headless替代,要么补上系统库:
# Debian/Ubuntu 系 apt-get update && apt-get install -y libgl1 libglib2.0-0我现在的习惯是直接装 headless 版本,省得跟系统库纠缠。服务器上不需要显示图片,headless 完全够用。
4.2 现象:识别结果全是乱码或者空列表
原因:图片路径含中文、图片本身分辨率太低、或者语言参数没传对。解决:先把图片转成英文路径,确认分辨率不低于 300px 宽,然后检查Reader(['ch_sim', 'en'])里的语言代码。简体中文是ch_sim,不是zh也不是chinese,写错了不会报错,但识别结果会莫名其妙。
4.3 现象:第一次运行卡在下载模型,进度条不动
原因:模型仓库连接不稳定,或者model_storage_directory指向了一个没有写权限的目录。解决:换一个有写权限的目录,手动下载模型文件放进去,然后把download_enabled设为 False。手动下载的地址在 easyocr 的源码里能找到,搜model_url就能看到。
4.4 现象:CUDA out of memory
原因:gpu=True但显存不够,或者 batch_size 太大。解决:先降 batch_size 到 1,还不行就切回 CPU。我一般会在代码里加个判断,显存小于 4G 就直接走 CPU,别硬撑。
import torch use_gpu = torch.cuda.is_available() and torch.cuda.get_device_properties(0).total_memory > 4 * 1024**3 reader = easyocr.Reader(['ch_sim', 'en'], gpu=use_gpu)4.5 现象:pip 装 easyocr 时卡在 Building wheel for opencv
原因:pip 找不到预编译轮子,开始从源码编译,而编译又缺 cmake 等工具。解决:升级 pip 到最新版,或者指定 opencv 的版本号装预编译包:
pip install --upgrade pip pip install opencv-python-headless==4.8.1.78版本号可以换成当前可用的,关键是让它走 wheel 而不是源码。
5. 装完怎么验证:三个层次确认环境真的可用
5.1 第一层:导入和版本检查
最基础的验证是确认所有包能正常导入,版本符合预期:
python -c " import easyocr, torch, cv2 print('easyocr:', easyocr.__version__) print('torch:', torch.__version__) print('opencv:', cv2.__version__) print('cuda:', torch.cuda.is_available()) "四行输出都正常,说明依赖链没有断裂。如果某一行报 ImportError,回到第 2 章检查对应包的安装步骤。
5.2 第二层:单图识别,看文字和置信度
准备一张内容已知的图片,跑一遍识别,人工核对结果:
import easyocr reader = easyocr.Reader(['ch_sim', 'en'], gpu=False) results = reader.readtext('test.png', detail=1) for bbox, text, conf in results: print(f'置信度 {conf:.2f} | 文字: {text}')detail=1是默认值,返回完整信息;如果只想要文字列表,可以传detail=0。核对时重点看两点:文字内容对不对,置信度是否普遍高于 0.7。如果置信度普遍偏低,检查图片质量和语言参数。
5.3 第三层:批量跑十张图,观察内存和耗时
单图通过不代表批量没问题。我会挑十张不同类型的图,跑一个循环,同时用time和psutil观察资源占用:
import easyocr import time import psutil import os reader = easyocr.Reader(['ch_sim', 'en'], gpu=False) image_dir = './images' files = [f for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg'))][:10] start = time.time() for fname in files: reader.readtext(os.path.join(image_dir, fname), batch_size=1, workers=0) mem = psutil.Process().memory_info().rss / 1024**2 print(f'{fname} 完成,当前内存 {mem:.0f} MB') print(f'总耗时 {time.time() - start:.1f} 秒')十张图跑完,内存没有持续增长(说明没有泄漏),总耗时在可接受范围内,这套环境就算真正落地了。如果内存一直涨,检查是不是在循环里重复创建了 Reader 对象。
5.4 一个我踩过的验证坑
有次我在一台机器上验证通过,换到另一台机器上跑同样的脚本,结果识别出来的文字全是方框。查了半天发现是字体问题——那台机器缺少中文字体,OpenCV 在绘制调试框时显示异常,但实际识别结果是对的。从那以后我每次验证都会把识别结果直接打印到终端,而不是依赖可视化输出。终端里能看到正确的中文,才算真的通过。
提示:验证时把
gpu参数显式写出来,别依赖默认值。不同版本的 easyocr 默认值可能不一样,显式指定能避免换环境后行为不一致。
这套环境从 Python 版本锁定到模型目录配置,再到批量处理的参数取舍,每一步我都尽量把踩过的坑标出来了。图片文字提取这件事,装一次跑通不难,难的是换台机器、换个版本还能稳定复现。把 requirements.txt 和模型目录一起管好,下次迁移就是拷贝两个文件夹的事。希望帮到你。
本文还有配套的精品资源,点击获取