TrainingTesseract2 - kana112233/tesseract GitHub Wiki
For training Neural net based LSTM Tesseract 4.00 see Training Tesseract 4.00
NOTE: These instructions are for an older version of Tesseract. Training instructions for more recent versions are here.
- 简介
- 背景和局限
- 需要数据文件
- 培训程序
- 生成训练图像
- 制作盒子文件
- 引导新的字符集
- 提供Tif/Box对!
- 运行Tesseract for Training
- 聚类
- 计算字符集
- 字典数据
- 最后一个文件
- 全部放在一起
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和用户词可以是空文件. 字典文件freq-dawg和word-dawg如果你没有单词列表就不必给出很多单词,但是如果你有一个像样的大小(英语说成千上万),准确性会低一些 字典,但至少2.04及以下,不允许空dawg文件和没有单词的dawgs.
#培训程序
一些程序不可避免地是手动的. 提供尽可能多的自动化帮助. 未来可能会出现更多自动化工具. 下面引用的工具都内置在training子目录中.
##生成培训图像
第一步是确定要使用的完整字符集,并准备包含一组示例的文本或文字处理器文件.
创建培训文件时要记住的最重要的几点是:
*确保每个字符的样本数量最少.
10很好,但5对于稀有字符是可以的.
*应该有更多频繁字符的样本 - 至少20个.
*不要错误地将所有非字母分组在一起.
使文本更真实.
例如,**快速的棕色狐狸跳过懒狗.
0123456789!@#$%^&(),..md{} <>/?很糟糕.
更好的是(快速)棕色{狐狸}跳!
超过$ 3,456.78 <lazy>
#90 dog&duck/goose,因为来自[email protected]的12.5%的电子邮件是垃圾邮件?*这使得文本行查找代码更有可能获得合理的基线指标
特殊人物.
打印时,文本稍微分开是绝对的,所以文字处理器中的字符间和行间间距要大.
在文件生成过程中,没有足够的文本间隔会导致“FAILURE!box在多行中没有重叠blob或blob”错误,导致FATALITY-0标记的样本“x”,这导致“错误:inttemp中的X类
unicharset包含Y unichars“,你不能使用你漂亮的新数据文件.
*目前训练数据需要适合单个tiff图像,但可能是多页tiff(如果你安装了libtiff).
*无需训练多种尺寸.
10分会做.
(例外情况是非常小的文本.如果要识别x高度小于约15像素的文本,您应该专门训练它或者在尝试识别它们之前缩放图像.)
- 不要在页面上混合 **(准确地说在单个.tr文件中.)这将导致在聚类时丢弃要素,这会导致识别错误. *如果您不确定如何格式化训练数据,下载页面上的示例空白文件将有所帮助.
接下来打印和扫描(或使用一些电子渲染方法)来创建训练页面的图像. 最多可以使用32个训练图像. 最好以混合字体和样式创建页面,包括斜体和粗体.
**注意:**由于间距要求,实际图像的训练实际上非常困难. 这将在未来的版本中得到改进. 现在,如果您可以打印/扫描自己的培训文本,则会更容易.
您还需要将训练图像保存为UTF-8文本文件,以便在必须将代码插入另一个文件的下一步中使用.
澄清大量培训数据
32个图像限制是** FONTS的数量.**每个字体可以放在一个多页tiff **(只有你使用libtiff!)**并且可以修改box文件以指定 坐标后每个字符的页码. 因此,可以为任何给定字体创建任意大量的训练数据,从而允许训练大字符集语言. 多页tiff的替代方法是为单个字体创建许多单页tiff,然后必须将每种字体的tr文件合并为几个单字体tr文件. 在任何情况下,mftraining的输入tr文件必须包含单个字体,并且给予mftraining的订单文件必须与它们给unicharset \ _extractor的顺序相匹配.
##制作盒子文件
对于下面的下一步,Tesseract需要一个“盒子”文件来与每个训练图像一起使用. 盒子文件是一个文本文件,按顺序列出训练图像中的字符,每行一个,带有图像周围边界框的坐标. Tesseract 2.0有一种模式,它将输出所需格式的文本文件,但如果字符集与其当前训练不同,则自然会使文本不正确. 所以这里的关键过程是手动编辑文件以在其中放入正确的字符.
Run Tesseract on each of your training images using this command line:
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都有一个字符映射,可用于复制无法键入的字符. 在这种情况下,你需要改为Ã.
理论上,box文件中的每一行都应该代表训练文件中的一个字符,但是如果你有一个横向破坏的字符,比如较低的双引号,它可能有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字符最多有4个字节来编码,而哑编辑器会分别显示所有字节 .
编辑框文件有几种可视化工具 - 请检查AddOns wiki.
###引导一个新的字符集
If you are trying to train a new character set, it is a good idea to put in the effort on a single font to get one good box file, run the rest of the training process, and then use Tesseract in your new language to make the rest of the box files as follows:
tesseract fontfile.tif fontfile -l yournewlanguage batch.nochop makebox
This should make the 2nd box file easier to make, as there is a good chance that Tesseract will recognize most of the text correctly. You can always iterate this sequence adding more fonts to he training set (i.e. to the command line of mfTraining and cnTraining below) as you make them, but note that there is no incremental training mode that allows you to add new training data to existing sets. This means that each time you run mfTraining and cnTraining you are making new data files from scratch from the tr files you give on the command line, and these programs cannot take an existing intproto/pffmtable/normproto and add to them directly.
###提供Tif/Box对!
Tif/Box文件对位于下载页面上. (注意tiff文件是G4压缩的
为了节省空间,所以你必须先拥有libtiff或解压缩它们. 你可以
按照以下流程为您自己的语言制作更好的培训数据
现有语言的子集,或者为现有语言添加不同的字符/形状: 1.过滤盒子文件,仅保留所需字符的行. 1.运行tesseract进行培训(如下). 1.为每种字体捕获多种语言的.tr文件,以获取所需的字符集,并从您自己的字体或字符中添加.tr文件. 1.以与.tr文件相同的方式捕获过滤后的盒子文件,以便传递给unicharset \ _extractor. 1.运行剩余的培训过程.
警告! 这并不像听起来那么简单! 只能进行训练和训练
最多需要32个.tr文件,所以你必须捕获来自多种语言的所有文件
相同的字体一起制作32种语言组合,但字体个别文件.
tr文件中找到的字符**必须与序列匹配
当给予unicharset \ _extractor时,在box文件中找到的字符,所以你必须这样做
以与tr文件相同的顺序**将盒子文件一起捕获.
cn/mftraining和unicharset \ _extractor的命令行必须给出.tr
和.box文件(分别)在相同的顺序以防万一你有不同
过滤不同的字体.
可能有一个程序可以完成所有这些并选择中的字符
人物地图的风格. 这可能会使整个事情变得更容易.
##运行Tesseract进行培训
For each of your training image, boxfile pairs, run Tesseract in training mode:
tesseract fontfile.tif junk nobatch box.train
要么
tesseract fontfile.tif junk nobatch box.train.stderr
第一种形式将所有错误发送到tesseract.log(在所有平台上),就像在Windows 2.03及更低版本上一样. 使用box.train.stderr,所有错误都会在所有平台上发送到stderr,就像它在2.03及更低版本的非Windows平台上一样.
请注意,框文件名必须与tif文件名匹配,包括路径,否则Tesseract将无法找到它.
此步骤的输出是fontfile.tr
,其中包含训练页面的每个字符的功能.
另请注意,输出名称是从输入图像名称派生的,而不是正常的输出名称,此处显示为“junk”.
junk.txt也将使用一个换行符而不是文本.
重要检查apply \ _box输出中的错误. 如果报告了FATALITIES,那么在您修复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文件格式错误表示边界框整数有问题,或者可能是框文件中的空白行. 空行实际上是无害的,在这种情况下可以忽略错误. 它们可以被代码忽略,但是如果盒子文件出现无意的错误,它们不会忽略它们.
There is no need to edit the content of the fontfile.tr file. The font name inside it need not be set. For the curious, here is some information on the format:
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,则表示该属性为true.
位排序是(从最低有效位到最高有效位):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文件(即,当更改盒文件时,它们必须全部重新创建),因为它们必须同步. unicharset中的行必须按正确的顺序排列,因为inttemp将索引存储到unicharset中,并且分类器返回的实际字符来自给定索引处的unicharset.
##字典数据
Tesseract为每种语言使用3个字典文件.
其中两个文件被编码为有向非循环字图(DAWG),另一个是纯UTF-8文本文件.
要制作DAWG词典文件,首先需要一个适合您语言的词汇表.
wordlist格式化为UTF-8文本文件,每行一个单词.
将wordlist拆分为两组:频繁的单词,其余的单词,然后使用wordlist2dawg
来制作DAWG文件:
wordlist2dawg frequent_words_list freq-dawg
wordlist2dawg words_list word-dawg
注意:单词列表必须至少包含一个单词!空文件和没有单词的词典目前不支持! (当然,你知道至少有一个词需要被认可.)
如果单词总是有一些标点符号,比如google.com,那么将它们包含在字典中是个好主意.
第三个字典文件称为用户词,通常为空.
##最后一个文件
Tesseract使用的最终数据文件称为DangAmbigs. 它表示字符或字符集之间的内在歧义,目前完全是手动生成的. 要了解文件格式,请查看以下示例:
1 m 2 r n
3 i i i 1 m
第一个字段是第二个字段中的字符数. 第3个字段是第4个字段中的字符数. 与其他文件一样,这是一个UTF-8格式文件,因此每个字符可以用多个字节表示. 第一行显示对'rn'有时可能被错误地识别为'm'. 第二行显示字符'm'有时可能被错误地识别为序列'iii'
请注意,双方的字符应出现在unicharset中. 此文件不能用于将字符从一个集合转换为另一个集合.
DangAmbigs文件也可能为空.
#把它们放在一起
That is all there is to it! All you need to do now is collect together all 8 files and rename them with a lang.
prefix, where lang is the 3-letter code for your language taken from http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes and put them in your tessdata directory. Tesseract can then recognize text in your language (in theory) with the following:
tesseract image.tif output -l lang
(实际上,您可以使用任何您喜欢的字符串作为语言代码,但如果您希望其他任何人能够轻松使用它,那么ISO 639就是您的选择.)