Tesseract训练

提高识别准确率

Posted by Xiaosheng on December 18, 2015

在文章《通过Tesseract实现简单的OCR》中我提到过,Tesseract 在识别英语以外的语言时,普遍识别正确率较低。特别是像中文这种象形文字,识别的效果就更差了。所以我们必须要先通过训练再来使用 Tesseract。

关于如何训练样本,Tesseract-OCR官网有详细的介绍http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。现在我通过一个非常简单的例子来介绍一下如何进行样本训练。

直接使用 Tesseract 识别

现在我有两张图片 1.png2.png,描绘着两个不常见的汉字字符 丿,字体我使用苹果公司的苹方字体:

hz1

hz2

现在通过 Tesseract 识别,这时必须使用 -psm 选项,否则识别结果为空。

tesseract 1.png out1 -l chi_sim -psm 10
tesseract 2.png out2 -l chi_sim -psm 10

打开 out1.txtout2.txt,识别出的结果为 “勺”“J”。很明显都不对。

接下来我们进行训练。

训练样本

先将两张图片转换成 tif 格式,再使用 jTessBoxEditor 工具(需要安装好java环境)将两张图片合并为一张(菜单栏 Tools → Merge TIFF)。并按照格式 [lang].[fontname].exp[num] 重命名合并后的文件,这里我命名为 hz.font.exp0

Make Box Files

直接使用 Tesseract 识别,生成 box 文件:

tesseract hz.font.exp0.tif hz.font.exp0 -l chi_sim -psm 10 batch.nochop makebox

使用前面提过的 jTessBoxEditor 工具编辑生成的 box 文件(确保 tif 和 box 文件同名且位于同一目录下,用 jTessBoxEditor 打开 tif 文件),或者直接用文本编辑器编辑。

box1

box2

很容易看到,识别出的字符就位于 box 文件的第一列,如果训练样本非常多,可以用程序自动地修改。这里只有两个,直接手工改为 “勹”“丿”

Run Tesseract for Training

使用刚才修改正确后的 box 文件,对 Tesseract 进行训练,生成 .tr 文件:

tesseract hz.font.exp0.tif hz.font.exp0 -psm 10 nobatch box.train

Compute the Character Set

unicharset_extractor hz.font.exp0.box

此步骤生成一个 unicharset 文件

font_properties (new in 3.01)

定义字体特征文件,Tesseract-OCR 3.01 以上的版本在训练之前需要创建一个名称为 font_properties 的字体特征文件。font_properties 不含有 BOM 头,文件内容格式如下:

<fontname> <italic> <bold> <fixed> <serif> <fraktur>

其中 fontname 为字体名称,必须与 [lang].[fontname].exp[num].box 中的名称保持一致。<italic><bold><fixed><serif><fraktur> 的取值为 1 或 0,表示字体是否具有这些属性。

我这里就是普通字体,不倾斜不加粗,所以新建一个名为 font_properties 的文件,内容为:

font 0 0 0 0 0

Clustering

三个命令:

shapeclustering -F font_properties -U unicharset hz.font.exp0.tr
mftraining -F font_properties -U unicharset -O hz.unicharset hz.font.exp0.tr
cntraining hz.font.exp0.tr

手工修改 Clustering 过程生成的 4 个文件(inttemp、pffmtable、normproto、shapetable)的名称为 [lang].xxx。例如我这里改为 hz.inttemphz.pffmtablehz.normprotohz.shapetable

Putting it all together

生成语言文件:

combine_tessdata hz.

combine

需确认打印结果中的 Offset 1、3、4、5、13 这些项不是 -1。这样,一个新的语言文件就生成了。

hz.traineddata 便是最终生成的语言文件,将生成的 hz.traineddata 文件拷贝到 tessdata 目录下,就可以用它来进行字符识别了。

使用训练后的语言库识别

重新制作一张图片,包含 “勹” 和 “丿” 两个字符,这里提供了一张图片 test.png

test

使用我们刚才生成的语言库识别:

tesseract test.png out -l hz

可以看到,正确地识别出来了:

result

注意一点,现在生成的语言库中只包含我给定的这两个字符,即识别出的结果只能在这两个字符中选。

参考资料

《Tesseract-OCR 字符识别—样本训练》

《Tesseract-OCR 3.02 训练笔记》