本文档描述了 Tesseract OCR 中的训练系统,包括现代的基于 LSTM 的神经网络训练方法和传统的基于原型的训练系统。它涵盖了训练数据的准备、模型训练和性能评估过程。有关使用预训练模型的信息,请参阅 OCR Pipeline。
Tesseract 支持两种不同的训练系统:
来源:src/training/unicharset/lstmtrainer.h/src/training/unicharset/lstmtrainer.cpp src/classify/cluster.cpp src/classify/protos.cpp
在训练任一系统之前,都需要准备合适的训练数据:
Box 文件是纯文本文件,包含训练图像中单个字符周围边界框的坐标。每行格式如下:
<character> <left> <bottom> <right> <top> <page>
例如
a 50 100 60 120 0
Box 文件可以通过手动或半自动方式创建,例如使用命令 tesseract <image> <basename> batch.nochop makebox。
来源:src/ccstruct/boxread.cpp70-287 src/ccstruct/boxread.h35-106
unicharset 文件定义了所有可以识别的字符。可以使用 unicharset_extractor 工具从 box 文件中提取它。
unicharset_extractor --output_unicharset unicharset [--norm_mode 1|2|3] box_file1 box_file2 ...
其中 norm_mode 控制字符的归一化。
来源:src/training/unicharset_extractor.cpp40-102
LSTM 训练系统使用神经网络从训练数据中学习字符识别。它主要在 LSTMTrainer 类中实现。
来源:src/training/lstmtraining.cpp76-235 src/training/unicharset/lstmtrainer.cpp73-302
LSTM 训练系统由以下关键组件组成:
来源:src/training/unicharset/lstmtrainer.h84-334 src/training/unicharset/lstmtester.h31-103
LSTM 训练使用 lstmtraining 命令和适当的参数来执行。
lstmtraining --traineddata lang.traineddata \
--net_spec "[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx256 O1c111]" \
--model_output output_model \
--learning_rate 0.001 \
--train_listfile train_files.txt \
--eval_listfile eval_files.txt \
--max_iterations 10000
主要参数
--traineddata:基础语言数据--net_spec:神经网络结构--train_listfile:训练文件列表--eval_listfile:评估文件列表--max_iterations:最大训练迭代次数--target_error_rate:用于停止训练的目标错误率来源:src/training/lstmtraining.cpp33-67 src/training/lstmtraining.cpp76-235
LSTM 训练器跟踪多个错误率以评估性能:
| 错误类型 | 描述 |
|---|---|
| 字符错误率 (BCER) | 字符识别错误的百分比 |
| 词错误率 (BWER) | 单词识别错误的百分比 |
| RMS 错误 | 网络激活的均方根误差 |
训练器会定期保存检查点,以便:
来源:src/training/unicharset/lstmtrainer.cpp284-372 src/training/unicharset/lstmtrainer.h40-48
传统训练系统使用特征提取和聚类来创建字符原型。尽管 LSTM 在大多数语言中已大大取代了它,但在某些特殊情况下仍在使用。
来源:src/classify/cluster.cpp1432-1589 src/classify/protos.cpp79-157
来源:src/classify/cluster.h34-50 src/classify/kdtree.h41-93 src/classify/protos.h30-47
传统系统支持多种基于字符复杂度的原型样式:
| 原型样式 | 描述 |
|---|---|
| 球形 | 形状简单,方差均匀 |
| 椭圆形 | 更复杂,每个维度有不同的方差 |
| 混合 | 不同分布的组合 |
来源: src/classify/cluster.h53-78 src/classify/clusttool.cpp90-104
LSTMTester 类提供了在不修改模型的情况下在测试数据上评估已训练模型的功能。
lstmeval --model model.traineddata --eval_listfile eval_files.txt
来源: src/training/unicharset/lstmtester.cpp25-139
BlamerBundle 系统有助于识别识别错误源
| 错误类型 | 描述 |
|---|---|
| IRR_CLASSIFIER | 分类器导致的错误 |
| IRR_CHOPPER | 字符分割中的错误 |
| IRR_CLASS_LM_TRADEOFF | 分类器/语言模型交互错误 |
来源: src/ccstruct/blamer.cpp36-62 src/ccstruct/blamer.h54-104
要对现有模型进行微调以适应特定领域
lstmtraining --continue_from existing_model.traineddata \
--model_output fine_tuned_model \
--train_listfile domain_specific_files.txt
这使得可以针对特定文档类型或字体调整预先训练好的模型。
来源: src/training/lstmtraining.cpp152-189
在训练新语言或专业模型时,请从基础语言模型开始并进行微调,而不是从头开始训练。
来源: src/training/unicharset/lstmtrainer.cpp187-215 src/training/lstmtraining.cpp217-231