Training Tesseract 3.00–3.02 - kana112233/tesseract GitHub Wiki


For training Neural net based LSTM Tesseract 4.00 see Training Tesseract 4.00


###如何使用提供的工具来训练Tesseract 3.00-3.02获取新语言?

NOTE: These instructions are for older versions of Tesseract. Training instructions for the more recent versions are here.

介绍

Tesseract 3.0x完全可以训练. 此页面描述了培训过程,提供了有关各种语言适用性的一些指导原则,以及对结果的期望.

第三方培训工具也可用于培训.

在开始培训之前,请检查自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版本提供了其他语言的Traineddata.

使用大字符集语言(如中文),Tesseract速度较慢,但​​似乎工作正常.

Tesseract需要通过明确分隔不同的字体来了解相同字符的不同形状. 字体数限制为64种字体. 请注意,运行时在很大程度上取决于提供的字体数量,超过32的训练将导致显着减慢.

对于3.00/3.01版本,任何具有不同标点符号和数字的语言都会因某些采用ASCII标点符号和数字的硬编码算法而处于不利地位. [已于3.02修正]

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

#需要数据文件

要训​​练另一种语言,你必须在tessdata子目录中创建一些数据文件,然后使用combine_tessdata将它们拼凑成一个文件. 命名约定是languagecode.file_name已发布文件的语言代码遵循ISO 639-3标准,但可以使用任何字符串. 用于英语(3.00)的文件是:    *tessdata/eng.config    *tessdata/eng.unicharset    *tessdata/eng.unicharambigs    *tessdata/eng.inttemp    *tessdata/eng.pffmtable    *tessdata/eng.normproto    *tessdata/eng.punc-dawg    *tessdata/eng.word-dawg    *tessdata/eng.number-dawg    *tessdata/eng.freq-dawg

......最后的嘎吱嘎吱的文件是:    *tessdata/eng.traineddata

和    *tessdata/eng.user-words

可能仍然是单独提供的.

训练的数据文件只是输入文件的串联,其中的目录包含已知文件类型的偏移量. 请参阅源代码中的ccutil/tessdatamanager.h以获取当前接受的文件名列表. 注意 trainingdata文件中的文件与3.00之前使用的列表不同,很可能会在将来的修订中发生变化.

##文本输入文件的要求

文本输入文件(lang.config,lang.unicharambigs,font \ _properties,box文件,字典的单词列表......)需要满足以下条件:    *没有[BOM]的ASCII或UTF-8编码(http://en.wikipedia.org/wiki/Byte_order_mark)   

  • Unix 行尾标记('\ n')    *最后一个字符必须是行结束标记('\ n'). 某些文本编辑器会在文件末尾将其显示为空行. 如果省略此项,您将收到包含“last \ _char =='\ n'的错误消息:错误:断言失败...”

##你有多少可以逃脱?

你必须**使用下面描述的程序创建unicharset,inttemp,normproto,pffmtable. 如果您只想识别有限范围的字体(例如单个字体),那么单个培训页面就足够了. 其他文件不再需要提供,但很可能会提高准确性,具体取决于您的应用程序.

#培训程序

一些程序不可避免地是手动的. 提供尽可能多的自动化帮助. 下面引用的工具都内置在training子目录中.

##生成培训图像

第一步是确定要使用的完整字符集,并准备包含一组示例的文本或文字处理器文件. 创建培训文件时要记住的最重要的几点是:    *确保每个字符的样本数量最少. 10很好,但5对于稀有字符是可以的.    *应该有更多频繁字符的样本 - 至少20个.    *不要错误地将所有非字母分组在一起. 使文本更真实. 例如,**快速的棕色狐狸跳过懒狗. 0123456789!@#$%^&(),.{}<>/?很糟糕. 更好的是(快速)棕色{狐狸}跳! 超过$ 3,456.78< lazy> #90 dog&duck/goose,因为来自[email protected]的12.5%的电子邮件是垃圾邮件?**这使得文本行查找代码更有可能获得特殊字符的合理基线指标.   

  • [仅与版本3.00相关,在3.01中修复]有时在打印时稍微分隔文本是很重要的,因此文字处理器中的字符间和行间间距要大. 在文件生成过程中,没有足够的文本间隔会导致“FAILURE!box在多行中没有重叠blob或blob”错误,导致FATALITY-0标记的样本“x”,这导致“错误:inttemp中的X类 unicharset包含Y unichars“,你不能使用你漂亮的新数据文件.    *训练数据应按字体分组. 理想情况下,单个字体的所有样本都应该放在一个tiff文件中,但这可能是多页tiff(如果你安装了libtiff或leptonica),所以单个字体的总训练数据可能是多页和很多10s 成千上万的字符,允许训练大字符集语言.    *无需训练多种尺寸. 10分会做. (例外情况是非常小的文本.如果要识别x高度小于约15像素的文本,您应该专门训练它或者在尝试识别它们之前缩放图像.)   
  • 不要混合图像文件中的(准确地说是在单个.tr文件中.)这将导致在聚类时丢弃要素,这会导致识别错误.    *如果您不确定如何格式化训练数据,下载页面上的示例空白文件将有所帮助.

接下来打印和扫描(或使用一些电子渲染方法)来创建训练页面的图像. 最多可以使用64个培训文件(多个页面). 最好创建混合的字体和样式(但在单独的文件中),包括斜体和粗体.

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

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

澄清大量培训数据

64个图像的限制是** FONTS的数量.**每个字体应放在一个多页tiff中,并且可以修改box文件以指定坐标后每个字符的页码. 因此,可以为任何给定字体创建任意大量的训练数据,从而允许训练大字符集语言. 多页tiff的替代方法是为单个字体创建许多单页tiff,然后必须将每种字体的tr文件合并为几个单字体tr文件. 在任何情况下,mftraining的输入tr文件都必须包含单个字体.

##制作盒子文件

对于下面的下一步,Tesseract需要一个“盒子”文件来与每个训练图像一起使用. 盒子文件是一个文本文件,按顺序列出训练图像中的字符,每行一个,带有图像周围边界框的坐标. Tesseract 3.0有一种模式,它将输出所需格式的文本文件,但如果字符集与其当前训练不同,则自然会使文本不正确. 所以这里的关键过程是手动编辑文件以在其中放入正确的字符.

Run Tesseract on each of your training images using this command line:

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

e.g.

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都有一个字符映射,可用于复制无法键入的字符.

示例:第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 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 [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -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.运行剩余的培训过程.

警告! 这并不像听起来那么简单! 只能进行训练和训练

最多需要64个.tr文件,所以你必须捕获来自多种语言的所有文件

相同的字体一起制作64种语言组合,但字体个别文件.

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 [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文件之前,没有必要继续进行培训. 新的box.train.stderr配置文件使得更容易选择输出的位置. 致命性通常表示此步骤未能找到您的方框文件中列出的某个字符的任何训练样本. 坐标是错误的,或者有关人物的形象有问题. 如果没有可用的字符样本,则无法识别,并且生成的inttemp文件稍后将与unicharset文件不匹配,并且Tesseract将中止.

可能发生的另一个错误也是致命的并且需要注意是关于“行n上的Box文件格式错误”的错误. 如果前面有“Bad utf-8 char ...”,则UTF-8代码不正确,需要修复. 错误“utf-8 string too long ...”表示您已超过字符描述的24字节限制. 如果您需要超过24个字节的说明,请提出问题.

无需编辑[lang].[fontname] .exp [num] .tr文件的内容. 其中的字体名称无需设置.

对于好奇,这里有一些关于格式的信息. box文件中的每个字符在.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

mf特征是轮廓的多边形段,归一化为

第一和第二时刻.

x = x位置[-0.5,0.5]

y = y位置[-0.25,0.75]

length是多边形段的长度[0,1.0]

dir是段的方向[0,1.0]

cn功能用于校正当前归一化的时刻

区分位置和大小(例如c vs C和vs')

##计算字符集

Tesseract需要知道它可以输出的可能字符集. 要生成unicharset数据文件,请在上面生成的box文件中使用unicharset_extractor程序:

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

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

例:

*';' 是一个标点字符. 因此,其属性由二进制数10000(十六进制10)表示.    *'b'是字母字符和小写字符. 因此,其属性由二进制数00011(十六进制3)表示.    *'W'是字母字符和大写字符. 因此,其属性由二进制数00101(十六进制的5)表示.    *'7'只是一个数字. 因此,其属性由二进制数0100​​0(十六进制的8)表示.    *'='不是标点符号,不是数字或字母字符. 因此,其属性由二进制数00000(十六进制的0)表示.

; 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文件以添加这些属性描述代码.

最后两列表示脚本的类型(拉丁语,普通语,希腊语,西里尔语,汉语,NULL)和给定语言的字符的id代码.

**注意:每当生成inttemp,normprotopffmtable时,必须重新生成unicharset文件(即,当更改框文件时,它们必须重新创建),因为它们必须 同步.

font \ _properties(3.01中的新内容)

对3.01中的训练的新要求是font_properties文件. 此文件的目的是提供在识别字体时将出现在输出中的字体样式信息. font_properties文件是由-F filename选项指定为mftraining的文本文件.

Each line of the font_properties file is formatted as follows:

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

where <fontname> is a string naming the font (no spaces allowed!), and <italic>, <bold>, <fixed>, <serif> and <fraktur> are all simple 0 or 1 flags indicating whether the font has the named property.

运行mftraining时,每个.tr文件名必须与font_properties文件中的条目匹配,否则mftraining将中止. 在某些时候,可能在3.01发布之前,这个匹配要求很可能转移到.tr文件本身的字体名称. .tr文件的名称可以是fontname.tr[lang].[fontname] .exp [num] .tr.

例:

font_properties file:

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](https: //raw.githubusercontent.com/tesseract-ocr/langdata/master/font_properties).

##聚类

当提取了所有训练页面的角色特征时,我们需要将它们聚类以创建原型.

可以使用shapeclustering,mtrarainingcntraining程序对字符形状特征进行聚类:

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”的第三个文件,但未使用它. 更高版本不会生成此文件.

注意:如果你没有运行shapeclustering,mftraining会生成shapetable文件. 你必须在训练有素的数据文件中包含这个shapetable,无论是否使用了shapeclustering.

cntraining

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

这将输出normproto数据文件(字符规范化灵敏度原型).

##字典数据(可选)

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

其中七个文件被编码为有向非循环字图(DAWG),另一个是纯UTF-8文本文件:

Name Type Description
word-dawg dawg A dawg made from dictionary words from the language.
freq-dawg dawg A dawg made from the most frequent words which would have gone into word-dawg.
punc-dawg dawg A dawg made from punctuation patterns found around words. The "word" part is replaced by a single space.
number-dawg dawg A dawg made from tokens which originally contained digits. Each digit is replaced by a space character.
fixed-length-dawgs dawg Several dawgs of different fixed lengths —— useful for languages like Chinese. [Not used since version 3.03]
bigram-dawg dawg A dawg of word bigrams where the words are separated by a space and each digit is replaced by a ?.
unambig-dawg dawg TODO: Describe.
user-words text A list of extra words to add to the dictionary. Usually left empty to be added by users if they require it; see tesseract(1).

要制作DAWG词典文件,首先需要一个适合您语言的词汇表. 您可以找到一个合适的字典文件,用作拼写检查器中词表的基础(例如ispell,[aspell] (http://aspell.net/)或[hunspell](http://hunspell.sourceforge.net/)) - 小心许可证. wordlist格式化为UTF-8文本文件,每行一个单词. 将单词列表拆分为需要的集合,例如:常用单词和其余单词,然后使用wordlist2dawg制作DAWG文件:

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

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

其他选项可以在[wordlist2dawg手册页]中找到(https://github.com/tesseract-ocr/tesseract/blob/master/doc/wordlist2dawg.1.asc)

**注意:**如果组合的训练数据中包含字典文件,则必须包含至少一个条目. combine_tessdata步骤不需要原本为空的字典文件.

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

如果您需要字典单词列表的示例文件,请取消组合(使用combine \ _tessdata)现有语言数据文件( 例如eng.traineddata)然后用dawg2wordlist提取wordlist

##最后一个文件(unicharambigs)

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

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

The first line is a version identifier. The remaining lines are tab separated fields, in the following format:

<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>

类型指示符可能以下值:

Value Type Description
0 A non-mandatory substitution. This informs tesseract to consider the ambiguity as a hint to the segmentation search that it should continue working if replacement of 'source' with 'target' creates a dictionary word from a non-dictionary word. Dictionary words that can be turned to another dictionary word via the ambiguity will not be used to train the adaptive classifier.
1 A mandatory substitution. This informs tesseract to always replace the matched 'source' with the 'target' strings.
Example line Explanation
2 ' ' 1 " 1 A double quote (") should be substituted whenever 2 consecutive single quotes (') are seen.
1 m 2 r n 0 The characters 'rn' may sometimes be recognized incorrectly as 'm'.
3 i i i 1 m 0 The character 'm' may sometimes be recognized incorrectly as the sequence 'iii'.

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

规则不是双向的,因此如果你想在检测到'm'时考虑'rn',反之亦然,你需要为每个规则做一个规则.

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

unicharambigs格式也在unicharambigs(5)手册页中描述.

unicharambigs文件也可能不存在.

#把它们放在一起

That is all there is to it! All you need to do now is collect together all the files (shapetable, normproto, inttemp, pffmtable) 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 then run combine_tessdata on them as follows:

combine_tessdata [lang].

注意:最后不要忘记点!

The resulting lang.traineddata goes 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就是您的选择.)

更多combine_tessdata的选项可以在手册页或其评论[源代码]中找到 ](https://github.com/tesseract-ocr/tesseract/blob/master/training/combine_tessdata.cpp#L23).

您可以在第三方在线Traineddata inspector中检查一些训练有素的数据文件的内部结构.

⚠️ **GitHub.com Fallback** ⚠️