OCR-光学字符识别之训练Tesseract3字库图文详解

时间:2022-01-08 08:17:25

训练Tesseract3字库可以提高Tesseract对特定字库的识别率。本文记录了我训练字库的详细步骤,字库训练完成后在Tesseract-OCR中成功调用,另外也记录了我在训练Tesseract3字库中遇到的问题点以及相应的解决方案。

       1.训练Tesseract3字库准备工作

       1.1 下载并安装Tesseract-OCR,我用的版本是Tesseract-OCR-3.02.02,下载地址http://tesseract-ocr.googlecode.com/files/tesseract-ocr-setup-3.02.02.exe(该链接已失效,tesseract的源码已搬迁至Github)

       1.2 下载jTessBoxEditor,解压缩后点击jTessBoxEditor.jar即可使用。jTessBoxEditor运行需要java的环境,因此需要到官网下载并安装Java Runtime Environment,下载链接太长,这里就不贴了。

       1.3 准备好待训练的字符图片。

       2.训练Tesseract3字库的详细步骤

       2.1 合并字符图片

       jTessBoxEditor处理的是TIF格式的图片,所以如果待训练的字符图片不是tif格式的,我们需要手动将图片格式修正为tif。网络上很多攻略都说通过jTessBoxEditor菜单栏中Tools–>Merge TIFF可以将多张tif图片合并为一个文件,不过我用jTessBoxEditor合并时报错”Could’t seek!”,目前原因未知。

       我使用的合并工具是TiffToy-v2.01。如果是20张图片,合并后会成为一个文件,该文件有1~20页分别对应1~20页图片,不是将这20张图片合并在同一张图片上哦。

      2.2 打开cmd.exe,定位到合并图片所在路径,生成BOX文件

      google对tesseract-ocr训练得到的字库文件有相应的命名规则,详细介绍可以参考https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3#Putting_it_all_together。

      tesseract [lang].[fontname].exp[num].tif[lang].[fontname].exp[num] batch.nochop makebox

      其中lang为语言名称,fontname为字体名称,num为序号,这些字串并不一定要有其实际的意义。例如,我的字库图片名称为en.font.exp0.tif,生成box文件的命令行如下:

      tesseract.exe en.font.exp0.tif en.font.exp0 batch.nochop makebox

      2.3 用jTessBoxEditor校正字符

       运行jTessBoxEditor,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录)。如下图所示,可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正,校正完成后保存即可。

OCR-光学字符识别之训练Tesseract3字库图文详解

     2.4 生成字符特征文件(*.tr)

     tesseract en.font.exp0.tif en.font.exp0 nobatch box.train

OCR-光学字符识别之训练Tesseract3字库图文详解   

     2.5 产生计算字符集

     unicharset_extractor en.font.exp0.box

OCR-光学字符识别之训练Tesseract3字库图文详解

     2.6 定义字体特征文件并聚集字符特征

     在同一目录下新建一个名称为”font_properties”的txt文档,输入“font 0 0 0 0 0”并保存,删除“.txt”后缀。注意:这里font必须与训练名中”fontname”位置所在名称保持一致,这里全取值为0,表示字体不是粗体,斜体等等。

     mftraining -F font_properties -U unicharset en.font.exp0.tr

OCR-光学字符识别之训练Tesseract3字库图文详解

     2.7 生成字符形状正常变化特征文件normproto

     cntraining en.font.exp0.tr

OCR-光学字符识别之训练Tesseract3字库图文详解

     2.8 为unicharset,inttemp,normproto,pffmtable,shapetable添加前缀”font.”

OCR-光学字符识别之训练Tesseract3字库图文详解

      2.9 合并训练文件

      combine_tessdata font.

OCR-光学字符识别之训练Tesseract3字库图文详解

      2.10 调用新的字库进行识别

      将新生成的font.traindata文件拷贝到tesseract-OCR安装路径中的tessdata目录下,即可调用新的字库来进行识别,假设待识别图片与tessract-OCR在同一路径下,识别命令如下:

      tesseract en.font.exp0.tif result -1 font

      3.训练Tesseract3字库遇到的问题点与解决方案

      训练Tesseract3字库步骤比较繁琐,若手动输入各种命令,其中任何一个环节出错都会导致余下的步骤出错。建议大家在正式开始训练之前,将所有的命令行按照自己的命名规则整理在一个文档上,然后依次拷贝到命令行中。

      3.1 调用字库时出错:Tesseract Open Source OCR Engine v3.02 with Leptonica index >= 0 && index < size_used_:Error:Assert failed

      这个是因为我在第2.8步中未将shapetable添加前缀,合并时虽然没有出错,但是调用新的字库时报错。第2.8步中5个文件均需要加前缀,缺一不可。

      3.2 调用字库时报错:read params file:can’t open font

      在调用新的字库时,命令行中”tesseract en.font.exp0.tif result -l font”的”l”是字母”L”的小写,而不是数字”1″。