问题描述:想使用tesseract识别中文,但是发现有一个字tesseract自带的库会识别错误或者不识别。比如下图的左图,其结果是“肇”变成“告”,明显是识别错了。但是如果将“肇”单独去识别,会发现根本识别不出,结果的txt文本上会是空文件。所以推断在tesseract自带的中文库中是没有训练“肇”这个字的。现在我的目的是训练一个中文识别库,希望能够识别这个“肇”字。
![]()
|
![]()
|
一 准备阶段
训练一个自己的库,需要以下工具:
- tesseract:下载链接。注意尽量还是不要下载带dev,alpha,beta等,不稳定,可能是测试版本。比如说你是64位windows系统,可以下载 tesseract-ocr-w64-setup-v5.0.0.20190623.exe。安装链接。
- java的JDK:因为编辑训练集的工具是java开发的,运行该工具需要java环境。下载链接。安装链接。
- jTessBoxEditor:下载链接。这个下载的是不需要安装的,如果你JDK安装没错的话点击train.bat文件就可以启动了。
二 训练阶段
-
配置环境:按照第一阶段的所写操作来即可。
-
准备训练数据:根据自己识别的场景,提供训练数据。这里是一个小实验,所以就训练上面图1的数据了。
-
将训练数据打包成一个tif:如果你的数据不止一个tif你可以使用jTessBoxEditor工具合并成一个tif文件。因为我这里只有一个图片,所以就不需要打包成一个文件了,图片的名字有一定命名要求的,比如可以num.font.exp0.tif,我这里命名的是myfontlab.normal.exp0.tif。使用jTessBoxEditor将多个tif文件合并成一个tif。
-
将训练数据生成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
-
用jTessBoxEditor打开tif文件,然后根据实际情况修改box文件。如下图,这提示一下,大家都应该会操作了。注意如果你有很多数据,它可能会分页,需要你逐页调整。
图3:校正数据集 -
产生字符特征文件,生成.tr文件。命令如下:
tesseract myfontlab.normal.exp0.tif myfontlab.normal.exp0 nobatch box.train
图4:生成.tr -
计算字符集,生成一个unicharset文件。命令如下:
unicharset_extractor myfontlab.normal.exp0.box
图5:生成unicharset文件 -
定义字体特征文件,新建一个font_properties文件。注意,文件的名字就是font_properties,它没有.txt后缀。
里面内容写入 normal 0 0 0 0 0 表示默认普通字体
。注意这里的normal要和myfontlab.normal.exp0.tif中的normal一样。标题 -
聚集字符特征,运行如下命令:
shapeclustering -F font_properties -U unicharset myfontlab.normal.exp0.tr
mftraining -F font_properties -U unicharset -O unicharset myfontlab.normal.exp0.tr
cntraining myfontlab.normal.exp0.tr
运行完上面的那些命令后,会有如下五个文件:
在这五个文件前加上normal.(这的normal.也应该和myfontlab.normal.exp0.tif中的normal一样)进行重命名,最后会变成如下样子:
-
合并五个文件,执行如下命令,会生成目标文件normal.traineddata,该文件就是训练好的字库。将它复制到你安装的Tesseract程序目录下的“tessdata”目录下即可。
combine_tessdata normal.
三 验证阶段
执行命令如下:
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.这个博主写的比较详细,可以看看。