天天看点

2 Tesseract-ocr 系列 : Tesseract-ocr training (训练)

关于Tesseract-ocr 训练的详细信息可以参照:

tesseract-ocr Wiki:TrainingTesseract

https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract

或者:

ubuntu下使用Tesseract-ocr(编译、安装、使用、训练新的语言库)

http://blog.csdn.net/yimingsilence/article/details/51353772

以下是执行步骤的简略版

  1. 生成训练图片: 此步结果生成 ~.tif 和 ~.box 文件。

    此步有两种方法:

    方法一:使用含有要识别字符的 text(~.txt) 文件和已在系统安装成功的字体文件(~.ttf)生成所需图片 ~.tif 和 ~ .box ;

    方法二:使用 jTessBoxEditor 直接将用作训练素材的带字体格式的图片转化为 ~.tif 格式,之后再由 ~.tif 文件生成~ .box 文件。

    这里先说方法一,方法二见另一篇博客。

    方法一: 由 ~.txt 和 ~.ttf 文件直接生成 ~.tif 和 ~.box 文件。

    a. 创建training_text.txt 文件(里面包含要识别的所有字符,且其中字符的频率与要识别的字符频率相对应,具体要求可以参照:Requirements for text input files:

    https://github.com/tesseract-ocr/tesseract/wiki/Training-Tesseract);

    b. 使用 text2train 训练工具进行训练,生成一张包含这些文字字体格式的的图片 .tif,以及字符在这张图上的位置信息 .box;

    命令格式:

    其中:

    -text:要进行训练的文本文件

    -outputbase:[lang]指定语言, [fontname]指定字体类型图,即字体名称;

    -font: 字体名称(字体文件以.ttf为扩展名)

    -fonts_dir:字体目录

如:Ubuntu系统中/usr/share/fonts/truetype/freefont/目录下有一个FreeMono.ttf字体

//执行成功会生成两个文件

eng.freemono.exp0.tif: 包含training_text.txt文字的图片文件

eng.freemono.exp0.box:文本文件,记录各字符在这个图片文件中的位置信息。

2.开始训练

训练命令为:

使用前面生成的tif及box文件就是:

//执行成功会生成两个文件: 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文件,所以有:

//执行成功会生成1个文本文件:

unicharset,正如其名字表明的,这个文件记录的是一个字符集,它存有box文件里面不重复的字符信息,每个单独字符占一行。

4.创建字体信息文件 font_properties

使用vi 手动创建 font_properties //.txt格式的文件,但是不带后缀 .txt

由于我们可以训练tesseract识别同一种语言的不同字体(这里只训练一种字体),我们需要提供字体相关的特性,这是通过一个叫做font_properties的文本文件标明的。这个文件的每一行以如下格式记录了一个字体的信息:

命令格式:

在<字体>是一个字符串命名的字体 ; <斜体>,<加粗>,<固定>,<衬线>和<哥特体>都是简单的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

// 执行成功会生成1个文本文件:shapetable,下一步的mftraining会自动在当前目录加载这个文件。

2) mftraining

//执行成功输出结果有警告,但不影响,会生成3个文件:

eng.unicharset

inttemp

pffmtable

3) cntraining

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
           
  1. 合并生成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
           

识别对象:

2 Tesseract-ocr 系列 : Tesseract-ocr training (训练)

识别结果:

2 Tesseract-ocr 系列 : Tesseract-ocr training (训练)