简介:图片文字提取工具.zip 面向需要在 64 位 Windows 上离线批量提取图片文字的开发者与办公人员,基于 Python 与 easyOCR 构建,用于解决无网络环境下大量图像转文本的效率问题,具备基础 Python 环境即可上手。压缩包共 4862 个文件、约 808.61MB:793 个 py 脚本与 1543 个 h 头文件构成识别逻辑和底层依赖,782 个 pyc、192 个 pyd、97 个 dll 及 78 个 enc 文件承载运行库与模型资源,另有 109 个 txt 说明、48 张 png、11 个 gif 等示例与辅助素材,目录保留了完整的依赖结构。已有 1308 人学习下载。读者可据此获得开箱即用的离线 OCR 环境、批量识别脚本与中英日韩德法等多语言配置,结合自定义参数、多线程加速和异常处理思路,可直接用于文档数字化、发票与表单信息抽取等场景,也便于在现有代码上做二次开发。
1. 图片文字提取工具.zip 解压前先看:Python 3.10 + easyOCR 这套组合最容易翻车在哪
图片文字提取工具.zip 到手后,先别急着双击解压找 exe。这套文字提取 easyOCR 工具本质是 Python 脚本加模型依赖,不是拷过去就能跑的绿色单文件。装错 Python 版本、把 CPU 版和 CUDA 版 PyTorch 叠在一起、模型目录又散落在用户缓存里,最常见的结果就是 import 阶段翻车,或者第一次识别卡在模型下载。它适合需要批量提取截图、扫描件、单据文字的开发者,也适合想先把本地 OCR 跑通再谈准确率的人。环境先列清,比事后救火省时间。
2. 环境清单与版本选择:Python 3.10、PyTorch 2.x 与 easyOCR 1.x 怎么搭
装 easyOCR 不是一条pip install easyocr就结束。它至少涉及四层:Python 解释器、PyTorch 运行库、OpenCV/NumPy 这类图像依赖,以及检测模型和识别模型文件。版本选择上我一般不会追最新:Python 用 3.10 系列,PyTorch 走 2.x,easyOCR 走 1.x 稳定线,NumPy 尽量控制在 1.26 系列。新版本不是不能用,而是新轮子、ABI、OpenCV GUI 版和 headless 版冲突叠在一起时,排查成本会明显变高。先把一条能跑的 CPU 线跑通,再决定要不要开 GPU,这是血泪经验。
2.1 先确认系统、Python 与显卡三件事
安装前先确认解释器到底是哪一个。很多人机器上同时有系统 Python、conda 环境、IDE 自带解释器,PATH 里pip和python指向的不是同一个位置,装完看着成功,运行却找不到包。先开一个终端,把下面几条命令走一遍。
# 查看当前 Python 版本,建议 3.10 系列 python --version # 确认 pip 属于当前解释器,不要只看裸 pip python -m pip -V # 查看解释器绝对路径,Windows 可用 where python python -c "import sys; print(sys.executable)"python --version只说明版本,不说明来源;python -m pip -V能看出 pip 绑定到哪个 Python,后面安装依赖统一用python -m pip,比裸pip稳。sys.executable打印的是当前解释器绝对路径,虚拟环境激活后它应该指向项目目录下的.venv。如果这里已经指向系统目录,说明虚拟环境没生效,先别继续装包。
显卡这件事要单独确认。没有独立显卡不影响 easyOCR 跑 CPU,只是批量速度慢;有显卡也不代表一定要开 GPU,驱动、CUDA 版本、PyTorch 轮子三者不匹配时,强行开 GPU 只会多一个报错源。常见做法是先用 CPU 版把模型和脚本跑通,再换 GPU 版 PyTorch 验证torch.cuda.is_available()。不要在同一虚拟环境里先装 CPU 版又叠 CUDA 版,这种混装最容易出现 import 报错。
2.2 版本搭配表:CPU 与 GPU 两条线
下面这张表是我装这类文字提取环境时常用的选择区间,不是让每个小版本都锁死,而是把大方向定住,避免装到一半发现依赖互相打架。
| 组件 | 推荐范围 | 选择理由 | 不建议的做法 |
|---|---|---|---|
| Python | 3.10 系列 | easyOCR 依赖链在这个区间比较稳 | 直接用 3.12 以上新环境硬上 |
| PyTorch | 2.x | 与 easyOCR 1.x 搭配常见 | CPU 版和 CUDA 版反复叠装 |
| easyOCR | 1.x 稳定线 | 语言模型和接口相对固定 | 混用很老的 0.x 示例 |
| OpenCV | headless 4.x | 避免 GUI 库和服务器环境冲突 | 同时装 opencv-python 和 headless |
| NumPy | 1.26 系列 | ABI 兼容问题少 | 出现报错还继续升 2.x |
| 模型目录 | 项目内./models | 可迁移、可离线复制 | 只留在用户缓存里 |
CPU 线适合办公机、虚拟机、没有显卡驱动的环境。安装时只选 CPU 轮子源,装完torch.cuda.is_available()返回False是正常的,不要因此反复重装。GPU 线适合批量图片多、单张图分辨率高的场景,但要先确认驱动支持哪一档 CUDA,再选对应 PyTorch 轮子。两条线不要混在同一个.venv里试,试错成本比新建一个环境高。
2.3 目录规划:虚拟环境、模型缓存和项目目录分开
我习惯把虚拟环境、代码、模型、样本、输出分开摆。这样压缩包解压后不会把模型和缓存混进代码目录,迁移到离线机器时也只需要复制models和项目脚本。目录不用复杂,但边界要清楚。
# 在项目根目录下创建基础目录 mkdir -p image-ocr/app image-ocr/models image-ocr/samples image-ocr/output cd image-ocr # 创建虚拟环境,目录名固定为 .venv,方便识别 python -m venv .venvmkdir -p在 Linux/macOS 下可直接用,Windows PowerShell 可以分别建目录。.venv放在项目根目录,激活后所有依赖都装在里面,出问题直接删掉重建,不会污染系统 Python。models用来放 easyOCR 的检测和识别模型,samples放测试图,output放 JSON 或 CSV 结果。模型目录不要放在只读路径,也不要放在需要管理员权限的目录,否则首次下载模型会直接失败。
注意:虚拟环境目录不要放进同步盘或压缩包里反复复制,路径变化后里面的解释器链接容易失效,重新建一个比修更快。
3. 安装 easyOCR:虚拟环境、PyTorch 和依赖一次装齐
这一章按 CPU 先跑通的顺序走。先建干净虚拟环境,再装 PyTorch,再装 easyOCR 和图像依赖,最后把模型目录固定下来。顺序不要反:先装 easyOCR 再补 PyTorch,容易出现依赖解析把 torch 版本拉到你没预期的位置;先装 CUDA 版再试 CPU 版,又容易把轮子混在一起。
3.1 创建虚拟环境并固定 pip 源
虚拟环境是这套安装的后悔药。后面不管是 NumPy 冲突还是 PyTorch 混装,最省时间的处理方式都是删掉.venv重来,而不是在系统 Python 里逐个卸包。创建和激活命令如下。
# 创建虚拟环境,项目根目录执行 python -m venv .venv # Windows PowerShell 激活 .venv\Scripts\Activate.ps1 # Linux/macOS 激活 source .venv/bin/activate # 激活后升级基础打包工具,统一用 python -m pip python -m pip install --upgrade pip setuptools wheel激活后终端提示符前一般会出现环境名,python -m pip -V里的路径应该包含项目下的.venv。setuptools和wheel先升级,是为了后面装带二进制轮子的包时少遇到构建失败。镜像源可以用,但不要把临时源写进全局配置后忘记;同一项目里混用多个源,可能出现同一包不同版本。装完基础工具后先不要急着装一堆依赖,下一步先定 PyTorch。
3.2 安装 PyTorch:CPU 版和 CUDA 版别混装
CPU 线先装 CPU 轮子。下面命令只装 CPU 版,适合先验证流程。
# CPU 版 PyTorch 示例,虚拟环境内执行 python -m pip install torch --index-url https://download.pytorch.org/whl/cpu # 验证是否安装成功,CPU 环境下 cuda 为 False 属正常 python -c "import torch; print(torch.__version__, torch.cuda.is_available())"--index-url指向 CPU 轮子源,避免 pip 从默认源拉到带 CUDA 依赖的包。torch.__version__能打印版本,torch.cuda.is_available()在 CPU 环境返回False,这不是安装失败。如果机器有显卡并准备走 GPU 线,新建一个干净虚拟环境,按本机驱动支持的 CUDA 档位选对应轮子源,常见写法是把cu118、cu121这类标识替换成安装页给出的组合。不要在这个 CPU 环境里再执行一条 GPU 安装命令覆盖,混装后报错往往不是一句“重装 torch”能定位的。
如果已经混装,处理方式要果断:退出环境,删除.venv,重新创建,重新装一条线。可以先把项目代码和模型目录留在外面,只删虚拟环境。这样比在环境里pip uninstall一圈更干净。
3.3 安装 easyOCR 与依赖,锁住 OpenCV/NumPy
PyTorch 验证通过后再装 easyOCR。easyOCR 会带 OpenCV、NumPy、Pillow、scikit-image 等依赖,其中 OpenCV 的 GUI 版和 headless 版最容易冲突。项目里如果没有弹窗显示需求,统一用 headless 版。
# 安装 easyOCR,依赖由 pip 解析 python -m pip install easyocr # 如果之前装过 GUI 版 OpenCV,先卸掉,避免和 headless 版并存 python -m pip uninstall -y opencv-python opencv-contrib-python # 补装 headless 版,服务器和脚本环境更稳 python -m pip install opencv-python-headless # 检查依赖是否冲突 python -m pip checkpip check会列出版本不满足的依赖,装完先看这一条,比运行时报错再回头查省事。OpenCV 只保留 headless 版,脚本里用cv2读图不受影响,但不会拉起 GUI 依赖。NumPy 如果出现 ABI 不兼容、numpy.dtype size changed一类报错,常见做法是回退到 1.26 系列再试:python -m pip install "numpy<2"。不要在报错后继续升 NumPy 2.x,先把环境稳定住。
3.4 模型下载与模型目录配置
easyOCR 第一次创建 Reader 时会下载检测模型和识别模型。默认目录在用户缓存里,换机器或离线部署时不好找。我一般把model_storage_directory指到项目内./models,让模型变成可复制资产。
import easyocr # 首次运行允许下载模型,目录固定到项目内 reader = easyocr.Reader( ['ch_sim', 'en'], # 简体中文 + 英文 gpu=False, # 先用 CPU 排除显卡问题 model_storage_directory='./models',# 模型统一存放,便于离线迁移 download_enabled=True, # 离线机器改成 False verbose=True # 打印模型加载信息,排错有用 ) # 用一张小图验证模型是否能正常加载 result = reader.readtext('./samples/test.png', detail=1) print(result)model_storage_directory建议写项目内相对路径或绝对路径,不要带临时目录。download_enabled=True只用于首次联网准备模型;离线机器要先在联网环境把models目录准备好,再改成False,否则 Reader 初始化会直接报缺模型。verbose=True会告诉你加载了哪些模型,卡住时能看出是检测模型还是识别模型没到位。常见模型文件包括检测模型和中文、英文识别模型,具体文件名以当前安装版本下载结果为准,不要手动改名。
注意:模型目录准备好后先备份一份,后面换虚拟环境、升级依赖都不需要重新下载模型,离线机器也能直接复制过去。
4. 配置 easyOCR 参数:语言列表、GPU 开关与模型目录
easyOCR 的参数不算多,但几个关键项一写错,结果就会从“能识别”变成“识别出来但不对”。语言列表决定加载哪些识别模型,gpu决定跑 CPU 还是显卡,model_storage_directory决定模型从哪里读,detail和paragraph决定返回结构。先把这些主参数固定,再谈预处理和批量。
4.1 Reader 初始化参数逐个拆
Reader 初始化是整套配置的入口。下面这份写法适合先跑通,后面再按机器调整。
import easyocr reader = easyocr.Reader( lang_list=['ch_sim', 'en'], # 语言列表,简体中文用 ch_sim gpu=False, # False 走 CPU;GPU 可写 True 或 'cuda:0' model_storage_directory='./models',# 模型目录,离线部署时保持可读 user_network_directory='./models', # 自定义网络目录,没有就与模型目录一致 download_enabled=False, # 模型已准备好后关闭下载 detector=True, # 启用文本检测 recognizer=True, # 启用文字识别 quantize=True, # CPU 推理量化,通常更快 verbose=True # 输出加载日志 )lang_list里简体中文写ch_sim,不是ch,也不是zh;英文写en。gpu可以写布尔值,也可以写'cuda:0'指定设备,多卡环境才需要。model_storage_directory和user_network_directory分开是为了以后接自定义模型,没有自定义模型时指到同一目录也可以。download_enabled=False要求模型已经存在,第一次联网准备模型时可以临时设True。quantize=True在 CPU 上常见,如果发现个别图片置信度下降,可以关掉对比。
detector和recognizer默认都开。只做检测或只做识别是特殊场景,普通文字提取不用关。verbose=True在排错阶段很有用,正式批量时可以关掉减少日志。
4.2 中文+英文混合图片的 lang_list 与识别策略
中英混排图片最常见的问题是只加英文,结果中文全丢;或者加了中文但图片太小,检测框都没框住。语言列表先写['ch_sim', 'en'],顺序上把主要语言放前面。readtext的detail=1会返回坐标、文本和置信度,适合落盘;paragraph=False保留单行结果,单据、表格、截图更稳;整段文章可以试paragraph=True,但别指望一个参数解决所有版面。
图片预处理比堆参数更有效。手机拍照的图先修正方向,再灰度、放大、增强对比度。下面这段是常见预处理写法。
from PIL import Image, ImageOps, ImageEnhance # 打开样本图,修正 EXIF 方向,避免手机拍照图横着识别 img = Image.open('./samples/invoice.png') img = ImageOps.exif_transpose(img) # 灰度化并放大两倍,小字图片识别率通常会有提升 img = img.convert('L') img = img.resize((img.width * 2, img.height * 2), Image.LANCZOS) # 适度增强对比度,参数不要拉太满,否则细笔画会断 img = ImageEnhance.Contrast(img).enhance(1.8) img.save('./samples/invoice_pre.png')ImageOps.exif_transpose处理拍照方向,convert('L')去颜色干扰,resize放大二倍对小字有帮助,Contrast增强对比度但不要过度。预处理后的图再交给readtext,比直接改识别阈值更可控。如果图片本身是竖排,可以加rotation_info=[90, 180, 270]让检测器尝试旋转,但速度会变慢,先确认是否真的需要。
4.3 批量图片提取脚本与结果落盘
单张跑通后,批量脚本要处理后缀过滤、结果结构和编码。下面脚本只扫常见图片后缀,结果按文件名输出 JSON,保留文本、置信度和坐标。
from pathlib import Path import json import easyocr # 初始化 Reader,模型目录与前面保持一致 reader = easyocr.Reader( ['ch_sim', 'en'], gpu=False, model_storage_directory='./models', download_enabled=False ) input_dir = Path('./samples') output_dir = Path('./output') output_dir.mkdir(parents=True, exist_ok=True) # 只处理常见图片后缀,避免把 JSON、日志也扫进来 suffixes = {'.jpg', '.jpeg', '.png', '.bmp', '.webp'} for img_path in sorted(input_dir.iterdir()): if img_path.suffix.lower() not in suffixes: continue # detail=1 返回坐标、文本、置信度;paragraph=False 保留单行 result = reader.readtext(str(img_path), detail=1, paragraph=False) lines = [] for box, text, conf in result: lines.append({ 'text': text, 'confidence': round(float(conf), 4), 'box': box }) out_file = output_dir / f'{img_path.stem}.json' out_file.write_text( json.dumps(lines, ensure_ascii=False, indent=2), encoding='utf-8' ) print(img_path.name, len(lines), '条')sorted(input_dir.iterdir())让输出顺序稳定;后缀集合过滤掉非图片文件;readtext里detail=1保留坐标和置信度,后面要筛低置信度结果时用得上;paragraph=False避免把不同行强行合并。ensure_ascii=False保证中文不转义,encoding='utf-8'避免 Windows 默认编码问题。批量时如果显存或内存吃紧,把batch_size设小,不要一上来开多进程。
5. 常见问题排查:easyOCR 装完跑不起来的 5 个坑
这类环境问题最玄学的地方是:报错信息看起来像 easyOCR 坏了,实际根因在 Python 解释器、PyTorch 轮子、模型目录或图片方向。下面五条按“现象 → 原因 → 解决”记,都是装完跑不起来时高频遇到的。
5.1 import torch 报 DLL/OSError:先查混装再查运行库
现象:import torch直接报OSError: [WinError 126]或 DLL load failed,easyOCR 还没开始加载就退出。原因通常是 CPU 版和 CUDA 版 PyTorch 混装,或者 Python 位数、运行库不匹配。解决:先退出环境,删除.venv,重建后只装 CPU 版验证;确认 Python 是 64 位;系统缺少运行时库时补装对应运行库。不要在原环境里反复pip install --force-reinstall,混装残留清不干净。
# 重建虚拟环境,先只装 CPU 版 PyTorch 验证 import python -m venv .venv .venv\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install torch --index-url https://download.pytorch.org/whl/cpu python -c "import torch; print(torch.__version__)"--index-url只指向 CPU 轮子源,python -c只验证 import 和版本。通过后再装 easyOCR,能把问题范围缩到 PyTorch 这一层。
5.2 首次 Reader 卡在下载模型:把模型目录变成可迁移资产
现象:执行easyocr.Reader(...)后长时间停在下载,或者离线机器直接报模型缺失。原因是首次运行要拉检测模型和识别模型,网络拦截、目录不可写都会卡住。解决:把model_storage_directory固定到项目内./models,联网机器先下载好,再整体复制到离线机器;离线机器设download_enabled=False,用verbose=True看缺哪个模型。模型文件名不要改,目录权限要可读可写。
5.3 中文漏字、乱码、竖排识别差:lang_list 和预处理先改
现象:英文能识别,中文大片空白;或者中文出来是乱码、竖排文字顺序错。原因常见是lang_list没加ch_sim,图片分辨率太低,或者拍照方向不对。解决:语言列表改为['ch_sim', 'en'];先用ImageOps.exif_transpose修正方向;小图放大两倍再识别;竖排图片再试rotation_info=[90, 180, 270]。不要一上来调识别阈值,先把输入图弄正、弄大。
5.4 GPU 显存不足或识别突然变慢:回退 CPU 和 batch_size
现象:CUDA out of memory,或者开 GPU 后反而比 CPU 慢。原因可能是batch_size太大、同时开了多个识别进程、模型重复加载。解决:先用gpu=False跑同一张图确认流程;GPU 下把batch_size设为 1;批量脚本只初始化一个 Reader,不要每张图新建;显存小的机器关掉不必要的并行。CPU 量化quantize=True也可以作为回退方案。
5.5 路径、权限、图片方向:最不值得排查却最容易翻车
现象:FileNotFoundError、PermissionError,或者识别结果整体旋转。原因多是相对路径在 IDE 和终端里不一致、输出目录只读、手机图片带 EXIF 方向。解决:脚本里用Path拼绝对路径;项目和模型目录放在可写位置;读图后先ImageOps.exif_transpose。这类问题不玄学,但最容易在批量时集中爆发。
from pathlib import Path from PIL import Image, ImageOps # 用项目根目录拼绝对路径,避免 IDE 与终端工作目录不一致 root = Path(__file__).resolve().parent.parent img_path = root / 'samples' / 'test.png' img = Image.open(img_path) img = ImageOps.exif_transpose(img) # 修正拍照方向 img.save(root / 'samples' / 'test_fixed.png')Path(__file__).resolve().parent.parent把路径锚定到脚本位置,不依赖当前终端目录;exif_transpose在识别前修正方向。路径和方向先处理,后面的模型参数才有意义。
6. 装完怎么验证跑通:用一张测试图和三条命令确认环境
验证不要只看“没报错”。我一般分三层:先确认包能导入,再确认模型目录能读到,最后跑一张测试图看输出结构。三条命令走完,基本能判断是环境问题、模型问题还是图片问题。
# 1. 确认 easyOCR 和 PyTorch 都能导入,并打印 CUDA 状态 python -c "import easyocr, torch; print('easyocr=', easyocr.__version__); print('torch=', torch.__version__, 'cuda=', torch.cuda.is_available())" # 2. 确认模型目录里至少有检测和识别模型文件 python -c "from pathlib import Path; print([p.name for p in Path('./models').glob('*.pth')])" # 3. 用一张小图跑识别,观察返回列表是否非空 python -c "import easyocr; r=easyocr.Reader(['ch_sim','en'], gpu=False, model_storage_directory='./models', download_enabled=False); print(r.readtext('./samples/test.png', detail=1))"第一条要同时看到 easyocr 和 torch 版本,CPU 环境cuda=False正常。第二条如果打印空列表,说明模型没放对目录,先查model_storage_directory。第三条返回列表里每个元素应包含坐标、文本、置信度;空列表先换一张对比度高的小图,再查语言列表和图片方向。
| 验证项 | 命令或动作 | 通过标准 | 失败先查 |
|---|---|---|---|
| 包导入 | 第一条命令 | 无报错并打印两个版本 | 虚拟环境是否激活 |
| CUDA 状态 | 第一条命令 | CPU 环境为 False 也正常 | 是否混装 PyTorch |
| 模型文件 | 第二条命令 | 至少列出检测和识别模型 | 模型目录和下载开关 |
| 单图识别 | 第三条命令 | 返回非空文本列表 | 语言列表、图片方向 |
| 批量脚本 | 运行ocr_batch.py | output下生成 JSON | 后缀过滤、目录权限 |
从那以后我每次拿到这种图片文字提取工具.zip,都先建干净虚拟环境,先 CPU 跑通一张图,再开 GPU、再上批量;这个顺序能省掉很多回头救环境的时间。压缩包拿到后先按第 2 章把目录摆好,再走这一章的三条命令,跑通后再接批量脚本。希望帮到你。
本文还有配套的精品资源,点击获取