Skip to content

Instantly share code, notes, and snippets.

@Darmody
Last active November 3, 2015 20:02
Show Gist options
  • Save Darmody/978203dbfd7a1d8408cd to your computer and use it in GitHub Desktop.
Save Darmody/978203dbfd7a1d8408cd to your computer and use it in GitHub Desktop.

Tesseract Training

业务需求用到了OCR技术,Tesseract因为是开源项目又是google推的,自然成为了比较好的选择

这货国内的文档少,在网上被网友坑了几圈后决定自己留份文档看!被我坑的不要怪我咯。

直接来训练

安装配置什么的问题自行Google,我tm要直接从训练开始写!其实官方的文档差不多就够了,但是有一些典型的问题google都找不到答案。貌似这个项目没有在好好维护啊,所以还是自己来吧。

首先准备好训练集

训练集的选取是比较关键的,但我本人不是机器学习方向的,所以怎么选取也是在实践中摸索的。官方对这方面的建议是,每个字符至少要有 510个样本,常用字符要有20个以上的样本比较好。我个人认为可以先测试一大批数据,然后从中挑出识别错误的典型代表进行训练,每次训练100张图片左右,训练45次就比较ok了。注意过少或过多的训练都不太好

训练的图片在命名和格式上都有潜规则。官方中的建议命名方式为**[lang].[font].exp[num].tif**,其中lang为你训练的词库的名字,font为字体名,num为你训练的批次。可以看出官方推荐使用tif格式的图片。我是按官方推荐来做的,命名应该可以自由一些,但其他格式的图片能不能处理就不清楚了。

这里需要提一个工具,JTessBoxEditor。在训练的过程中,tesseract会生成一个box,用来描述它对本次训练中的字符的定位和识别,训练中关键的一步就是调整box文件。利用JTessBoxEditor可以很方便很直观地修改box文件。另外这个工具还提供一个tif文件合并的功能,可以大幅提升训练效率。

第一次训练

  • 执行 tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -l eng -psm 7 makebox ,就会生成一个tif文件的box训练文件。

    官网中还提到一个参数batch.nochop,个人在实践中发现不加这个参数更好,查看官网文档也没有对这个东西有很好的描述, 感觉上是“批处理并不分割图片”的意思?具体应用中还要多尝试。 这条命令中*.tif就是你要训练的文件,第二部分就是生成的box的名字,makebox就是生成box文件的参数。 -l和-psm为参数,l就是lang,为你训练的语言,一般第一次都是eng。psm是模式选择,有1~10种,我根据需求选了7,具体去官网查。

  • 利用JtessBoxEditor修改box文件。用editor打开tif图片,它根据名字会自动找到box文件。

  • 在editor里面对box文件进行调整,就是把tesseract认错的字符调整成正确地 这里调整后的box在训练的时候可能会报错,什么invalid block反正意思就是块找不到,这个时候需要重新调整下报错的区域,实在不行就忽略好了,google也没有找到很好的解释

  • 执行 tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -l eng -psm 7 box.train 对调整后的box文件进行训练 官网中训练的时候是不加参数的,但我个人感觉加上参数后效果好一些,反正加了没有影响,不加白不加。

  • 执行 unicharset_extractor lang.fontname.exp0.box 计算字符集,将会生成unicharset文件。

  • 创建font_properties文件,用来描述字体信息。注意!tesseract创建的文件都必须是utf-8编码的,详见官网 font_properties文件中的格式为 font 0 0 0 0 0,其中font为字体名,各个数值代表粗体,斜体等属性,只有0,1两个值。

  • 执行 mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr 生成shapetable和lang.unicharset文件。

  • 执行 cntraining lang.fontname.exp0.tr 生成normproto文件。

  • 通过以上步骤所需的文件都备齐了,现在把shapetable, normproto, inttemp, pffmtable文件都加上<lang.>前缀,如lang.shapetable。

  • 执行 combine_tessdata lang.生成最终文件 lang.traineddata

  • 将 lang.traineddata copy到tesseract的share/tessdata/目录下,这样就可以通过执行 tesseract -l lang test.png来识别图片啦!

第二~N次训练

后面的训练步骤与第一次基本相同,只有一些小区别:

  • 生成box文件和训练的时候指定的-l 可以为你已经生成的词库,这样就可以继续训练了。
  • 在训练成功后的步骤中,要把0~N次训练的文件全部加上,比如说:unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box ... mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...
  • 最后记得把新生成的traineddata复制到tessdata/文件夹下

References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment