文章目录
  1. 1. 介绍
  2. 2. 背景及局限性
  3. 3. 所需的附加库
  4. 4. 建立训练工具
  5. 5. 所需的数据文件
    1. 5.1. 文本输入文件的要求
    2. 5.2. 你可以忽略哪些?
  6. 6. 训练过程
    1. 6.1. 生成训练图片
    2. 6.2. 自动方式-创建tif/box文件
    3. 6.3. 手动方式-创建tif/box文件
      1. 6.3.1. 获取tif图像
      2. 6.3.2. 生成box文件
      3. 6.3.3. 引导新的字符集
      4. 6.3.4. tif/box文件要一一对应
    4. 6.4. 运行tesseract进行训练
    5. 6.5. 计算字符集
      1. 6.5.1. set_unicharset_properties(3.03版本新增)
    6. 6.6. font_properties(3.01版本新增)
    7. 6.7. 聚类
    8. 6.8. 字典数据(可选)
    9. 6.9. 最后一个文件(unicharambigs)
    10. 6.10. 合并所有文件

这是关于如何使用Tesseract3训练新的语言的文档,该文档是tesseract-ocr官方wiki上翻译过来的。

介绍

Tesseract3.0x是支持训练的。这篇文章描述如何训练的过程,提供适用于各种语言的一些指导方针,以及训练会得到的结果。对于Tesseract2.0x的训练参考:TrainingTesseract.

背景及局限性

Tesseract原来仅仅为了识别英文而设计的。我们做了许多努力来使得识别引擎及训练系统能够应对不同语言及UTF-8字符。Tesseract3.0能够处理任意的UTF-8字符,但是还是只能对部分的语言成功处理,因此在期望Tesseract能够对你的特定语言处理前,你要注意下这个细节。

Tesseract3.01添加了从上到下排列的语言,Tesseract3.02添加了希伯来语(Hebrew)(从右到左排列)。现在Tesseract可以使用一个辅助引擎(称为cube)来应对类似阿拉伯语(Arabic)的文本。

Tesseract对于大量字符集的语言(如中文)训练/识别缓慢(译者注:由于字符集非常大,增加了训练/匹配时间),但是也能够正常工作。

Tesseract需要了解一个字符的形状,通过将不同字体明确分开。之前对字体数量限制在32个,现在增加到了64个。这个可以通过intproto.h中常量MAX_NUM_CONFIGS 进行设置。注意运行时间很大程度上依赖于字体数量,如果训练字体数量大于32将会非常缓慢。

如果训练的语有不一样的标点及数字,会不利于一些硬编码的算法,在这些算法中,都假设是ASCII字符集中的标点及数字。这个局限在3.0x(x>=2)版本中已经修改。

你需要在你的输入文件路径下运行所有的命令行。

所需的附加库

从3.03版本开始,需要一些附加库用来建立你的训练工具:

sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev

建立训练工具

从3.03版本开始,如果你从源码编译Tesseract,你需要另外使用make命令来安装训练工具:

make training
sudo make training-install

所需的数据文件

为了训练另一种语言,需要在tessdata子目录下创建一些数据文件,然后在使用combine_tessdata把这些文件合并成单个文件。命名约定为:languagecode.file_name,Language codes最好按照ISO639-3标准。English对应的训练依赖文件(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

仍然可以单独提供。合并的traineddata只是简单的将输入文件串联,通过一个列表目录记录已知的文件类型的偏移量。可以查看源码ccutil/tessdatamanager.h中当前接受的文件名。注意traindata中包含的文件和3.00版本之前的已经不同。并且可能在今后的修订中大幅修改。

文本输入文件的要求

文本输入文件(如lang.config, lang.unicharambigs, font_properties, box files, wordlists for dictionaries…)需要满足以下条件:

  • 没有BOM的ASCII或者UTF-8字符
  • Unix下的行结束符(‘\n’)
  • 文件结束符为行结束符(‘\n’).否则会提示错误信息“ast_char == ‘\n’:Error:Assert failed…”

你可以忽略哪些?

unicharset, inttemp, normproto, pfftable这些文件是一定要创建的。如果你只要识别相似或一个字体,那么一个简单的训练也就够了。其他的文件不太需要,但是可以帮助提高精度,这要看你的需求了。老版的DangAmbigs已经被unicharambigs替代。

训练过程

尽管已经有很多自动化的过程,但是有些步骤还是得手动。以后可能会有更多的自动化工具,但是需要一些复杂的安装过程。下面这些工具都是在训练子目录下自带的。

生成训练图片

首先确定需要的字符集,然后准备一个保护这些字符的文本。在创建训练文件时需要牢记以下几点:
+确保每个字符有最低的样本数,10个的话很好,对于稀少的字符5个也OK。

  • 对于常用的字符需要更多的样本——至少20个。
  • 对于标点和字符要打散。比如“The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.{}<>/?”这样就很差。最好是类似这样排列:“The (quick) brown {fox} jumps! over the $3,456.78 #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam?”这样可以让textline finding代码对于特殊字符更好的找到baseline.

自动方式-创建tif/box文件

准备UTF-8的字符文本(training_text.txt)包含你所需要的字符。获取你想要识别的字符字体(trueType(微软和Apple公司共同研制的字型标准)或者是其他字体)。对于每一种字体运行下面的命令行,创建对应的tif/box文件:

training/text2image –text=training_text.txt –outputbase=[lang].[fontname].exp0 –font=’Font Name’ –fonts_dir=/path/to/your/fonts

注意参数–font可以包含空格,因此必须加上引号,例如:

training/text2image –text=training_text.txt –outputbase=eng.TimesNewRomanBold.exp0 –font=’Times New Roman Bold’ –fonts_dir=/usr/share/fonts


text2image还有许多其他命令行参数,可以查看traning/text2image.cpp获取更多信息。

如果你的应用可以使用text2image,非常好!你可以直接跳到6.4运行tesseract进行训练

手动方式-创建tif/box文件

获取tif图像
  • 在打印文本时需要凸出空格,因此在文本编辑器中就需要增大字符间距及行间距。不充足的空格距离可能导致生成*.tr文件时弹出“FAILURE! box overlaps no blobs or blobs in multiple rows”错误信息,而这又会导致另一个错误————某个字符”x”没有样本,然后弹出“”Error: X classes in inttemp while unicharset contains Y unichars”,这样的训练数据就不能用了。以后我们会解决这种问题,但是3.00的版本还是会出现这种情况。
  • 训练文件应该要以字体区分。理想的情况是单一字符的所有样本都在同一个tiff图像中,但这样可能需要多页tiff(如果你安装了libtiff或者是leptonica),这样单一的字体中包含的训练数据可能有很多页并且包含成千上万的字符,同时允许对大字符集语言进行训练。
  • 不要再一个图像文件中混淆字体这会导致聚类时特征的丢失,从而导致识别错误。

下一步就是打印并扫描图像,用来创建你的训练页。最多支持64个训练页。最好创建包含斜体及黑体的混合的字体及样式(但是要在不同的文件中)。

注意对真实图像进行训练有点困难,这是由于间隔宽度的要求。这在今后的版本中会得到改善。

同时你需要保存一份包含训练文本的UTF-8的文件,在后面的步骤中将会用到。

对于大量的训练数据说明.64个图片是对字体个数的限制。每个字体应该放在单一的多页tiff文件中,并且box文件可以对指定页码的字符坐标修改。因此对于给定字体可以创建任意数量的训练数据,也运行对大字符集语言进行训练。对于一个字体,也可以用多个单页tiff文件来代替多页tiff文件, and then you must cat together the tr files for each font into several single-font tr files.不管如何,输入给mftraining的tr文件,必须各自包含单个字体。

生成box文件

下一步,Tesseract对每个训练图像需要一个’box’文件。box文件是一个文本文件,按序排列了训练图片的字符及字符的外包矩形框坐标。Tesseract3.0有一个模式可以生成所需格式的box文件,然后你需要手动编辑这个box文件,使得正确的字符和位置能够对应。

对每个训练图片运行如下命令行:

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的输出box文件(第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的编辑器就够了,HTML编辑器是个不错的选择(linux下的Mozilla可以直接编辑UTF-8文本,Firefox和IE浏览器则不支持)。MS的Word支持不同的字符编码,Notepad++也支持。Linux和Windows都有一个字符列表用来拷贝不能手打的字符。如用ü代替u。

理论上,每一行都只有一个字符。但是在水平方向上分离的一个字符,可能被单成两个,例如下双引号“„”,你需要合并这两个box:例如,第116-229行:

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

注意2,3列表示左上角坐标lefttop,4,5列表示右下角坐标rightbottom,最后一列是对应的多页tiff图像中的页码。坐标系以图上左上角为原点。合并后的结果:

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

已经有许多个可视化Box编辑器,请点击AddOns wiki.

引导新的字符集

如果你训练的是全新的字符集,你可以先使用一种字体来获取box文件,再运行下面的训练步骤生成一个traindata,然后再使用Tesseract处理其他的字体的box文件:

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


这样能提高你的box文件中的字符正确率,减少编辑。你可以用这种方法来增加新的字体,但是要注意没有一种训练模式可以在已有的traindata中添加新的训练数据。这意味着每一次你运行mfTraining和cnTraining都是从你提供的tr文件创建一个新的数据文件,并不可以直接在现有的intproto/pffmtable/normproto中直接添加。

tif/box文件要一一对应

一些tif/box文件可以在下载页面下载。(注意tif文件经过G4压缩,要使用libtiff进行解压缩)。你可以按照下面操作获取更好的训练数据:

    1. 过滤box文件,保留你想要的字符行。
    1. 运行tesseract进行训练(后面介绍)。
    1. 在多种语言中获取你想要字符的每种字体的tr文件,并且添加你自己的字体或者字符。
    1. 以相同的方式获取已过滤的box文件到.tr文件中,以便在unicharset_extractor中处理。
    1. 进行剩余的训练过程。

注意!这没有想象的那么简单!(cntraining and mftraining can only take up to 64 .tr files, so you must cat all the files from multiple languages for the same font together to make 64 language-combined, but font-individual files. The characters found in the tr files must match the sequence of characters found in the box files when given to unicharset_extractor, so you have to cat the box files together in the same order as the tr files. The command lines for cn/mftraining and unicharset_extractor must be given the .tr and .box files (respectively) in the same order just in case you have different filtering for the different fonts. There may be a program available to do all this and pick out the characters in the style of character map. This might make the whole thing easier)

跳转到的地方

运行tesseract进行训练

对每一对训练图片和box文件,运行下面命令行:

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.log中。第二个命令行会在stderr中输出。

注意box文件名和tif文件名要相同,并且在相同路径下,否则Tesseract会找不到。输出文件为fontfile.tr,这个文件保护训练页中每个字符的特征。[lang].[fontname].exp[num].txt will also be written with a single newline and no text.

重要的是检查apply_box输出中是否有错误。如果存在FATALITIES报告,那么没有必要继续训练过程指导你修复了box文件。新的box.train.stderr配置文件让输出的定位变得更简单。一个FATALITY通常提示当前步骤在你的box文件中寻找某个字符的训练样本时失败。不是坐标错了,就是图片中对应字符图片出错了。如果一个字符不存在可以操作的样本,它就不能被识别,生产的inttemp文件也不会匹配unicharset文件,Tesseract将中止。

另一个可能出现的错误也是致命的——“Box file format error on line n”。If preceded by “Bad utf-8 char…” then the utf-8 codes are incorrect and need to be fixed. The error “utf-8 string too long…” indicates that you have exceeded the 24 byte limit on a character description. If you need a description longer than 24 bytes, please file an issue.

没有必要对[lang].[fontname].exp[num].tr文件的内容进行编辑。下面是tr文件的一些格式:

Every character in the box file has a corresponding set of entries in
the .tr file (in order) like this
UnknownFont 2
mf
x y length dir 0 0
… (there are a set of these determined by
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需要知道它tractor可以输出的字符集。为了生成unicharset数据文件,使用unicharset_ex程序处理box文件:

unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box …


Tesseract访问字符的属性:isalpha, isdigit, isupper, islower, ispunctuation。该数据而可以以unicharset的数据形式被编码。每一行对应一个字符。UTF-8的后面是表示二进制掩码编码性质的十六进制数。每个bit表示一个属性。如果bit设置为1,表示该属性为真。这些为按顺序排列(从最低位到最高位): isalpha, islower, isupper, isdigit, ispunctuation。

例子:

  • “;”是标点,它的属性表示为10000(0x10)。
  • “b”是字母表中的小写字符,它的属性表示为00011(0x3)。
  • “W”属性为00101(0x5)。
  • “7”属性为01000(0x8)。
  • “=”既不是标点也不是字母,属性为00000(0x0)。

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

中文和日文的字符也在最低位表示,如00001(0x1)。

如果你的系统支持宽字符处理函数,这些值都将通过unicharset_extractor自动设置,没有必要自己编辑。老的系统(如Windows95)可能要手动编辑。

注意unicharset文件必须在inttemp, normproto和pffmtable生成时重新生成(换言之,这些文件在box文件改变时必须重新创建)。

最后两列表示脚本类型(Latin, Common, Greek, Cyrillic, Han, null)和给定语言的字符编码。

set_unicharset_properties(3.03版本新增)

在3.03中新的工具和数据文件可以用来添加额外的属性,大部分是字符的大小:

training/set_unicharset_properties -U input_unicharset -O output_unicharset –script_dir=training/langdata

font_properties(3.01版本新增)

在3.01中训练过程需要font_properties文件。这个文件的目的是提供字体信息,以便在识别出来的结果中给出字体信息。font_properties是通过mftraining的-F filename选项处理的文本文件。

font_properties每一行的格式为:

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

其中<fontname>是一个字符串(不能有空格),其他<italic> <bold> <fixed> <serif> <fraktur>都是以0,1标记,表示该字体是否有该属性。

当运行mftraining时,每个.tr文件名必须对应一个font_properties文件,否则将中止。

例子:
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中,training/langdata/font_properties是默认的font_properties文件,包含3000个字体(不一定需要)。

聚类

当所有的训练页中的字符特征已将被提取,我们需要对它们进行聚类。字符形状可以通过 shapeclustering (3.02版本后允许), mftraining and cntraining programs程序进行聚类:

shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …

shapeclustering通过形状聚类创建一个主字形表,并且写入文件-shapetable。

注意:如果你没有运行shapeclustering,mftraining也会产生一个shapetable.你必须在你的traindata中包含这个shapetable,不管shapeclustering是否运行过。

mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …

-U 文件表示由上面的unicharset_extractor生成的unicharset,lang.unicharset是输出文件,提供给combine_tessdata处理。mftraining会输出另外两个数据文件:inttemp(字符形状原型the shape prototypes)和pffmtable(每个字符期望的特征个数the number of expected features for each character)。(另外一个文件Microfeat也会生成,但是没有用。)

cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr …


这个生成normproto数据文件(字符归一化敏感度原型the character normalization sensitivity prototypes)。

字典数据(可选)

Tesseract为每个语言最多使用8个字典文件。它们都是可选的,用来帮助Tesseract不同字符组合的可能性。

有7个文件编码为Directed Acyclic Word Graph(DAWG),另一个是简单的UTF-8文本:

为了生成DAWG字典文件,你首先需要你所训练语言的单词表。你可以从拼写检查中发现一个合适的字典(如ispell, aspell和hunspell)————注意license。单词表用UTF-8的格式表示的话一个单词一行。把单词量拆成需要的集合,如:频繁出现的单词,剩余的单词,然后使用wordlist2dawg用来生成DAWG文件:

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.
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 dawg 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).

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

注意如果合并的traindata中包含字典,字典不能为空。

如果你需要字典的例子文件,解压(通过combine_tessdata)已有的语言文件(如eng.traineddata)并且使用dawg2wordlist提取单词表。

最后一个文件(unicharambigs)

这个文件描述了字符之间的模糊集。通常都是手动生成。为了理解格式,查看以下示例:

v1
2 ‘ ‘ 1 “ 1
1 m 2 r n 0
3 i i i 1 m 0


第一行是一个版本标识符。下面的行以tab制表符分割,使用下面的格式:


type indicator可以有下面的值:

Value Type
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中有包含。就是说,这些字符都应该是训练语言的一部分。

3.03版本支持新的更简单的格式:

v2
‘’ “ 1
m rn 0
iii m 0


其中1表示强制,0表示可选。

unicharambigs文件也是可选的。

合并所有文件

全部情况就这样!现在你只需要合并所有的文件(shapetable, normproto, inttemp, pffmtable),用相同的前缀重命名它们,如lang.,这里的lang是3个字符码,对于你要训练的语言名字,可以在 http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes中找到对应的。然后运行combine_tessdata:

combine_tessdata lang.

注意:不要忘记最后一个点!
结果的lang.traineddata在你的tessdata目录中。然后你就可以用你训练的语言识别文本了:

tesseract image.tif output -l lang

更多的选项请请参考combine_tessdata的手册或者源码。

文章目录
  1. 1. 介绍
  2. 2. 背景及局限性
  3. 3. 所需的附加库
  4. 4. 建立训练工具
  5. 5. 所需的数据文件
    1. 5.1. 文本输入文件的要求
    2. 5.2. 你可以忽略哪些?
  6. 6. 训练过程
    1. 6.1. 生成训练图片
    2. 6.2. 自动方式-创建tif/box文件
    3. 6.3. 手动方式-创建tif/box文件
      1. 6.3.1. 获取tif图像
      2. 6.3.2. 生成box文件
      3. 6.3.3. 引导新的字符集
      4. 6.3.4. tif/box文件要一一对应
    4. 6.4. 运行tesseract进行训练
    5. 6.5. 计算字符集
      1. 6.5.1. set_unicharset_properties(3.03版本新增)
    6. 6.6. font_properties(3.01版本新增)
    7. 6.7. 聚类
    8. 6.8. 字典数据(可选)
    9. 6.9. 最后一个文件(unicharambigs)
    10. 6.10. 合并所有文件