菜单

训练

相关源文件

本文档描述了 Tesseract OCR 中的训练系统,包括现代的基于 LSTM 的神经网络训练方法和传统的基于原型的训练系统。它涵盖了训练数据的准备、模型训练和性能评估过程。有关使用预训练模型的信息,请参阅 OCR Pipeline

训练系统概述

Tesseract 支持两种不同的训练系统:

  1. LSTM 训练系统 - 使用神经网络进行 OCR 的现代方法,为大多数语言提供卓越的准确性。
  2. 传统训练系统 - 使用特征聚类和原型生成的旧式方法,仍用于某些专业应用。

来源:src/training/unicharset/lstmtrainer.h/src/training/unicharset/lstmtrainer.cpp src/classify/cluster.cpp src/classify/protos.cpp

训练数据准备

在训练任一系统之前,都需要准备合适的训练数据:

  1. 训练图像 - 清晰的文本图像
  2. Box 文件 - 包含字符边界框的文本文件
  3. Unicharset - 使用的字符集定义

Box 文件

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 控制字符的归一化。

  • 1:组合字素(适用于拉丁文和简单脚本)
  • 2:拆分字素(适用于印度语/高棉语/缅甸语)
  • 3:纯 Unicode(适用于阿拉伯语/希伯来语/泰语/藏语)

来源:src/training/unicharset_extractor.cpp40-102

LSTM 训练系统

LSTM 训练系统使用神经网络从训练数据中学习字符识别。它主要在 LSTMTrainer 类中实现。

训练过程概述

来源:src/training/lstmtraining.cpp76-235 src/training/unicharset/lstmtrainer.cpp73-302

训练组件

LSTM 训练系统由以下关键组件组成:

  1. LSTMTrainer - 管理训练过程的主类
  2. DocumentCache - 存储和管理训练数据
  3. LSTMTester - 评估模型在测试数据上的性能
  4. RecodeBeamSearch - 用于训练/评估期间的识别

来源:src/training/unicharset/lstmtrainer.h84-334 src/training/unicharset/lstmtester.h31-103

运行 LSTM 训练

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

关键组件

  1. 聚类 (CLUSTERER) - 将相似样本分组
  2. 原型生成 - 为字符创建代表性模型
  3. K-D 树 - 用于样本组织的有效空间数据结构

来源: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

训练最佳实践

  1. 数据质量:使用干净、有代表性且多样化的训练数据。
  2. 字符覆盖:确保目标领域中的所有字符都在训练数据中得到表示。
  3. 训练时长:监控错误率并停止在它们稳定时,以避免过拟合。
  4. 网络结构:对于 LSTM,从推荐的网络结构开始,并根据需要进行调整。
  5. 测试:始终在未用于训练的单独测试集上进行评估。

在训练新语言或专业模型时,请从基础语言模型开始并进行微调,而不是从头开始训练。

来源: src/training/unicharset/lstmtrainer.cpp187-215 src/training/lstmtraining.cpp217-231