怎样使用已有的工具训练Tesseract 3.03–3.05来识别新的语言

来源:互联网 发布:app 软件开发公司 编辑:程序博客网 时间:2024/06/11 02:51

本文是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方法来训练这些语言。

Google3.04版本提供了其他语言的训练数据。

Tesseract 在文字集较大的语言上运行比较慢(像中文),但是其性能还是可以接受的。

Tesseract需要通过显式地分隔不同的字体来了解相同字符的不同形状。你最多可以
Tesseract 提供64种字体。Tesseract 的运行时间与字体种类数量密切相关,如果训练
使用的字体种类超过32种时,Tesseract 的性能将会受到显著影响。


额外工具库

3.03 版本开始,组建训练工具需要额外的工具库来支持:

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

组建训练工具

3.03 版本开始,如果使用编译源码的方式来获得Tesseract,你需要使用单独的make
命令来组建和安装训练工具。当你安装了上述的额外工具库之后,在Tesseract 源码路径下执行
一下命令:

make trainingsudo 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...

必不可少的工作量

你必须通过下面的训练过程创建包括unicharsetinttempnormprotopffmtable
在内的的数据文件。如果你仅仅是尝试着去识别小范围的字体(比如单个字体的应用实例),
那么单个 训练图片就足够了。其他的数据文件可以不用创建,但是使用它们有可能提高识别的准确
率。当然 了,这都取决于你开发的应用的要求了。


训练过程

这里会尽可能地在训练过程中给大家提供自动化工具,但是一些步骤不可避免需要手动完成。下面 涉及的程序都是在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_extractorset_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.字体属性文件

现在你需要创建一个字体属性文本文件。这个文件的作用就是当识别出目标字体时,需要使用这
个文件中该字体的信息构建输出文字的字体。

属性文件中的每一行的格式为:
字体名斜体粗体固定字体衬线体哥特体
fontnameitalicboldfixedseriffraktur

fontname 为没有空格的字体名称,italicboldfixedseriffraktur
五项都是简单的布尔值,它们描述了该字体的一些属性,1表示该字体有对应的属性,0则表示没
有。例如:

timesitalic 1 0 0 1 0

描述了名为timesitalic 这种字体有斜体和衬线体。

字体属性文件将会在shapeclusteringmftraining 命令中用到。在使用mftraining
令时,*.tr 文件中的字体名称一定要与字体属性文件中的字体名称入口匹配,否则,该命令
将会终止运行。


5.聚集

当提取了所有训练图片中的文字特征时,我们需要将它们汇总起来创建原型。文字的形状特征可以
通过shapeclusteringmftrainingcntraining 三个命令来完成。

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 的文件的内部结构。

阅读全文
0 0
原创粉丝点击