使用自定义字体和数据
训练 Tesseract(tesstrain,v5)。
一份经过验证、以决策为导向的指南,使用 tesstrain 微调和训练 Tesseract 5 模型:从源码构建、准备真值数据、运行 make training、调整关键变量、用 lstmeval 测量 CER,并部署 traineddata。
TL;DR — 微调现有模型
如果模型已支持你的文字体系,微调是获得更好模型的最快途径。
git clone https://github.com/tesseract-ocr/tesstrain.git
cd tesstrain && make tesseract-langdata
# 将单行图像 + .gt.txt 放入 data/myfont-ground-truth/
make training MODEL_NAME=myfont START_MODEL=chi_sim训练不通过二进制安装程序提供。你需要 Linux 或 WSL2。从源码构建请参见安装。
决策树:微调 vs 裁掉顶层 vs 从零训练
选对方法可以省下数天的无效训练。
| 方法 | 适用场景 | 所需数据 | 耗时 |
|---|---|---|---|
微调(FINETUNE_TYPE=1) | 同一文字体系,新字体或专业词汇 | 1,000–5,000 行 | 数小时 |
裁掉顶层(FINETUNE_TYPE=2) | 同一文字体系,字形差异明显 | 5,000–20,000 行 | 数小时–数天 |
| 从零训练 | 全新文字体系或差异很大的字母表 | 50,000+ 行 | 数天 |
先从可能奏效的最轻量方案开始,评估后只有 CER 不可接受时才升级。大多数自定义字体问题都能通过微调解决。
前提条件
训练需要从源码构建,而不是打包好的二进制安装。
- Linux 环境——原生或 Windows 上的 WSL2。macOS 不支持训练。
git、make、pkg-config、automake以及 C++ 工具链。libtesseract-dev和libleptonica-dev(训练二进制依赖它们)。tesstrain仓库,以及langdata_lstm和tessdata_best起始模型。
sudo apt update
sudo apt install -y git make automake pkg-config g++ \
libleptonica-dev libtesseract-dev tesseract-ocr
git clone https://github.com/tesseract-ocr/tesstrain.git
cd tesstrain
make tesseract-langdata # 获取 langdata_lstm + tessdata_best准备真值数据
真值数据是与精确文本配对的单行图像。
tesstrain 期望在 data/<MODEL_NAME>-ground-truth/ 中每行文本对应一张图像,每张图像配一个包含精确转录的 .gt.txt 文件。用 text2image 从文本文件和字体生成图像,并用 langdata_lstm 的 split_training_text.py 将长文本拆分成行。
# 从语料库 + 字体生成单行图像
text2image --text=corpus.txt \
--outputbase=data/myfont-ground-truth/myfont \
--font='My Custom Font' --fonts_dir=/usr/share/fonts \
--ptsize=14
# text2image 也会生成 .box 文件;请将其转换为 .gt.txt
# (tesstrain/training/ 中有辅助脚本,或核对后重命名)数据量参考:100–500 行用于验证流程,1,000–5,000 行用于生产。精度来自多样性——不同字体、字号、间距和噪声——而非单纯的数量。
字体与 unicharset 选择
字符集必须覆盖模型将看到的所有内容。
- 在环境中安装训练字体;将准确的字体族名称传给
--font。 - 微调时保留起始模型的
unicharset,使输出层匹配。 - 对于全新文字体系,从真值数据推导 unicharset,确保每个字形都被包含。
- 如果真实文档包含标点、数字和大小写,请一并纳入;否则模型会丢弃它们。
运行训练
一条命令即可驱动整个 Makefile 流程。
make training \
MODEL_NAME=myfont \
START_MODEL=chi_sim \
TESSDATA_PREFIX=../tessdata_best \
MAX_ITERATIONS=10000| 变量 | 含义 | 典型值 |
|---|---|---|
START_MODEL | 要继续训练的模型(微调) | eng、chi_sim… |
TESSDATA_PREFIX | 包含起始模型的目录 | ../tessdata_best |
MAX_ITERATIONS | 训练步数上限 | 10000–100000 |
LEARNING_RATE | 步长;微调时越小越安全 | 0.0001–0.001 |
FINETUNE_TYPE | 0 从零、1 微调、2 裁掉顶层 | 1 |
NET_SPEC | 网络架构规格 | 保持默认 |
RATIO_TRAIN | 训练/验证划分比例 | 0.9 |
TARGET_ERROR_RATE | 提前停止的 CER 目标 | 0.01 |
检查点、stop_training 与 best vs fast
- tesstrain 会定期写入检查点(例如
myfont_checkpoint),可用于评估或续训。 - 在输出目录创建
stop_training文件,可在下一次迭代时干净地结束训练。 - 用训练工具中的
combine_tessdata -e/convert_to_int将检查点转换为可用模型。 - best 模型精度最高;fast 模型更小更快。精度重要时请从
tessdata_best微调。
评估:用 lstmeval 计算字符错误率
用模型从未见过的数据来评判。
lstmeval --model data/myfont_checkpoint \
--traineddata ../tessdata_best/chi_sim.traineddata \
--eval_listfile data/myfont-ground-truth/eval_files.txt监控留出集上的 CER。当它不再下降——或在训练损失仍在下降时开始上升——即为过拟合;应停止并使用更早的检查点。
部署训练好的模型
复制 traineddata,让引擎指向它并测试。
# 复制到 tessdata 目录
cp data/myfont.traineddata /usr/share/tesseract-ocr/5/tessdata/
# 或设置自定义前缀
export TESSDATA_PREFIX=/path/to/tessdata
tesseract sample.png stdout -l myfont你可以将模型与基础语言组合,例如 -l myfont+chi_sim。在 Python 中把相同的值传给 pytesseract;参见 Python 指南。
疑难解答
| 症状 | 原因 | 解决 |
|---|---|---|
| 框错位 / 真值数据不对齐 | 字体度量错误或行图像过大 | 用正确的 --font 和 --ptsize 重新生成;目视检查几张图像。 |
| 输出缺字 | unicharset 中缺少该字符 | 将字形加入真值数据并重建 unicharset。 |
| 损失发散 / NaN | 学习率过高 | 降低 LEARNING_RATE 并从更早的检查点续训。 |
| 内存不足(OOM) | 批次对内存/GPU 过大 | 减小 BATCH_SIZE/网络规模,或使用内存更大的机器。 |
| 训练损失下降但验证 CER 上升 | 过拟合 | 提前停止、加入更多样化的真值数据,或降低学习率。 |
训练常见问题
能否不编译源码就训练 Tesseract?
不能。训练工具不包含在二进制安装程序中;请使用 Linux 或 WSL2,并安装 libtesseract-dev 和 tesstrain 仓库。
需要多少样本?
约 100–500 行用于验证流程,1,000–5,000 行用于生产。微调所需数据少于从零训练。
应该微调还是从零训练?
在现有文字体系中需要新字体或词汇时选择微调;只有面对全新文字体系时才从零训练。
何时停止训练?
当留出验证 CER 不再改善时,而不是训练损失趋于平缓时。这一差距就是过拟合。
模型放在哪里?
将 <MODEL_NAME>.traineddata 复制到 tessdata 目录(或设置 TESSDATA_PREFIX),然后运行 tesseract image.png stdout -l myfont。