这货国内的文档少,在网上被网友坑了几圈后决定自己留份文档看!被我坑的不要怪我咯。
安装配置什么的问题自行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
来识别图片啦!
后面的训练步骤与第一次基本相同,只有一些小区别:
- 生成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/文件夹下