本文是Tesseract训练教程的翻译,有不妥的地方请大家指出,欢迎讨论,欢迎转载!
Tesseract简介
Tesseract 3.0x
是一个具备识别新的语言能力的软件,这种能力完全可以通过训练的方式
获得。本教程描述了整个训练过程,提供了一些适用于各种语言的指导原则,以及最后可以取得的
结果。
在你开始训练的工作前,请在traineddata 上确认是否3.04
版本已经提供了你所需要的语言的数据。
你也可以通过第三方训练软件工具来完成训练。
Tesseract背景及其性能限制
Tesseract
最初只是被设计用来识别英语文本的。近年来,通过努力完善和修改,该软件的OCR
引擎和训练系统已经能够处理其他语言和UTF-8
字符了。Tesseract 3.0
可以处理任
何Unicode
字符(用UTF-8
编码),但是它所适用的语言是有限的,所以请在你信心满满地开始训练你的特定语言之前,要考虑到它的适用范围这个因素!
Tesseract 3.01
可以处理从上往下书写的语言,Tesseract 3.02
可以处理从右往左做写的
Hebrew
语言。
目前,Tesseract
(3.01及以上版本)通过一种被成为cube
的辅助引擎来处理Arabic and Hindi
语言。对于4.0以前的版本,就不要用来训练Arabic
语言了,只能做无用功。(这句话同样使用与Persian, Urdu
,等语言)。4.0
版本的Tesseract
只能使用 LSTM
方法来训练这些语言。
Google
为3.04
版本提供了其他语言的训练数据。
Tesseract
在文字集较大的语言上运行比较慢(像中文),但是其性能还是可以接受的。
Tesseract
需要通过显式地分隔不同的字体来了解相同字符的不同形状。你最多可以
为Tesseract
提供64种字体。Tesseract
的运行时间与字体种类数量密切相关,如果训练
使用的字体种类超过32种时,Tesseract
的性能将会受到显著影响。
额外工具库
从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
命令来组建和安装训练工具。当你安装了上述的额外工具库之后,在Tesseract
源码路径下执行
一下命令:
make training
sudo make training-install
所需的数据文件
对一种新的语言进行训练,你需要在tessdata
的子目录下创建一些数据文件,然后使用命令
combine_tessdata
将它们合并为一个文件。为这个合并文件的命名约定为languagecode.file_name
。发布文件的languagecode
遵循ISO 639-3
标准,但你可以使用任何字符串。英文(版本3.0x
)训练使用的数据文件包括:
*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
获取目前接受的文件名列表。
输入文件的要求
输入的文本文件(lang.config
, lang.unicharambigs
, font_properties
, box files
,
wordlists for dictionaries
,…)必须满足以下标准:
*没有字节顺序标记的ASCII
或者 UTF-8
编码
*Unix
的行结束符'\n'
*最后一个字符必须是'\n'
。
有些文本编辑器会将'\n'
显示为文件结束最后的空行,如果你删除了它,程序将会报错,报错信息为:
last_char == '\n':Error:Assert failed...
必不可少的工作量
你必须通过下面的训练过程创建包括unicharset
,inttemp
,normproto
,pffmtable
在内的的数据文件。如果你仅仅是尝试着去识别小范围的字体(比如单个字体的应用实例),
那么单个 训练图片就足够了。其他的数据文件可以不用创建,但是使用它们有可能提高识别的准确
率。当然 了,这都取决于你开发的应用的要求了。
训练过程
这里会尽可能地在训练过程中给大家提供自动化工具,但是一些步骤不可避免需要手动完成。下面 涉及的程序都是在training
的子目录中组建的。
你需要在你的输入文件的目录下运行所有的命令。
1.生成训练使用的图片和Box文件
准备文件
第一步就是确定需要使用的文字集,然后准备一个包含有全体文字样本的文本文件或者word
文件。创建训练文件过程需要注意的几点:
每个文字的样本最好不少于10个,那些不常用的文字有5个样本也是可以的。而那些常用的文字的
样本最好不少于20个。
不要为了方便,人为地将文字组合在一体,训练文件需要反应真实文字的使用情况,例如:
例1:
The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.{}<>/?
例2:
The (quick) brown {fox} jumps! over the $3,456.78 <lazy> #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam?
例1中这样故意包含需要使用的文字,没有反应文字真实使用情况,特别是那些特殊的文字,如
果像例1那样,程序就不容易找到特殊文字的边界,从而影响后面的识别效果。推荐像例2这样准备文字集的样本文件。
自动生成训练字体(3.03版本)
按照上面说的那样准备包含有训练字体的UTF-8
文本文件。运行下面的命令为每个字体创建一个
匹配的tif/box
文件对,获取你想要识别的字体truetype/opentype
(可以Wiki/百科一下)字体文件。
training/text2image --text=training_text.txt --outputbase=[lang].[fontname].exp0 --font='Font Name' --fonts_dir=/path/to/your/fonts
你需要注意参数--fonts
的值中的空格,当有空格时,你需要使用单引号将字体名引起来。 (像
范例中的那样)
如果你想使用你的电脑中所有字体作为训练文本,可以这样做:
training/text2image --text=training_text.txt --outputbase=eng --fonts_dir=/usr/share/fonts --find_fonts --min_coverage=1.0 --render_per_font=false
上面这个例子中,training_text.txt
中包含有英语字母的样本,命令运行完会创建一个eng.fontlist.txt
文件。
2.使用Tesseract进行训练
在训练模式下运行Tesseract
处理每一个tif/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
在这一步中需要输入上一步准备的语言数据,但是该命令并没有
使用它。训练任何语言时,情况都是这样的。
使用第一种命令时,报错的信息会保存在tesseract.log
文件中,第二种,会保存在 stderr
文件中。
注意: 使用
tesseract
命令时,tif/box
文件对的名称一定要相同,路径一定要对,否则
会运行报错。这一步运行完成后会生成文件fontfile.tr
和[lang].[fontname].exp[num].txt
,前者包含有训练图片中每一个文字的特征,后者只包含一行
新的内容。重要: 报错报告中从
apply_box
开始检查错误,如果出现“致命错误”,那么你必须修复box文
件之后才可以继续进行训练,要不然接下来的工作会是毫无意义的。box.train.stderr
文件中出错位置会好找一些。致命错误通常表示此步骤未能找到你的box文件中列出的任何一个字体 的训练样本,这通常会是坐标或者有关字体的图像有问题。 如果没有可用的字体样本,就无法完成识别,生成的inttemp
文件将与后续生成的unicharset
文件不匹配,最终导致Tesseract
退出运行。另外一个需要注意的可能出现的重要错误是
Box file format error on line n
,如果提示的是Bad utf-8 char...
,那么UTF-8
编码有问题。如果提示的是utf-8 string too long...
,那么说明你的字符描述超过了24字节的限制。如果您需要超过24个字节的字符描述,请提交问题 。
不用去编辑[lang].[fontname].exp[num].tr
文件里面的字体名称。如果你对该文件的格式感到好奇,你可以通过这里了解。
3.产生unicharset文件
unicharset
文件中包含用于识别的单个文字的训练信息。目前,产生unicharset文件只需使用两
个命令:unicharset_extractor
和set_unicharset_properties
注意:
unicharset
文件必需与box文件同步,当box文件改变的时候,inttemp, normproto and pffmtable
文件产生时,unicharset
文件必须重新生成。
1) unicharset_extractor
Tesseract 要知道能够识别的文字集。基于上面生成的box文件,使用程序 unicharset_extractor
来生成unicharset数据文件:
unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box ...
2) set_unicharset_properties
这个工具在3.03版本中才开始有的,它可以在unicharset文件中生成新的附加特征信息,主要
是文字的类型综合信息。命令如下:
training/set_unicharset_properties -U input_unicharset -O output_unicharset
--script_dir=training/langdata
经过这两步骤,就可以生成unicharset文件了。
4.字体属性文件
现在你需要创建一个字体属性文本文件。这个文件的作用就是当识别出目标字体时,需要使用这
个文件中该字体的信息构建输出文字的字体。
属性文件中的每一行的格式为:
字体名
、斜体
、粗体
、固定字体
、衬线体
、哥特体
fontname
、italic
、bold
、fixed
、serif
、fraktur
fontname
为没有空格的字体名称,italic
、bold
、fixed
、serif
、fraktur
这
五项都是简单的布尔值,它们描述了该字体的一些属性,1表示该字体有对应的属性,0则表示没
有。例如:
timesitalic 1 0 0 1 0
描述了名为timesitalic
这种字体有斜体和衬线体。
字体属性文件将会在shapeclustering
和 mftraining
命令中用到。在使用mftraining
命
令时,*.tr
文件中的字体名称一定要与字体属性文件中的字体名称入口匹配,否则,该命令
将会终止运行。
5.聚集
当提取了所有训练图片中的文字特征时,我们需要将它们汇总起来创建原型。文字的形状特征可以
通过shapeclustering
、mftraining
和cntraining
三个命令来完成。
1) shapeclustering
除印度语外,通常不应使用shapeclustering
命令。
2) mftraining
该命令的用法为:
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
文件(形状原型)和 pffmtable
文件(每个文字对应的
特征维数)
注意:
shapeclustering
命令没有运行的情况下,命令mftraining
将生成shapetable
文件。不管有没有运行shapeclustering
命令,在traineddata
文件中必须包含shapetable
文件。
3) cntraining
该命令的用法为:
cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr ...
该命令将生成normproto
数据文件(字符归一化敏感度原型)
6.合并文件
到此已经生成了一种文字的所需的全部文件。现在我们需要将shapetable
,normproto
,
inttemp
, pffmtable
, unicharset
合并到一起。首先,需要将这5个文件的文件名前
加上lang.
前缀(例如,中文的话,chi.shapetable,chi.normproto),然后运行命令(在上
述文件和命令的路径下)combine_tessdata
:
combine_tessdata lang.
虽然给新的文字没有硬性的规定,但是还是强烈建议你的文字的名字不要少于3个字符。
运行了上面的命令,就会在运行的路径下得到一个lang.traineddata
文件,理论上Tesseract
就可以使用下面的命令来识别你的新的文字了:
tesseract image.tif output -l lang
有关命令combine_tessdata
更多的命令选项可以通过使用手册和它的源码中的注释来获取。
你也可以通过在线第三方软件traineddata_inspector分析traineddata
的文件的内部结构。