说明:本文参考了很多前辈的资料,主要是:tesseract-OCR3.0语言库训练步骤,再结合自己的实践操作,个人感觉官网的教程是最权威的,耐着性子看完,收获很大,比网上到处看别人理解的更好,毕竟每个人理解的都是自己的,不全面,当然也包括本文,对英文还可以的,还是推荐去官网看训练教程,呵呵
第一部分:训练前的说明
要训练一个新语言(自定义语言或者某种自然语言)对应的traineddata文件,需要产生下列过程文件:
- lang.config
- lang.unicharset //语料的所有字符
- lang.unicharambigs //取代了原来的DangAmbigs文件,手工设置的
- lang.inttemp
- lang.pffmtable
- lang.normproto
- lang.punc-dawg
- lang.word-dawg
- lang.number-dawg
- lang.freq-dawg
在这十个文件中,红色标示(共4个,都是训练过程中生成的)的是必须的,其他的文件可选。当这些文件都准备好之后,再使用combine_tessdata进行最后的合并工作,生成lang.traineddata ,这个文件就是最终训练出来语言库,他只是一些输入文件的串联,用一张表记录这与已知文件类型的偏移量。
同时lang.user-words,may still be provided separately.
>>>注释:如果你只是想识别有限的字体,比如一种字体,只需要一个单独的训练页就够了,其它的文件不需要提供,这样反而会大幅度提高准确率,当然了,这要根据你的应用决定。旧版的DangAmbigs现在已经用unicharambigs文件取代。
第二部分:训练过程
1、训练材料的准备和获得 首要要确定要用的所有字符,准备一个包含这样字符的类似Word的文档处理程序,不要使用图片进行训练,此外特别需要注意以下几点:
- 每个字符至少需要10个样本,对罕见的字符5个样本也可以
- 对高频字符至少需要20个样本
- 不要自作聪明地把字符聚集在一起,非字符聚集在一起,而是要保留其原来的样子,这样使得文本行分割程序更容易找到特殊字符的基线。
-
改进:tesseract3.03添加了自动化处理的工具:
准备一个包含训练字符的txt文件training_text.txt,然后找到你需要识别的字体文件,比如你想识别宋体的字符,就找到宋体的truetype或者opentype文件。然后运行下面的命令来创建一个tif/box文件对。
training/text2image --text=training_text.txt --outputbase=eng.TimesNewRomanBold.exp0 --font='Times New Roman Bold' --fonts_dir=/usr/share/fonts
主要到字体文件可能包含空格,所以要添加引号。更多具体的参数设置可以参考training/text2image.cpp文件。
-------------------------------------------------
此外用户还需要提供以下三个文本类型的文件:
- lang.font_properties 指示识别字体的属性,生成形状特征文件需要
- lang.frequent_words_list 保存常见的单词,每行一个,生成用户常用字字典lang.freq-dawg需要
- lang.words_list 保存所有的单词,每行一个,生成用户字典lang.word-dawg需要
- lang.unicharambigs 矫正易混淆词需要
通过以上的操作,这一步最终要得到一个*.tif格式的训练图
2、由tif图片产生相应的Box文件(*.box)
tesseract [lang].[fontname].exp[number].tif [lang].[fontname].exp[number] batch.nochop makebox
这一步产生对应的lang.fontname.exp[number].box 文件。
编辑该Box文件,校正识别出来的字符,如果单个字符识别成了两个或者多个字符,则要将这些行进行合并。前两项坐标取最小值,后两项坐标取最大值。
3、产生字符特征文件(*.tr)
tesseract [lang].[fontname].exp[number].tif [lang].[fontname].exp[number] nobatch box.train
这一步产生三个文件:
(1) tesseract.log记录该步骤执行结果;
(2) lang.fontname.exp[number].txt;
(3) lang.fontname.exp[number].tr为特征文件。
4、由*.box文件计算字符集(unicharset)
unicharset_extractor lang.fontname.exp[number].box
这一步产生字符集文件unicharset。
5、聚集字符特征(inttemp、pffmtable、normproto)
mftraining -F font_properties -U unicharset -O lang.unicharset [lang].[fontname].exp[number].tr
使用上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件lang.unicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符特征数文件pffmtable,很可能也会产生另外一个shapetabel
文件,附带还会产生Microfeat文件,但是并没有用到该文件。
其中-F参数的font_properties的设置如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
cntraining [lang].[fontname].exp[number].tr
这一步产生字符形状正常化特征文件normproto。
6、产生字典文件(可选)
wordlist2dawg工具:完成文本格式的文件到tesseract所使用的dawg格式的转变
SYNOPSIS
wordlist2dawg WORDLIST DAWG lang.unicharset
wordlist2dawg -t WORDLIST DAWG lang.unicharset
wordlist2dawg -r 1 WORDLIST DAWG lang.unicharset
wordlist2dawg -r 2 WORDLIST DAWG lang.unicharset
wordlist2dawg -l <short> <long> WORDLIST DAWG lang.unicharset
OPTIONS
-t Verify that a given dawg file is equivalent to a given wordlist.
-r 1 Reverse a word if it contains an RTL character.
-r 2 Reverse all words.
-l <short> <long> Produce a file with several dawgs in it, one each for words of length <short>, <short+1>,… <long>
ARGUMENTS
WORDLIST A plain text file in UTF-8, one word per line.
DAWG The output DAWG to write.
lang.unicharset The unicharset of the language. This is the unicharset generated by mftraining(1).
转换的文件列表:
frequent_words_list | lang.freq-dawg |
words_list | lang.word-dawg |
punc_list | lang.punc-dawg |
cube_word_list | lang.cube-word-dawg (这个用途不明) |
dawg2wordlist工具:完成tesseract所使用的dawg文件格式到文本格式的转变,使用格式是:
SYNOPSIS
dawg2wordlist UNICHARSET DAWG WORDLIST
OPTIONS
UNICHARSET The unicharset of the language. This is the unicharset generated by mftraining(1).
DAWG The input DAWG, created by wordlist2dawg(1)
WORDLIST Plain text (output) file in UTF-8, one word per line
lang.freq-dawg | frequent_words_list |
lang.word-dawg | words_list |
lang.punc-dawg | punc_list |
lang.cube-word-dawg (这个用途不明) | cube_word_list |
八个字典文件的说明:
frequent_words_list存放出现频率较高的字符;
words_list存放所有字符集,至少一个字符。每个字符占一行。这样可以产生对应语言的字典文件,共五个。
同样的方法产生punc-dawg文件(符号)、number-dawg文件(数字)以及user-words文件(用户自定义字符,通常为空)。
7、模糊字集校正文件(unicharambigs)(可选)
例如某unicharambigs文件内容如下:
2 ' ' 1 " 1
1 m 2 r n 0
3 i i i 1 m 0
每一行表示一条校正信息:第一个数字表示接下来有几个字符,第二个数字也表示后面跟有几个字符,最后一个数字表示校正动作的类型。
在这个例子中,第一行表示将连续的两个单引号(’)合并成一个双引号(”),最后的数字1表示强制转换;第二行、第三行表示一个字母m有可能被识别成两个字母’r’’n’,也有可能识别成连续三个字母’i’。
这个校正文件可以为空或者不存在。
8、合并训练文件(*.traineddata)
combine_tessdata lang.
这是最后一步,产生训练结果文件lang.traineddata。
显示结果及其含义:
- Offset for type 0 (eng.config ) is -1
- Offset for type 1 (eng.unicharset ) is 140
- Offset for type 2 (eng.unicharambigs ) is -1
- Offset for type 3 (eng.inttemp ) is 1194
- Offset for type 4 (eng.pffmtable ) is 150036
- Offset for type 5 (eng.normproto ) is 150162
- Offset for type 6 (eng.punc-dawg ) is -1
- Offset for type 7 (eng.word-dawg ) is 152264
- Offset for type 8 (eng.number-dawg ) is -1
- Offset for type 9 (eng.freq-dawg ) is 152410
- Offset for type 10 (eng.fixed-length-dawgs ) is -1
- Offset for type 11 (eng.cube-unicharset ) is -1
- Offset for type 12 (eng.cube-word-dawg ) is -1
- Offset for type 13 (eng.shapetable ) is 152436
- Offset for type 14 (eng.bigram-dawg ) is -1
- Offset for type 15 (eng.unambig-dawg ) is -1
- Offset for type 16 (eng.params-training-model ) is -1
注意这一步控制台执行的结果显示,0-9项指示了生成字典文件的地址,这十个地址对应了文章前面所提到的十项所需要的文件。其中1、3、4、5这四项(从0开始排序)是必须的,缺少一项(显示为-1)都将不算成功。
9、测试
tesseract image.tif output -l newfont
使用我们刚刚训练好的lang.traineddata文件来识别图形。识别出来的结果将会存放在output.txt文件中。
特别说明:tesseract也提出,通过使用多个语言训练库联合使用。如此,新的字体训练库也可以与原有的数据训练库联合使用。如参数 -l 之后 tesseract input.tif output -l eng+newfont。
注意事项:
在训练的过程中,初次接触的人容易犯一些小错误,这些错误虽然小,但很可能让你陷入困惑和痛苦中。下面简单的罗列一下几点需要注意的地方:
(1)前面提到的lang可以被你想要的任何字符串代替,主要是为了给你训练的库取个名字。
(2)第二步产生的Box文件,需要手动修改,一定要以Unicode模式保存。修改的时候要注意方法和含义,详细的说明Google原文中有说明。
(3)第五步程序自动产生的文件是只有扩展名的,需要你自己手动将名字改成前缀一致。后面产生的可选文件也依照此法操作。
(4)所有的这些文件都准备好了之后,需要放到同一目录下,执行combine_tessdata进行合并的时候,注意要切换到文件所在的目录执行,否则将会报错,提示找不到文件。
(5)合并成功之后,要记得将训练好的文件(lang.traineddata)放到程序的tessdata子目录下,否则测试就会提示找不到语言库文件。
对同种语言多字体的训练:
详细的多字体训练过程:同语言多字体的训练材料样例: |