有关训练基于神经网络的 LSTM Tesseract 4.00 的信息,请参见 训练 Tesseract 4.00
如何使用提供的工具为 Tesseract 2.x 训练新语言?
注意: 这些说明适用于较旧版本的 Tesseract。有关最新版本的训练说明,请参见 此处。
简介
Tesseract 2.0 是完全可训练的。本页介绍了训练过程,提供了一些关于适用性的指南,以及对结果的预期。
背景和局限性
Tesseract 最初设计用于仅识别英文文本。人们一直在努力修改引擎及其训练系统,使其能够处理其他语言和 UTF-8 字符。Tesseract 2.0 可以处理任何 Unicode 字符(使用 UTF-8 编码),但它在成功识别的语言范围方面存在限制,因此请在建立对它能够很好地处理您的特定语言的希望之前,请考虑本部分内容!
Tesseract 只能处理从左到右的语言。虽然您可能可以通过从右到左的语言获得一些结果,但输出文件将按从左到右的顺序排列。目前无法处理从上到下的语言。
Tesseract 无法处理阿拉伯语等连接脚本。处理这种情况需要一些专门的算法,而目前它还没有这些算法。
对于具有大量字符集的语言(如汉语),Tesseract 的速度可能会很慢,因此可能不会有用。此外,还需要对代码进行一些更改,以适应具有超过 256 个字符的语言。
任何具有不同标点符号和数字的语言都会受到某些硬编码算法的负面影响,这些算法假设使用 ASCII 标点符号和数字。
所需数据文件
要为其他语言训练,您必须在 tessdata
子目录中创建 8 个数据文件。命名约定是 languagecode.file_name
语言代码遵循 ISO 639-3 标准。用于英文的 8 个文件是
tessdata/eng.freq-dawg
tessdata/eng.word-dawg
tessdata/eng.user-words
tessdata/eng.inttemp
tessdata/eng.normproto
tessdata/eng.pffmtable
tessdata/eng.unicharset
tessdata/eng.DangAmbigs
您能省去多少内容?
您必须使用下面描述的过程创建 inttemp、normproto、pffmtable、freq-dawg、word-dawg 和 unicharset。如果您只尝试识别有限范围的字体(例如,单个字体),那么一个训练页面就足够了。DangAmbigs 和 user-words 可以是空文件。如果您没有词典列表,则不需要在字典文件中提供大量单词(freq-dawg 和 word-dawg),但准确率会低于使用适当大小的词典(例如,英文词典包含数万个单词)的情况。但至少对于 2.04 及以下版本,不允许使用空 daw 文件或没有单词的 daw 文件。
训练过程
该过程不可避免地包含一些手动操作。我们将尽可能提供自动化的帮助。未来可能会出现更多自动化的工具。下面提到的工具都在 training 子目录中构建。
生成训练图像
第一步是确定要使用的完整字符集,并准备一个包含一组示例的文本或字处理文件。创建训练文件时需要注意的最重要事项是
- 确保每个字符至少包含一个样本。10 个样本是最好的,但对于罕见字符,5 个样本也可以。
- 对于更频繁的字符,应该包含更多样本 - 至少 20 个样本。
- 不要犯将所有非字母字符分组在一起的错误。使文本更加真实。例如,The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.[]{}<>/? 很糟糕。The (quick) [brown] {fox} jumps! over the $3,456.78
<lazy>
#90 dog & duck/goose, as 12.5% of E-mail from [email protected] is spam? 会好得多。这样可以使文本行查找代码有更大的机会为特殊字符获得合理的基线指标。 - 在打印时绝对至关重要的是稍微将文本间隔开,因此请在字处理程序中提高字符间距和行间距。如果文本间隔不足,则在生成 tr 文件期间会导致“失败!框不与任何斑点重叠或多个行中包含斑点”错误,这会导致致命错误 - 0 个标记样本的“x”,这会导致“错误:inttemp 中有 X 个类,而 unicharset 包含 Y 个 unichar”,您将无法使用新的数据文件。
- 训练数据目前需要适应单个 tiff 图像,但可以是多页 tiff(如果您安装了 libtiff)。
- 不需要使用多种尺寸进行训练。10 点就足够了。(例外情况是极小的文本。如果您要识别 x 高度小于约 15 像素的文本,则应专门对其进行训练,或在尝试识别之前缩放图像。)。
- 不要在一页上混合字体(准确地说,不要在一个 .tr 文件中混合字体)。这会导致特征在聚类时丢失,从而导致识别错误。
- 下载页面上的示例 boxtiff 文件可以帮助您了解如何格式化训练数据。
接下来,打印并扫描(或使用一些电子渲染方法)以创建训练页面的图像。可以使用多达 32 张训练图像。最好创建包含多种字体和样式的页面,包括斜体和粗体。
注意: 由于间隔要求,从真实图像进行训练实际上非常困难。这将在未来的版本中得到改进。目前,如果您能自己打印/扫描训练文本,会更容易。
您还需要将训练图像另存为 UTF-8 文本文件,以便在下一步中使用它,您需要将代码插入另一个文件中。
大量训练数据的说明 32 张图像的限制适用于字体的数量。每种字体都可以放在一个多页 tiff 中(只有在使用 libtiff 时!),并且可以修改框文件以在坐标之后指定每个字符的页码。因此,可以为任何给定字体创建任意数量的训练数据,从而允许训练大量字符集的语言。多页 tiff 的替代方法是为单个字体创建多个单页 tiff,然后必须将每个字体的 tr 文件连接在一起,形成多个单字体 tr 文件。在任何情况下,提供给 mftraining 的输入 tr 文件都必须包含单个字体,并且提供给 mftraining 的文件顺序必须与提供给 unicharset_extractor 的文件顺序匹配。
制作框文件
对于下面的下一步,Tesseract 需要一个与每个训练图像匹配的“框”文件。框文件是一个文本文件,按顺序列出训练图像中的字符,每行一个字符,以及围绕图像的边界框的坐标。Tesseract 2.0 有一种模式,它将在该模式下输出所需的格式的文本文件,但如果字符集与当前训练集不同,它自然会输出错误的文本。因此,此处的关键过程是手动编辑该文件,以将正确的字符放入其中。
使用以下命令行在您的每个训练图像上运行 Tesseract
tesseract fontfile.tif fontfile batch.nochop makebox
然后,您必须将 fontfile.txt
重命名为 fontfile.box
。
现在是困难的部分。您必须编辑 fontfile.box 文件,并在每一行的开头放入每个字符的 UTF-8 代码,以替换 Tesseract 放置在其中的错误字符。例如:发行版包含图像 eurotext.tif。运行上面的命令会生成一个文本文件,其中包含以下行(第 142-155 行)
s 734 491 751 516
p 753 483 776 515
r 779 492 796 516
i 799 492 810 525
n 814 492 837 516
g 839 483 862 516
t 865 491 878 520
u 101 452 122 483
b 126 453 146 486
e 149 452 168 477
r 172 453 187 476
d 211 450 232 483
e 236 450 255 474
n 259 451 281 474
由于 Tesseract 在英文模式下运行,因此它无法正确识别变音符。需要使用合适的编辑器更正此字符。应使用了解 UTF-8 的编辑器来完成此操作。HTML 编辑器通常是一个不错的选择。(在 Linux 上的 Mozilla 允许您直接从浏览器编辑 UTF-8 文本文件。Firefox 和 IE 不允许您这样做。MS Word 在处理不同的文本编码方面非常好,Notepad++ 是另一个了解 UTF-8 的编辑器。)Linux 和 Windows 都包含一个字符映射,可以用于复制无法键入的字符。在这种情况下,需要将 u 更改为 ü。
理论上,框文件中的每一行都应该表示训练文件中的一个字符,但如果您有一个水平断开的字符,例如双引号 „,它可能会有 2 个需要合并的框!
示例:第 117-130 行
D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
, 197 496 205 507
, 206 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532
如您所见,低双引号字符已被表示为两个单引号。必须合并边界框,如下所示
- 第一个数字(左侧)取两行的最小值(197)
- 第二个数字(底部)取两行的最小值(496)
- 第三个数字(右侧)取两行的最大值(214)
- 第四个数字(顶部)取两行的最大值(508)
这将得到
D 101 503 131 534
e 135 501 154 527
r 158 503 173 526
„ 197 496 214 508
s 220 499 236 524
c 239 499 258 523
h 262 500 284 532
n 288 500 310 524
e 313 499 332 523
l 336 500 347 533
l 352 500 363 532
e 367 499 386 524
" 389 520 407 532
如果您没有成功地将训练图像上的字符间隔开,则某些字符可能已合并到一个框中。在这种情况下,您可以重新制作间隔更好的图像并重新开始,或者如果这对字符很常见,则可以在行的开头放置两个字符,让边界框同时表示它们。(截至 2.04 版本,“字符”描述的字节数限制为 24 个字节。这将允许您使用 6 到 24 个 Unicode 来描述字符,具体取决于您的代码在 Unicode 集中的位置。如果有人遇到此限制,请提交一个描述您的情况的问题。)。
注意 框文件中使用的坐标系在左下角为 (0,0)。
如果您有一个了解 UTF-8 的编辑器,此过程会比不了解 UTF-8 的编辑器容易得多,因为每个 UTF-8 字符最多包含 4 个字节用于编码,而哑编辑器会分别显示所有字节。
有几个用于编辑框文件的可视化工具 - 请查看 ../AddOns。
引导新的字符集
如果您尝试训练新的字符集,最好在一个字体上付出努力,以获得一个好的框文件,运行其余的训练过程,然后使用您新语言的 Tesseract 制作其余的框文件,如下所示
tesseract fontfile.tif fontfile -l yournewlanguage batch.nochop makebox
这将使第二个框文件更容易制作,因为 Tesseract 很可能能正确识别大多数文本。您可以始终重复此过程,在制作新字体时将更多字体添加到训练集中(即添加到下面 mfTraining 和 cnTraining 的命令行中),但请注意,没有增量训练模式允许您将新训练数据添加到现有集中。这意味着每次运行 mfTraining 和 cnTraining 时,您都会从命令行上提供的 tr 文件中从头开始创建新的数据文件,并且这些程序无法直接获取现有 intproto/pffmtable/normproto 并进行添加。
提供 Tif/Box 对!
Tif/Box 文件对位于下载页面上。(注意,tiff 文件是 G4 压缩的,以节省空间,因此您必须先安装 libtiff 或对其进行解压缩)。您可以按照以下过程为自己的语言或现有语言的子集制作更好的训练数据,或将不同的字符/形状添加到现有语言中
- 过滤框文件,只保留您想要字符的行。
- 运行 Tesseract 进行训练(见下文)。
- 将来自多种语言的 .tr 文件(针对每种字体)连接在一起,以获得您想要的字符集,并将来自您自己的字体或字符的 .tr 文件添加到其中。
- 以与 .tr 文件相同的方式连接经过过滤的框文件,以便将其传递给 unicharset_extractor。
- 运行剩余的训练过程。注意!这并不像看起来那样简单!cntraining 和 mftraining 只能接受多达 32 个 .tr 文件,因此您必须将来自多种语言(针对同一字体)的所有文件连接在一起,以制作 32 个语言组合的、但字体独立的文件。tr 文件中找到的字符必须与提供给 unicharset_extractor 时框文件中找到的字符顺序匹配,因此您必须以与 .tr 文件相同顺序连接框文件。cn/mftraining 和 unicharset_extractor 的命令行必须以相同顺序提供 .tr 文件和 .box 文件(分别),以防您对不同的字体进行不同的过滤。可能有一个程序可以完成所有这些操作,并以字符映射的方式挑选出字符。这可能使整个过程更容易。
运行 Tesseract 进行训练
对于每个训练图像和框文件对,以训练模式运行 Tesseract
tesseract fontfile.tif junk nobatch box.train
或
tesseract fontfile.tif junk nobatch box.train.stderr
第一种形式将所有错误发送到 tesseract.log(在所有平台上),就像在 Windows 版本 2.03 及以下版本中所做的那样。使用 box.train.stderr,所有错误都将发送到 stderr(在所有平台上),就像在非 Windows 平台上的版本 2.03 及以下版本中所做的那样。
请注意,框文件名必须与 tiff 文件名匹配,包括路径,否则 Tesseract 找不到它。此步骤的输出是 fontfile.tr
,其中包含训练页面的每个字符的特征。另请注意,输出名称来自输入图像名称,而不是此处显示的正常输出名称 junk
。junk.txt 也将被写入,其中包含单个换行符和没有文本。
重要 检查 apply_box 的输出中是否有错误。如果有报告致命错误,则必须在修复框文件之前继续训练过程。新的 box.train.stderr 配置文件可以更容易地选择输出的位置。致命错误通常表示此步骤未能找到框文件中列出的某个字符的任何训练样本。可能是坐标错误,也可能是所关注的字符的图像有问题。如果某个字符没有可行的样本,则无法识别它,并且生成的 inttemp 文件将与后面的 unicharset 文件不匹配,Tesseract 将中止。
另一个可能发生的也是致命的并且需要关注的错误是关于“第 n 行的 Box 文件格式错误”。如果前面是“Bad utf-8 char…”,则 UTF-8 编码不正确,需要修复。错误“utf-8 string too long…”表示您已超出字符描述的 8 字节(v2.01 版)限制。如果您需要超过 8 字节的描述,请提交问题。没有上述两种错误的 Box 文件格式错误表明要么是边界框整数有问题,要么可能是 Box 文件中的空行。空行实际上是无害的,在这种情况下可以忽略该错误。代码可以忽略它们,但如果 Box 文件存在意外错误,它不会忽略它们。
无需编辑 fontfile.tr 文件的内容。它内部的字体名称无需设置。对于好奇的人,这里有一些关于格式的信息
Every character in the box file has a corresponding set of entries in
the .tr file (in order) like this
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 ')
聚类
当所有训练页面的字符特征都被提取后,我们需要对它们进行聚类以创建原型。可以使用 mftraining
和 cntraining
程序对字符形状特征进行聚类
mftraining fontfile_1.tr fontfile_2.tr ...
这将输出两个数据文件:inttemp
(形状原型)和 pffmtable
(每个字符的预期特征数量)。(此程序还会写入第三个文件,名为 Microfeat
,但它不会被使用。)
cntraining fontfile_1.tr fontfile_2.tr ...
这将输出 normproto
数据文件(字符归一化敏感度原型)。
计算字符集
Tesseract 需要知道它可以输出的所有可能的字符集。要生成 unicharset
数据文件,请对与聚类所用的训练页面边界框文件相同的训练页面边界框文件使用 unicharset_extractor
程序
unicharset_extractor fontfile_1.box fontfile_2.box ...
Tesseract 需要访问字符属性 isalpha、isdigit、isupper、islower。此数据必须编码在 unicharset
数据文件中。此文件的每一行对应于一个字符。UTF-8 中的字符后面跟着一个十六进制数字,表示编码属性的二进制掩码。每个位对应于一个属性。如果位被设置为 1,则表示该属性为真。位排序为(从最低有效位到最高有效位):isalpha、islower、isupper、isdigit。
示例
- ‘;’ 不是字母字符、小写字符、大写字符,也不是数字。因此,它的属性由二进制数 0000(十六进制表示为 0)表示。
- ‘b’ 是一个字母字符和小写字符。因此,它的属性由二进制数 0011(十六进制表示为 3)表示。
- ‘W’ 是一个字母字符和大写字符。因此,它的属性由二进制数 0101(十六进制表示为 5)表示。
- ‘7’ 只是一个数字。因此,它的属性由二进制数 1000(十六进制表示为 8)表示。
; 0
b 3
W 5
7 8
如果您的系统支持 wctype 函数,则这些值将由 unicharset_extractor 自动设置,无需编辑 unicharset 文件。在一些旧系统(例如 Windows 95)上,必须手动编辑 unicharset 文件以添加这些属性描述代码。
注意 每次生成 inttemp、normproto 和 pffmtable 时,都必须重新生成 unicharset 文件(即,所有这些文件都必须在更改 Box 文件时重新创建),因为它们必须保持同步。unicharset 中的线条必须按正确的顺序排列,因为 inttemp 存储对 unicharset 的索引,并且分类器返回的实际字符来自给定索引处的 unicharset。
字典数据
Tesseract 对每种语言使用 3 个字典文件。其中两个文件被编码为有向无环字图 (DAWG),另一个是普通的 UTF-8 文本文件。要创建 DAWG 字典文件,您首先需要您语言的词表。词表格式为 UTF-8 文本文件,每行一个词。将词表分成两个集合:常用词和其他词,然后使用 wordlist2dawg
创建 DAWG 文件
wordlist2dawg frequent_words_list freq-dawg
wordlist2dawg words_list word-dawg
注意:词表必须至少包含一个词!当前不支持空文件和没有单词的字典!(你至少应该知道一个要识别的词吧。)
如果单词中总是包含一些标点符号,例如 google.com,那么最好将它们包含在字典中。
第三个字典文件称为 user-words,通常为空。
最后一个文件
Tesseract 使用的最后一个数据文件称为 DangAmbigs。它表示字符或字符集之间的内在模糊性,目前完全是手动生成的。要了解文件格式,请查看以下示例
1 m 2 r n
3 i i i 1 m
第一个字段是第二个字段中的字符数。第三个字段是第四个字段中的字符数。与其他文件一样,这是一个 UTF-8 格式文件,因此每个字符都可以由多个字节表示。第一行显示对 “rn” 的识别有时可能会错误地识别为 “m”。第二行显示字符 “m” 有时可能会错误地识别为序列 “iii” 请注意,两侧的字符都应该出现在 unicharset 中。此文件不能用于将字符从一个集合翻译到另一个集合。
DangAmbigs 文件也可能为空。
将所有内容整合在一起
就这么简单!现在您需要做的就是收集所有 8 个文件,并使用 lang.
前缀重命名它们,其中 lang 是您语言的 3 个字母代码,取自 http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes,并将它们放在 tessdata 目录中。然后,Tesseract 可以识别您语言的文本(理论上),方法是使用以下方法
tesseract image.tif output -l lang
(实际上,您可以为语言代码使用任何字符串,但如果您想让其他人也能轻松使用它,ISO 639 是最好的选择。)