简介:本资源面向需要做文字识别的开发者与人工智能方向学习者,提供 tesseract-ocr 安装包及配套中文语言包,可用于 Python 环境下的 OCR 文字提取、图像转文本等任务,帮助解决中文识别缺少训练数据、环境搭建繁琐的问题。压缩包共 722 个文件,整体约 33.78MB,以 C++ 源码(.cpp、.h)为主,辅以 Java、XML、HTML、Shell 脚本、CMake 构建文件及少量训练数据与图片样本,覆盖编译构建、语言模型训练与命令行工具等模块,目录结构完整,便于按需查阅与二次开发。目前已有 3944 人学习下载,适合入门与进阶用户参考。包内还包含 unicharset、shapeclustering、mftraining 等训练工具说明及中文 traineddata 语言数据,读者可据此完成中文识别环境配置、模型训练与识别效果调优,快速搭建可用的 OCR 流程。
1. 从一张发票识别翻车说起:tesseract-ocr 安装包和中文语言包到底该怎么配
很多人第一次接触 OCR,都是从一张发票、一份扫描合同或者一批快递单开始的。图片丢进去,期望文字整整齐齐出来,结果要么是乱码方块,要么是「口口口」,要么干脆报错说找不到语言文件。问题往往不在代码,而在最基础的一步:tesseract-ocr 安装包和中文语言包没配对。Tesseract 本身是引擎,安装包负责把引擎装进系统,中文语言包(通常叫 chi_sim、chi_sim_vert、chi_tra)负责让它认识汉字。两者版本、路径、环境变量任何一处对不上,识别结果就是玄学。这篇笔记面向需要在本机或服务器上跑中文 OCR 的开发者,从安装包选择、语言包放置、命令行验证,一路讲到 Python 调用和批量识别时的参数调优。不堆概念,每一步都能照着敲。
2. 安装包怎么选:Windows、Linux、macOS 三条路的最小可用方案
2.1 Windows 下用安装包还是便携包,先看你要不要改环境变量
Windows 用户拿到「tesseract-ocr 安装包和中文语言包.rar」这类压缩包时,第一反应通常是双击 exe。但这里有个分叉:官方社区维护的 Windows 构建版本分「安装版」和「便携版」。安装版会写注册表、加 PATH,适合长期在命令行里用;便携版解压即用,适合塞进绿色软件目录或者打包进 Python 项目。
我一般会这样判断:如果你只是想在 Python 脚本里通过pytesseract调用,便携版更干净,不会污染系统 PATH;如果你还要在 CMD 或 PowerShell 里直接敲tesseract命令做快速验证,安装版省事。安装时有一个关键勾选项,叫「Additional language data」,默认是不勾的。很多人装完发现只有英文,就是因为这里没选。但即便勾了,下载速度也看网络,所以更稳的做法是:先装纯引擎,再手动把中文语言包丢进tessdata目录。
安装完成后,打开 PowerShell 敲:
tesseract --version如果提示不是内部或外部命令,说明 PATH 没生效。要么重启终端,要么手动把安装目录加进系统环境变量。便携版则必须手动加,或者每次用绝对路径调用。
2.2 Linux 用包管理器装引擎,语言包单独补
Linux 下最省心的方式是包管理器。Debian/Ubuntu 系:
sudo apt update sudo apt install tesseract-ocr sudo apt install tesseract-ocr-chi-sim第二行就是中文简体语言包。注意包名里的chi-sim对应的是chi_sim.traineddata文件。有些发行版会把语言包拆成独立包,比如tesseract-ocr-chi-sim、tesseract-ocr-chi-tra。装完可以用:
tesseract --list-langs查看已安装语言。如果输出里没有chi_sim,说明语言包没装进去,或者TESSDATA_PREFIX指向了错误的目录。
CentOS/RHEL 系则用yum或dnf,包名可能是tesseract-langpack-chi_sim。这里有个血泪经验:不同发行版的包名拼写不一致,chi_sim和chi-sim混用很常见,装之前先search一下。
2.3 macOS 用 Homebrew,语言包路径要记牢
macOS 用户基本走 Homebrew:
brew install tesseract brew install tesseract-langtesseract-lang会一次性装很多语言,体积不小。如果你只要中文,可以只装主包,然后手动下载chi_sim.traineddata放到/opt/homebrew/share/tessdata/(Apple Silicon)或/usr/local/share/tessdata/(Intel)。路径可以用:
brew list tesseract看安装位置。语言包放错目录是 macOS 上最常见的翻车点,因为 Homebrew 的路径和 Linux 不一样,网上很多教程直接抄 Linux 路径,结果就是找不到语言。
2.4 语言包文件从哪来、放哪里、怎么验证
不管哪个平台,中文语言包的核心就是一个文件:chi_sim.traineddata。它来自 tesseract 的官方训练数据仓库,通常和引擎版本有对应关系。版本不匹配时,轻则识别率下降,重则直接报错「Error opening data file」。所以我的习惯是:引擎用哪个版本,语言包就尽量找同一时期的。
放置位置遵循一个原则:放在TESSDATA_PREFIX指向的目录下。这个环境变量如果没设,Tesseract 会去编译时的默认路径找。验证方法:
tesseract --list-langs输出里出现chi_sim才算成功。如果报错说Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory,那就手动设:
export TESSDATA_PREFIX=/your/path/to/tessdataWindows 下则在系统环境变量里新建TESSDATA_PREFIX,值指向包含chi_sim.traineddata的那个文件夹。注意是文件夹,不是文件本身。
3. 用命令行跑通第一张中文图:参数、输出格式和识别率观察
3.1 最小命令与输出格式选择
装好之后,先别急着写 Python。用命令行验证是最快排错的方式。准备一张包含中文的图片,比如截图或扫描件,命名为test.png。执行:
tesseract test.png stdout -l chi_sim这条命令的意思是:输入test.png,输出到标准输出,使用简体中文语言模型。如果终端能打印出汉字,说明安装和语言包都通了。如果打印出来是乱码,先检查终端编码,再检查图片本身是不是太模糊。
Tesseract 支持多种输出格式,通过输出文件名的后缀决定:
tesseract test.png result -l chi_sim pdf tesseract test.png result -l chi_sim tsv第一行生成可搜索的 PDF,第二行生成 TSV,包含每个词的坐标和置信度。TSV 在做版面分析时特别有用,因为你可以拿到文字的位置信息,而不只是纯文本。
3.2 页面分割模式(PSM)对中文识别的影响
Tesseract 有一个非常关键的参数:--psm,页面分割模式。默认是 3,表示全自动分割。但中文文档经常是单栏、多栏、表格混排,默认模式不一定最优。常用值:
| PSM 值 | 含义 | 适用场景 |
|---|---|---|
| 3 | 全自动 | 一般文档 |
| 4 | 假设单列可变大小文本 | 单栏文章 |
| 6 | 假设统一文本块 | 截图、单段文字 |
| 7 | 单行文本 | 标题、单行 |
| 11 | 稀疏文本 | 散落文字 |
| 12 | 稀疏文本带方向 | 复杂版面 |
我一般会先试 6,再试 3。对于发票这类结构化文档,6 往往比 3 稳。命令:
tesseract test.png stdout -l chi_sim --psm 6如果识别结果里文字顺序乱了,或者把两栏混在一起,就换 PSM 再试。这个参数没有万能值,只能按图调。
3.3 用 TSV 输出定位识别失败的区域
当识别结果不理想时,不要盯着纯文本猜。用 TSV 输出看每个词的置信度:
tesseract test.png result -l chi_sim tsv然后打开result.tsv,最后一列是conf,置信度。低于 60 的词基本可以认为识别不可靠。结合left、top、width、height四列,你能知道是图片哪个区域出了问题。常见原因是分辨率太低、对比度不足、或者文字被裁切。这时候回去处理图片,比反复调 Tesseract 参数更有效。
3.4 图片预处理:灰度、二值化、放大三件套
Tesseract 对图片质量很敏感。中文笔画密集,低分辨率下很容易糊成一团。我通常会在识别前做三步:
from PIL import Image, ImageOps, ImageFilter img = Image.open("test.png") img = img.convert("L") # 灰度 img = img.resize((img.width * 2, img.height * 2), Image.LANCZOS) # 放大两倍 img = img.point(lambda x: 0 if x < 140 else 255) # 简单二值化 img.save("test_clean.png")灰度去掉颜色干扰,放大让笔画更清晰,二值化把背景和文字分开。阈值 140 不是固定的,要看图片亮度分布。如果背景偏灰,阈值可以调高;如果文字偏细,阈值调低。这一步做完再跑 Tesseract,识别率通常会有肉眼可见的提升。
4. Python 调用与批量识别:pytesseract 的配置和并发注意点
4.1 pytesseract 安装与引擎路径指定
Python 里最常用的是pytesseract,但它本身不带引擎,只是调用系统里的 Tesseract。安装:
pip install pytesseract pillow如果 Tesseract 不在 PATH 里,需要手动指定:
import pytesseract from PIL import Image pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" text = pytesseract.image_to_string(Image.open("test.png"), lang="chi_sim") print(text)tesseract_cmd这一行在 Windows 便携版场景下几乎必写。Linux 和 macOS 如果 PATH 正常,可以省略。lang="chi_sim"对应语言包文件名去掉.traineddata后缀。
4.2 批量识别时的参数传递与超时控制
批量处理时,不要每张图都重新初始化。pytesseract每次调用都会启动一个子进程,开销不小。更稳的做法是控制并发数,并且给每张图设置超时:
import pytesseract from PIL import Image from concurrent.futures import ThreadPoolExecutor, as_completed def ocr_one(path): try: img = Image.open(path) return path, pytesseract.image_to_string( img, lang="chi_sim", config="--psm 6" ) except Exception as e: return path, f"ERROR: {e}" paths = ["a.png", "b.png", "c.png"] with ThreadPoolExecutor(max_workers=4) as pool: futures = [pool.submit(ocr_one, p) for p in paths] for f in as_completed(futures): print(f.result())max_workers不要设太大,Tesseract 是 CPU 密集型,线程太多反而互相抢资源。一般设成 CPU 核心数的一半到相等。config参数可以传 PSM 和其他选项,多个选项用空格隔开。
4.3 用 image_to_data 拿结构化结果
如果只拿纯文本不够,比如要做表格提取或版面分析,用image_to_data:
data = pytesseract.image_to_data( Image.open("test.png"), lang="chi_sim", output_type=pytesseract.Output.DICT ) for i, word in enumerate(data["text"]): if word.strip(): print(word, data["conf"][i], data["left"][i], data["top"][i])返回的是字典,包含文本、置信度、坐标。可以按block_num、par_num、line_num分组,还原段落结构。这一步是后续做关键词抽取或表格重建的基础。
5. 避坑与排查:中文识别最常见的五类翻车现场
5.1 报错「Error opening data file chi_sim.traineddata」
现象:命令行或 Python 调用时直接抛错,提示找不到chi_sim.traineddata。
原因:语言包没放对位置,或者TESSDATA_PREFIX没设。Windows 安装版有时会把语言包放在tessdata子目录,但环境变量指向了上级目录。
解决:用tesseract --list-langs确认当前引擎能看到的语言列表。如果列表里没有chi_sim,找到tessdata目录的绝对路径,设TESSDATA_PREFIX指向它。Windows 下注意路径不要带尾部反斜杠。
5.2 识别出来全是方块或问号
现象:文字位置对,但内容全是「口口口」或乱码。
原因:通常是语言包版本和引擎版本不匹配,或者图片编码有问题。少数情况是终端字体不支持中文显示,但输出到文件里是正常的。
解决:先输出到文件而不是终端,用文本编辑器打开看。如果文件里也是方块,换一个版本的chi_sim.traineddata。如果文件里正常,只是终端显示问题,不用管。
5.3 识别率极低,文字顺序混乱
现象:能识别出一些字,但错字多,顺序乱。
原因:PSM 模式不适合当前版面,或者图片分辨率太低。中文文档在 300 DPI 以下时,笔画粘连严重。
解决:先放大图片到两倍,再试--psm 6和--psm 4。如果文档是多栏,考虑先做版面切分,把每一栏单独识别。不要指望一个 PSM 值解决所有版面。
5.4 Python 调用报「tesseract is not installed or it's not in your PATH」
现象:pytesseract抛TesseractNotFoundError。
原因:Python 环境找不到 Tesseract 可执行文件。虚拟环境、conda 环境、IDE 内置终端的环境变量可能和系统终端不一致。
解决:在代码里显式设置pytesseract.pytesseract.tesseract_cmd为绝对路径。不要依赖 PATH,尤其是在 Windows 和虚拟环境组合下。
5.5 批量识别时内存暴涨或进程卡死
现象:处理几百张图后,内存占用越来越高,或者程序卡住不动。
原因:pytesseract每次调用启动子进程,如果图片没关闭,或者并发数太高,资源耗尽。
解决:用with Image.open(path) as img确保图片句柄释放。并发数控制在 CPU 核心数以内。如果图片很大,先缩放再识别,不要直接丢原图。
6. 进阶技巧:用自定义词典和训练数据把专有名词识别率拉上来
Tesseract 对通用中文的识别已经够用,但遇到专有名词、产品型号、人名时,错字率会明显上升。这时候有两个方向:一是用user-words和user-patterns做后处理约束,二是用tesstrain做微调。后者成本高,前者见效快。
先说过渡方案。在tessdata目录下建两个文件:chi_sim.user-words和chi_sim.user-patterns。user-words每行一个词,告诉引擎这些词是合法的;user-patterns用正则描述格式,比如产品编号。然后在调用时加参数:
tesseract test.png stdout -l chi_sim --user-words chi_sim.user-words --user-patterns chi_sim.user-patternsPython 里对应:
config = "--user-words chi_sim.user-words --user-patterns chi_sim.user-patterns" text = pytesseract.image_to_string(img, lang="chi_sim", config=config)这个方法的边界是:它只能纠正「接近正确」的结果,如果引擎完全没识别出那个字,词典也救不回来。所以它适合型号、编号这类字符集有限的场景。
如果词典方案不够,就要考虑微调。tesstrain的流程是:准备一批标注好的图片和对应的文本,生成lstmf文件,然后用lstmtraining在现有chi_sim基础上继续训练。这里有几个参数决定成败:--learning_rate不要设太大,否则会覆盖原有知识;--max_iterations根据数据量定,几百张图通常几千次就够;--target_error_rate设成 0.01 左右作为停止条件。训练完用combine_tessdata把新的traineddata合并回去。
我自己的习惯是:先用词典方案跑一遍,看错误率降到多少。如果专有名词错误率还在 10% 以上,再考虑微调。微调的数据标注成本很高,没有几百张高质量样本,效果提升有限。另外,微调后的语言包要单独命名,比如chi_sim_custom.traineddata,不要覆盖原文件,方便回滚。
最后说一个验证技巧:不要只看整体识别率,要按字段统计。比如发票场景,把「金额」「日期」「编号」分开算准确率。整体 95% 可能意味着金额字段只有 80%,而金额恰恰是最不能错的。用image_to_data拿到每个词的置信度,按字段聚合,才能知道该往哪个方向优化。希望帮到你。
本文还有配套的精品资源,点击获取