跳到主要内容
开发者指南

使用自定义字体和数据
训练 Tesseract(tesstrain,v5)。

一份经过验证、以决策为导向的指南,使用 tesstrain 微调和训练 Tesseract 5 模型:从源码构建、准备真值数据、运行 make training、调整关键变量、用 lstmeval 测量 CER,并部署 traineddata。

TL;DR — 微调现有模型

如果模型已支持你的文字体系,微调是获得更好模型的最快途径。

bash
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 不可接受时才升级。大多数自定义字体问题都能通过微调解决。

前提条件

训练需要从源码构建,而不是打包好的二进制安装。

bash
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 将长文本拆分成行。

bash
# 从语料库 + 字体生成单行图像
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 选择

字符集必须覆盖模型将看到的所有内容。

运行训练

一条命令即可驱动整个 Makefile 流程。

bash
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_TYPE0 从零、1 微调、2 裁掉顶层1
NET_SPEC网络架构规格保持默认
RATIO_TRAIN训练/验证划分比例0.9
TARGET_ERROR_RATE提前停止的 CER 目标0.01

检查点、stop_training 与 best vs fast

评估:用 lstmeval 计算字符错误率

用模型从未见过的数据来评判。

bash
lstmeval --model data/myfont_checkpoint \
  --traineddata ../tessdata_best/chi_sim.traineddata \
  --eval_listfile data/myfont-ground-truth/eval_files.txt

监控留出集上的 CER。当它不再下降——或在训练损失仍在下降时开始上升——即为过拟合;应停止并使用更早的检查点。

部署训练好的模型

复制 traineddata,让引擎指向它并测试。

bash
# 复制到 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。