使用tesseract训练自己的字库提高识别率

        问题描述:想使用tesseract识别中文,但是发现有一个字tesseract自带的库会识别错误或者不识别。比如下图的左图,其结果是“肇”变成“告”,明显是识别错了。但是如果将“肇”单独去识别,会发现根本识别不出,结果的txt文本上会是空文件。所以推断在tesseract自带的中文库中是没有训练“肇”这个字的。现在我的目的是训练一个中文识别库,希望能够识别这个“肇”字。

图1:待识别的图片

 

图2:结果

 

一 准备阶段

         训练一个自己的库,需要以下工具:

  1. tesseract:下载链接。注意尽量还是不要下载带dev,alpha,beta等,不稳定,可能是测试版本。比如说你是64位windows系统,可以下载  tesseract-ocr-w64-setup-v5.0.0.20190623.exe。安装链接。
  2. java的JDK:因为编辑训练集的工具是java开发的,运行该工具需要java环境。下载链接。安装链接。
  3. jTessBoxEditor:下载链接。这个下载的是不需要安装的,如果你JDK安装没错的话点击train.bat文件就可以启动了。

二 训练阶段

  1. 配置环境:按照第一阶段的所写操作来即可。

  2. 准备训练数据:根据自己识别的场景,提供训练数据。这里是一个小实验,所以就训练上面图1的数据了。

  3. 将训练数据打包成一个tif:如果你的数据不止一个tif你可以使用jTessBoxEditor工具合并成一个tif文件。因为我这里只有一个图片,所以就不需要打包成一个文件了,图片的名字有一定命名要求的,比如可以num.font.exp0.tif,我这里命名的是myfontlab.normal.exp0.tif。使用jTessBoxEditor将多个tif文件合并成一个tif。

  4. 将训练数据生成box格式:
    如果你训练的是数字或者是英文字库,可以使用如下语法

    【语法】:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  
    【语法】:lang为语言名称,fontname为字体名称,num为序号;在tesseract中,一定要注意格式

    比如训练数字,可以使用如下命令:

    tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

    训练中文,可以使用如下命令:注意-l是英文字母l,不是数字1。

    tesseract myfontlab.normal.exp0.tif myfontlab.normal.exp0 -l chi_sim batch.nochop makebox

     

  5. 用jTessBoxEditor打开tif文件,然后根据实际情况修改box文件。如下图,这提示一下,大家都应该会操作了。注意如果你有很多数据,它可能会分页,需要你逐页调整。
     

    使用tesseract训练自己的字库提高识别率_第1张图片 图3:校正数据集

     

  6. 产生字符特征文件,生成.tr文件。命令如下:

    tesseract myfontlab.normal.exp0.tif myfontlab.normal.exp0 nobatch box.train
    使用tesseract训练自己的字库提高识别率_第2张图片 图4:生成.tr

     

  7. 计算字符集,生成一个unicharset文件。命令如下:

    unicharset_extractor myfontlab.normal.exp0.box
    图5:生成unicharset文件

     

  8. 定义字体特征文件,新建一个font_properties文件。注意,文件的名字就是font_properties,它没有.txt后缀。里面内容写入 normal 0 0 0 0 0 表示默认普通字体。注意这里的normal要和myfontlab.normal.exp0.tif中的normal一样。

    使用tesseract训练自己的字库提高识别率_第3张图片

     

    使用tesseract训练自己的字库提高识别率_第4张图片 标题

     

     

  9. 聚集字符特征,运行如下命令:

    shapeclustering -F font_properties -U unicharset myfontlab.normal.exp0.tr

    使用tesseract训练自己的字库提高识别率_第5张图片

    mftraining -F font_properties -U unicharset -O unicharset myfontlab.normal.exp0.tr

    使用tesseract训练自己的字库提高识别率_第6张图片

    cntraining myfontlab.normal.exp0.tr

    运行完上面的那些命令后,会有如下五个文件:
     

    使用tesseract训练自己的字库提高识别率_第7张图片

    在这五个文件前加上normal.(这的normal.也应该和myfontlab.normal.exp0.tif中的normal一样)进行重命名,最后会变成如下样子:

    使用tesseract训练自己的字库提高识别率_第8张图片

     

  10. 合并五个文件,执行如下命令,会生成目标文件normal.traineddata,该文件就是训练好的字库。将它复制到你安装的Tesseract程序目录下的“tessdata”目录下即可。

    combine_tessdata normal.

    使用tesseract训练自己的字库提高识别率_第9张图片

    使用tesseract训练自己的字库提高识别率_第10张图片

     

三 验证阶段

执行命令如下:

tesseract test.png testT1 –l normal

左边是待识别的图片,中间是tesseract自带中文识别库识别的结果,右边自己训练的库识别的结果。 

 

 

 

 

 

 

其他问题的一些总结:

1.执行生成box文件时,出现empty page!!时,可以尝试使用--psm 10等参数。详情可以通过运行tesseract --help。不过需要注意,当使用--psm等参数时,在后续的生成.tr文件时也需要使用--psm参数一起执行。

2.在多次训练中出现了“other case a of A is not in unicharset”的错误,目前来说还不清楚是什么原因。

3.这个博主写的比较详细,可以看看。

你可能感兴趣的:(数据处理,图像处理)