跳到内容。

有关训练基于神经网络的 LSTM Tesseract 4.00,请参见 训练 Tesseract 4.00


如何使用提供的工具训练 Tesseract 3.00–3.02 用于新的语言?

注意: 这些说明适用于较旧版本的 Tesseract。 较新版本的训练说明在 [[here 训练 Tesseract]]。

介绍

Tesseract 3.0x 是完全可训练的。 本页描述了训练过程,提供了一些关于适用性到各种语言的指南,以及对结果的预期。

第三方训练工具 也可用于训练。

在开始训练之前,请检查 traineddata 已经可用的语言列表(截至 3.04 版本)。

背景和限制

Tesseract 最初设计用于识别英语文本。 已经做出努力修改引擎及其训练系统,使它们能够处理其他语言和 UTF-8 字符。 Tesseract 3.0 可以处理任何 Unicode 字符(用 UTF-8 编码),但它能成功处理的语言范围有限,所以在建立希望它能很好地处理你的特定语言之前,请考虑这一部分!

Tesseract 3.01 添加了从上到下的语言,而 Tesseract 3.02 添加了希伯来语(从右到左)。 Tesseract 目前使用名为 cube 的辅助引擎处理阿拉伯语和印地语等脚本(包含在 Tesseract 3.0+ 中)。 Google 为 3.04 版本提供了其他 [语言] (https://github.com/tesseract-ocr/tesseract/blob/3.02.02/doc/tesseract.1.asc#languages) 的 traineddata。

Tesseract 在大型字符集语言(如汉语)中运行速度较慢,但它似乎可以正常工作。

Tesseract 需要通过显式地将不同的字体分开来了解同一字符的不同形状。 字体数量限制为 64 种。 请注意,运行时高度依赖于提供的字体数量,训练超过 32 种将导致显著的减速。

对于 3.00/3.01 版本,任何具有不同标点符号和数字的语言都会因为某些硬编码算法而处于劣势,这些算法假设 ASCII 标点符号和数字。 [在 3.02 中修复]

您需要在输入文件所在的同一文件夹中运行所有命令。

所需数据文件

要为其他语言训练,您必须在 tessdata 子目录中创建一些数据文件,然后使用 combine_tessdata 将这些文件组合成一个文件。 命名约定是 languagecode.file_name。 已发布文件的语言代码遵循 ISO 639-3 标准,但可以使用任何字符串。 用于英语(3.00)的文件是

… 以及最终压缩的文件是

traineddata 文件只是输入文件的串联,其中包含一个目录表,其中包含已知文件类型的偏移量。 有关当前接受的文件名的列表,请参见源代码中的 ccutil/tessdatamanager.h。 注意traineddata 文件中的文件与 3.00 之前使用的列表不同,并且很可能会发生变化,在将来的修订版中可能会有很大变化。

文本输入文件的要求

文本输入文件(lang.config、lang.unicharambigs、font_properties、框文件、字典的词表等)需要满足以下标准

你能用多少东西来完成?

必须使用下面描述的过程创建 unicharsetinttempnormprotopffmtable。 如果您只是尝试识别有限范围的字体(例如,单个字体),那么一个训练页面可能就足够了。 其他文件不再需要提供,但很可能会提高准确性,具体取决于您的应用程序。

训练过程

该过程的某些部分不可避免地是手动的。 提供尽可能多的自动帮助。 下面提到的工具都构建在 training 子目录中。

生成训练图像

第一步是确定要使用的完整字符集,并准备一个包含一组示例的文本或文字处理器文件。 创建训练文件时最需要注意的是

接下来打印和扫描(或使用某种电子渲染方法)以创建您的训练页面的图像。 可以使用多达 64 个训练文件(多页)。 最好创建字体和样式的混合(但分别在不同的文件中),包括斜体和粗体。

注意: [仅与 3.00 版本相关,在 3.01 中修复] 从真实图像训练实际上非常困难,因为需要间距。 如果您可以打印/扫描自己的训练文本,则会容易得多。

您还需要将您的训练文本另存为 UTF-8 文本文件,以便在下一步中使用,在下一步中,您必须将代码插入另一个文件。

大量训练数据的说明 64 个图像限制是针对字体数量的。 每种字体都应该放在一个多页 tiff 中,并且可以修改框文件以指定每个字符在坐标后的页面编号。 因此,可以为任何给定字体创建任意数量的训练数据,允许训练大型字符集语言。 多页 tiff 的替代方法是为单个字体创建许多单页 tiff,然后您必须将每个字体的 tr 文件连接在一起,形成多个单字体 tr 文件。 无论哪种情况,输入到 mftraining 的 tr 文件都必须包含单个字体。

制作框文件

对于下面的下一步,Tesseract 需要一个与每个训练图像匹配的“框”文件。 框文件是一个文本文件,其中按顺序列出了训练图像中的字符,每行一个,以及包围图像的边界框的坐标。 Tesseract 3.0 有一种模式可以输出所需格式的文本文件,但是如果字符集与其当前训练不同,那么它自然会将文本识别错误。 因此,这里的主要过程是手动编辑该文件以在其中放置正确的字符。

使用此命令行对每个训练图像运行 Tesseract

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

例如:

tesseract eng.timesitalic.exp0.tif eng.timesitalic.exp0 batch.nochop makebox

现在是最难的部分。 您必须编辑文件 [lang].[fontname].exp[num].box,并将每个字符的 UTF-8 代码放在文件中的每行开头,代替 Tesseract 放置的错误字符。 例如:发行版包含一个图像 eurotext.tif。 运行上述命令会生成一个文本文件,其中包含以下行(第 141-154 行)

s 734 494 751 519 0
p 753 486 776 518 0
r 779 494 796 518 0
i 799 494 810 527 0
n 814 494 837 518 0
g 839 485 862 518 0
t 865 492 878 521 0
u 101 453 122 484 0
b 126 453 146 486 0
e 149 452 168 477 0
r 172 453 187 476 0
d 211 451 232 484 0
e 236 451 255 475 0
n 259 452 281 475 0

由于 Tesseract 在英语模式下运行,因此它无法正确识别变音符。 必须使用支持 UTF-8 的编辑器更正此字符。 在这种情况下,u 需要更改为 ü

推荐支持 UTF-8 的编辑器:Notepad++、gedit、KWrite、Geany、Vim、Emacs、Atom、TextMate、Sublime Text。 选择一个! Linux 和 Windows 都有一个字符映射,可用于复制无法键入的字符。

理论上,框文件中的每行都应该表示您训练文件中的一个字符,但是如果您有水平断裂的字符,例如双引号 „,它可能会有 2 个需要合并的框!

示例:第 116-129 行

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
, 197 498 206 510 0
, 206 497 214 509 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

如您所见,低双引号字符已表示为两个单逗号。 必须按如下方式合并边界框

这将给出

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
„ 197 497 214 510 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

如果您没有成功地将训练图像上的字符间隔开,则某些字符可能已合并成一个框。 在这种情况下,您可以重新制作间距更好的图像并重新开始,或者如果这对字符很常见,则将这两个字符放在行的开头,让边界框代表它们两者。(截至 3.00,描述“字符”的限制为 24 个字节。 这将允许您使用 6 到 24 个 Unicode 来描述字符,具体取决于您的代码在 Unicode 集中的位置。 如果有人遇到此限制,请提交一个问题来描述您的情况。)

注意框文件中使用的坐标系在左下角为 (0,0)。

每行上的最后一个数字是多页 tiff 文件中该字符的页面编号(从 0 开始)。

有几个用于编辑框文件的可视化工具。 请查看 AddOns 文档。

引导新的字符集

如果您尝试训练新的字符集,最好在一个字体上投入精力以获得一个良好的框文件,运行其余的训练过程,然后使用您新语言的 Tesseract 来创建其余的框文件,如下所示

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -l yournewlanguage batch.nochop makebox

这将使第二个框文件更容易制作,因为 Tesseract 很可能能正确识别大部分文本。 您始终可以迭代此序列,将更多字体添加到训练集中(即,到下面 mftrainingcntraining 的命令行中),但请注意,没有允许您将新训练数据添加到现有集的增量训练模式。 这意味着每次运行 mftrainingcntraining 时,您都是从给定命令行上的 tr 文件中从头开始创建新的数据文件,并且这些程序无法直接使用现有的 intproto / pffmtable / normproto 并添加它们。

提供 Tif/Box 对!

下载页面上有一些Tif/Box 文件对。(请注意,tiff 文件采用 G4 压缩以节省空间,因此您必须先安装 libtiff 或解压缩它们)。 您可以按照以下过程为自己的语言或现有语言的子集创建更好的训练数据,或者将不同的字符/形状添加到现有语言中

  1. 过滤框文件,只保留您想要的字符的行。
  2. 运行 tesseract 进行训练(如下)。
  3. 将每个字体的来自多种语言的 .tr 文件连接在一起,以获取所需的字符集,并添加来自您自己字体或字符的 .tr 文件。
  4. 以与 .tr 文件相同的方式连接过滤后的框文件,以便传递给 unicharset_extractor。
  5. 运行其余的训练过程。 注意! 这并不像听起来那么简单! cntraining 和 mftraining 只能接受最多 64 个 .tr 文件,因此您必须将来自多种语言的相同字体的所有文件连接在一起,以制作 64 个语言组合但字体独立的文件。 在 tr 文件中找到的字符必须与在传递给 unicharset_extractor 时在框文件中找到的字符序列匹配,因此您必须以与 .tr 文件相同顺序连接框文件。 cn/mftraining 和 unicharset_extractor 的命令行必须以相同顺序给出 .tr 和 .box 文件(分别),以防您对不同的字体进行不同的过滤。 可能有一个程序可以完成所有这些操作,并以字符映射的样式挑选出字符。 这可能会使整个过程变得更容易。

运行 Tesseract 进行训练

对于每个训练图像和框文件对,在训练模式下运行 Tesseract

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train

或者

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train.stderr

注意虽然 tesseract 要求在此步骤中存在语言数据,但语言数据不会被使用,因此无论您训练什么语言,英语都可以。

第一种形式将所有错误发送到名为 tesseract.log 的文件。第二种形式将所有错误发送到 stderr。

请注意,框文件名必须与 tif 文件名匹配,包括路径,否则 Tesseract 找不到它。此步骤的输出是 fontfile.tr,它包含训练页面中每个字符的特征。 [lang].[fontname].exp[num].txt 也将被写入,其中包含一个换行符,没有文本。

重要 检查 apply_box 输出中的错误。如果有报告的 FATALITIES,那么在修复框文件之前,没有必要继续训练过程。新的 box.train.stderr 配置文件可以更轻松地选择输出位置。FATALITIES 通常表示此步骤未能找到框文件中列出的某个字符的任何训练样本。坐标可能错误,或者与相关字符的图像存在问题。如果不存在可用的字符样本,则无法识别,生成的 inttemp 文件将与后面的 unicharset 文件不匹配,并且 Tesseract 将中止。

另一个可能发生的错误也是致命的,需要关注是关于“第 n 行的框文件格式错误”的错误。如果前面有“坏的 utf-8 字符…”,则 UTF-8 代码不正确,需要修复。错误“utf-8 字符串太长…”表示您已超过字符描述的 24 字节限制。如果您需要超过 24 字节的描述,请提交问题。

不需要编辑 [lang].[fontname].exp[num].tr 文件的内容。里面的字体名称不需要设置。

对于好奇的人来说,这里有一些关于格式的信息。框文件中的每个字符在 .tr 文件中都有对应的一组条目(按顺序),如下所示

UnknownFont <UTF-8 code(s)> 2
mf <number of features>
x y length dir 0 0
... (there are a set of these determined by <number of features>
above)
cn 1
ypos length x2ndmoment y2ndmoment

The mf features are polygon segments of the outline normalized to the 1st and 2nd moments. x= x position [-0.5,0.5] y = y position [-0.25,0.75] length is the length of the polygon segment [0,1.0] dir is the direction of the segment [0,1.0]

The cn feature is to correct for the moment normalization to distinguish position and size (eg c vs C and , vs ‘)

计算字符集

Tesseract 需要知道它可以输出的字符集。要生成 unicharset 数据文件,请使用 unicharset_extractor 程序对上面生成的框文件进行操作

unicharset_extractor [lang].[fontname].exp[num].box lang.fontname.exp1.box ...

Tesseract 需要访问字符属性 isalpha、isdigit、isupper、islower、ispunctuation。此数据必须编码在 unicharset 数据文件中。此文件的每一行对应一个字符。UTF-8 中的字符后面是一个十六进制数字,表示一个二进制掩码,它编码了属性。每个位对应一个属性。如果将位设置为 1,则表示该属性为真。位顺序为(从最低有效位到最高有效位):isalpha、islower、isupper、isdigit。

示例

; 10 Common 46
b 3 Latin 59
W 5 Latin 40
7 8 Common 66
= 0 Common 93

日语或中文字母字符属性用二进制数 00001(十六进制为 1)表示。

如果您的系统支持 wctype 函数,unicharset_extractor 将自动设置这些值,并且不需要编辑 unicharset 文件。在某些非常旧的系统(例如 Windows 95)上,必须手动编辑 unicharset 文件以添加这些属性描述代码。

最后两列表示脚本类型(拉丁语、通用语、希腊语、西里尔语、汉语、空)和给定语言的字符 ID 代码。

注意: 每当生成 inttempnormprotopffmtable 时,必须重新生成 unicharset 文件(即,当框文件更改时,它们必须全部重新创建),因为它们必须保持同步。

font_properties(3.01 中新增)

3.01 中训练的新要求是 font_properties 文件。该文件的目的是提供字体样式信息,这些信息将在识别字体时出现在输出中。 font_properties 文件是一个文本文件,由 -F filename 选项指定给 mftraining

font_properties 文件的每一行格式如下

<fontname> <italic> <bold> <fixed> <serif> <fraktur>

其中 <fontname> 是一个命名字体的字符串(不允许空格!),<italic><bold><fixed><serif><fraktur> 都是简单的 0 或 1 标志,表示字体是否具有命名属性。

运行 mftraining 时,每个 .tr 文件名必须与 font_properties 文件中的一个条目匹配,否则 mftraining 将中止。在某个时间点,可能在 3.01 发布之前,此匹配要求可能会转变为 .tr 文件本身的字体名称。.tr 文件的名称可以是 fontname.tr 也可以是 [lang].[fontname].exp[num].tr

示例

font_properties 文件

timesitalic 1 0 0 1 0
shapeclustering -F font_properties -U unicharset eng.timesitalic.exp0.tr
mftraining -F font_properties -U unicharset -O eng.unicharset eng.timesitalic.exp0.tr

注意,在 3.03 中,有一个默认的 font_properties 文件,它涵盖了 3000 种字体(不一定是准确的),位于以下仓库中:https://github.com/tesseract-ocr/langdata.

聚类

当所有训练页面的字符特征都被提取出来后,我们需要对它们进行聚类以创建原型。

可以使用 shapeclusteringmftrainingcntraining 程序对字符形状特征进行聚类

shapeclustering(3.02 中新增)

shapeclustering 不应使用,除非用于印度语系语言。

shapeclustering -F font_properties -U unicharset [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

shapeclustering 通过形状聚类创建一个主形状表,并将它写入名为 shapetable 的文件。

mftraining

mftraining -F font_properties -U unicharset -O [lang].unicharset [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

-U 文件是上面由 unicharset_extractor 生成的 unicharset,lang.unicharset 是将被提供给 combine_tessdata 的输出 unicharset。

mftraining 将输出另外两个数据文件: inttemp(形状原型)和 pffmtable(每个字符的预期特征数量)。在 3.00/3.01 版本中,此程序还会写入第三个名为 Microfeat 的文件,但它不会被使用。更高版本不会生成此文件。

注意: 如果您没有运行 shapeclusteringmftraining 将生成一个 shapetable 文件。您必须将此 shapetable 包含在您的 traineddata 文件中,无论是否使用 shapeclustering

cntraining

cntraining [lang].[fontname].exp[num].tr lang.fontname.exp1.tr ...

这将输出 normproto 数据文件(字符归一化灵敏度原型)。

字典数据(可选)

Tesseract 为每种语言使用最多 8 个词典文件。这些都是可选的,可以帮助 Tesseract 决定不同可能的字符组合的可能性。

七个文件被编码为有向无环词图 (DAWG),另一个是纯 UTF-8 文本文件

名称 类型 描述
word-dawg dawg 由语言的字典词组成的 DAWG。
freq-dawg dawg 由将进入 word-dawg 的最常见词组成的 DAWG。
punc-dawg dawg 由在词语周围发现的标点符号模式组成的 DAWG。“词语” 部分被一个空格替换。
number-dawg dawg 由最初包含数字的标记组成的 DAWG。每个数字都被空格字符替换。
fixed-length-dawgs dawg 几个不同固定长度的 DAWG——对汉语等语言有用。[从 3.03 版本开始不再使用]
bigram-dawg dawg 一个词语二元组的 DAWG,其中词语之间用空格隔开,每个数字都被?替换。
unambig-dawg dawg TODO: 描述。
user-words text 要添加到字典中的额外词语列表。通常留空,由用户在需要时添加;请参见 tesseract(1)

要创建 DAWG 字典文件,您首先需要语言的词语列表。您可以从拼写检查器中找到一个合适的字典文件作为词语列表的基础(例如,ispellaspellhunspell)- 注意许可证。词语列表的格式为 UTF-8 文本文件,每行一个词语。将词语列表拆分为需要的集合,例如:常见的词语和其他词语,然后使用 wordlist2dawg 创建 DAWG 文件

wordlist2dawg frequent_words_list [lang].freq-dawg [lang].unicharset
wordlist2dawg words_list [lang].word-dawg [lang].unicharset

对于从右到左(RTL)书写的语言(如阿拉伯语和希伯来语),请在 wordlist2dawg 命令中添加 -r 1

其他选项可以在 wordlist2dawg 手册页 中找到

注意: 如果组合的 traineddata 中包含字典文件,则它必须至少包含一个条目。否则为空的字典文件不是 combine_tessdata 步骤所必需的。

应将拼写不寻常的词语添加到字典文件中。拼写不寻常的词语可能包括字母字符与标点符号或数字字符的混合。(例如,i18n、l10n、google.com、news.bbc.co.uk、io9.com、utf8、ucs2)

如果您需要字典词语列表的示例文件,请使用 combine_tessdata 拆分现有的语言数据文件(例如,eng.traineddata),然后使用 dawg2wordlist 提取词语列表

最后一个文件(unicharambigs)

Tesseract 使用的最终数据文件称为 unicharambigs。它描述了字符或字符集之间可能存在的歧义,并且是手动生成的。要了解文件格式,请查看以下示例

v1
2       ' '     1       "       1
1       m       2       r n     0
3       i i i   1       m       0

第一行是版本标识符。剩余的行是制表符分隔的字段,格式如下

<number of characters for match source> <tab> <characters for match source> <tab> <number of characters for match target> <tab> <characters for match target> <tab> <type indicator>

类型指示符 could have 具有以下值

类型 描述
0 一个非强制性替换。这告诉 Tesseract 将歧义视为对分割搜索的提示,即如果将“源”替换为“目标”从非字典词创建了字典词,则它应该继续工作。可以通过歧义转换为另一个字典词的字典词不会被用于训练自适应分类器。  
1 一个强制性替换。这告诉 Tesseract 始终将匹配的“源”替换为“目标”字符串。  
示例行 解释
2 ‘ ‘ 1 “ 1 每当看到 2 个连续的单引号 (‘) 时,应该将双引号 (“) 替换掉。
1 m 2 r n 0 字符“rn”有时可能被错误地识别为“m”。
3 i i i 1 m 0 字符“m”有时可能被错误地识别为序列“iii”。

每个单独的字符都必须包含在 unicharset 中。也就是说,所有使用的字符都必须是正在训练的语言的一部分。

规则不是双向的,因此如果您希望在检测到“m”时考虑“rn”,反之亦然,则需要为每个规则制定一个规则。

与训练中使用的大多数其他文件一样,unicharambigs 文件必须编码为 UTF-8,并且必须以换行符结尾。

unicharambigs 格式还在 unicharambigs(5) 手册页 中进行了描述。

unicharambigs 文件也可能不存在。

将所有内容整合在一起

就是这样!您现在需要做的就是收集所有文件(shapetablenormprotointtemppffmtable)并用 lang. 前缀重命名它们,其中 lang 是您从 http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes 获取的语言的 3 个字母代码,然后对它们运行 combine_tessdata,如下所示

combine_tessdata [lang].

注意: 不要忘记结尾处的点!

生成的 lang.traineddata 位于您的 tessdata 目录中。然后,Tesseract 可以(理论上)用以下命令识别您语言中的文本

tesseract image.tif output -l [lang]

(实际上,您可以使用任何您喜欢的字符串作为语言代码,但是如果您希望其他人能够轻松地使用它,ISO 639 是最佳选择。)

combine_tessdata 的更多选项可以在其 手册页 或其 源代码 中的注释中找到。

您可以在第三方在线 Traineddata 检查器 中检查 traineddata 文件的内部结构。