关于Tesseract-ocr 训练的详细信息可以参照:
tesseract-ocr Wiki:TrainingTesserac
或者:
ubuntu下使用Tesseract-ocr(编译、安装、使用、训练新的语言库)
以下是执行步骤的简略版
- 生成训练图片: 此步结果生成 ~.tif 和 ~.box 文件。
此步有两种方法:
方法一:使用含有要识别字符的 text(~.txt) 文件和已在系统安装成功的字体文件(~.ttf)生成所需图片 ~.tif 和 ~ .box ;
方法二:使用 jTessBoxEditor 直接将用作训练素材的带字体格式的图片转化为 ~.tif 格式,之后再由 ~.tif 文件生成~ .box 文件。
这里先说方法一,方法二见另一篇博客。
方法一: 由 ~.txt 和 ~.ttf 文件直接生成 ~.tif 和 ~.box 文件。
a. 创建training_text.txt 文件(里面包含要识别的所有字符,且其中字符的频率与要识别的字符频率相对应,具体要求可以参照:Requirements for text input files:
vi training_text.txt
b. 使用 text2train 训练工具进行训练,生成一张包含这些文字字体格式的的图片 .tif,以及字符在这张图上的位置信息 .box;
命令格式:
text2image -text=training_text.txt -outputbase=[lang].[fontname].exp0 -font='Font Name' -fonts_dir=/path/to/your/fonts
其中:
-text:要进行训练的文本文件
-outputbase:[lang]指定语言, [fontname]指定字体类型图,即字体名称;
-font: 字体名称(字体文件以.ttf为扩展名)
-fonts_dir:字体目录
如:Ubuntu系统中/usr/share/fonts/truetype/freefont/目录下有一个FreeMono.ttf字体
text2image -text=training_text.txt -outputbase=eng.freemono.exp0 -font=FreeMono –fonts_dir=/usr/share/fonts/truetype/freefont/
//执行成功会生成两个文件
eng.freemono.exp0.tif: 包含training_text.txt文字的图片文件
eng.freemono.exp0.box:文本文件,记录各字符在这个图片文件中的位置信息。
2.开始训练
训练命令为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train.stderr
使用前面生成的tif及box文件就是:
tesseract eng.freemono.exp0.tif eng.freemono.exp0 box.train.stderr
//执行成功会生成两个文件: eng.freemono.exp0.tr:前者对应于box文件中各字符在tif图片文件中的形状信息,记录的方式实际上是将一个字符看成是一个多边形,而tr文件记录的就是多边形每条边的位置、方向、长度等信息。
eng.freemono.exp0.txt:后者只有一些换行符。 // 在我的环境中没有发现该文件,因为以后的步骤中不会用到,所以没有影响。
3.生成字符集信息
需要用到一个叫unicharset_extractor的训练工具。
命令格式:
unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box …
前面只生成了1个box文件,所以有:
unicharset_extractor eng.freemono.exp0.box
//执行成功会生成1个文本文件:
unicharset,正如其名字表明的,这个文件记录的是一个字符集,它存有box文件里面不重复的字符信息,每个单独字符占一行。
4.创建字体信息文件 font_properties
使用vi 手动创建 font_properties //.txt格式的文件,但是不带后缀 .txt
由于我们可以训练tesseract识别同一种语言的不同字体(这里只训练一种字体),我们需要提供字体相关的特性,这是通过一个叫做font_properties的文本文件标明的。这个文件的每一行以如下格式记录了一个字体的信息:
命令格式:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
在<字体>是一个字符串命名的字体 ; <斜体>,<加粗>,<固定>,<衬线>和<哥特体>都是简单的0或1标志指示字体是与否的属性。
本文的训练中使用了名为FreeMono的字体,因此font_properties里面需要有一行以FreeMono开头的字体信息。
除了手动创建这个文件外,tesseract-ocr源码中也提供了一个这样的font_properties文件(training/langdata/font_properties), 并且里面已经有了很多字体的信息,因此这里就不许要手动创建了,后面的步骤要用的这个文件的时候,直接指定使用这个文件就行了。源代码中的font_properties文件关于FreeMono字体的信息是:
FreeMono 0 0 1 1 0
5.聚合
shapeclustering, mftraining及cntraining的用法
命令格式:
shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr …
1) shapeclustering
shapeclustering -F font_properties -U unicharset eng.freemono.exp0.tr
// 执行成功会生成1个文本文件:shapetable,下一步的mftraining会自动在当前目录加载这个文件。
2) mftraining
mftraining -F font_properties -U unicharset -O eng.unicharset eng.freemono.exp0.tr
//执行成功输出结果有警告,但不影响,会生成3个文件:
eng.unicharset
inttemp
pffmtable
3) cntraining
cntraining eng.freemono.exp0.tr
6.文件重命名:
将前面生成的几个文件(包括shapetable, normproto, inttemp, pffmtable) 更名为以lang.开头的文件(在这里,就是以eng.开头,比如eng.shapetable, eng.normproto等等)
mv inttemp eng. inttemp
mv normproto eng.normproto
mv pffmtable eng.pffmtable
mv shapetable eng.shapetable
- 合并生成traineddata文件
然后执行以下命令将它们合并成一个traineddata文件(eng.traineddata)
combine_tessdata eng.
//执行成功会生成1个文本文件: eng.traineddata
8.将生成的lang.traineddata 文件拷贝到系统中 ~/tessdata/目录下.
如我的tessdata目录为: /usr/local/share/tessdata/
sudo cp /local/path/eng.traineddata /usr/local/share/tessdata/
训练完毕,可以用以上步骤生成的 eng.traineddata 来进行识别。
需要注意的是,根据本文的训练生成的traineddata只能识别本文最初创建的training_data.txt中存在的字符,并且只能识别字体与FreeMono接近的文字。
9.测试
如我自己进行训练生成的语言文件定义为 lang=num1 则有:
tesseract invoice2b.jpg invoice2bnum1 -l num1
识别对象:
识别结果: