如何通过训练提高Tesseract OCR验证码识别率
1. 前言
Tesseract 4.00包含一个新的基于神经网络的识别引擎,该引擎(在文档图像上)的准确率显著高于以前的版本,从而显著提高了所需的计算能力,同时神经网络需要大量的训练数据。
2. 训练过程
对于Tesseract来说,训练过程主要是以下步骤:
- Prepare training text. 准备你的训练文本
- Render text to image + box file. 将文本转为image+box文件
- Make unicharset file. 生成unicharset文件
- Optionally make dictionary data.有选择性的生成字典数据
- Run tesseract to process image + box file to make training data set. 运行tesseract来处理之前的image+box文件生成一个训练数据集合
- Run training on training data set. 在训练数据集合的基础上进行训练
- Combine data files. 合并数据文件
3. 具体操作
Step1. 获取样本数据
样本数据越多越好,格式为tif,然后将这些样本数据进行合并成一个tiff文件
可以使用jTessBoxEditor工具将多张图片合并为一张。
并按照格式[lang].[fontname].exp[num]
重命名合并后的文件。例如num.xtuz.exp0
字段说明:
- lang - 为语言名称
- fontname - 为字体名称
- num - 为序号
Step2. 创建box文件
训练数据为单行文本的tiff文件,box文件则是对应的字符结果和图像的位置信息。按如下命令生产box文件:
tesseract num.xtuz.exp0.tif num.xtuz.exp0 batch.nochop makebox
字段格式如下:
<symbol> <left> <bottom> <right> <top> <page>
字段说明:
- symbol - 识别字符
- left - 字符左坐标
- bottom - 字符底部坐标
- right - 字符右坐标
- top - 字符顶部坐标
- page - 在合成的tiff文件中的页数
如图所示:
经过和box文件内容进行比较,我们可以看到是一致的:
Step3. 定义字符配置文件
在目标文件夹内生成一个名为font_properties的文本文件,格式为<fontname> <italic> <bold> <fixed> <serif> <fraktur>
字段说明:
- fontname为字体名称
- italic为是否斜体
- bold为是否粗体,
- fixed为默认字体
- serif为衬线字体
- fraktur德文黑字体
取值分别为1和0代表有和无,精细区分时可使用
在这里,我们可以填写
xtuz 0 0 0 0 0
Step4. 字符矫正
使用jTessBoxEditor对tiff文件进行字符的校正
除此之外还可以使用其他的工具:
Name | Language | Multipage support |
---|---|---|
jTessBoxEditor | Java | yes |
QT Box Editor | C++, Qt4/Qt5 | yes |
Step5. 生成训练数据文件
tesseract.exe num.xtuz.exp0.tif num.xtuz.exp0 nobatch box.train
Step6. 生成unicharset文件
unicharset_extractor.exe num.xtuz.exp0.box
Step7. 聚类
当提取了所有训练页面的字符特征后,我们需要对它们进行聚类以创建原型。
可以使用shapecluling、mftraining、cntraining等程序对字符的形状特征进行聚类,命令如下:
shapeclustering -F font_properties -U unicharset num.unicharset num.xtuz.exp0.tr
mftraining -F font_properties -U unicharset -O num.unicharset num.xtuz.exp0.tr
cntraining.exe num.xtuz.exp0.tr
Step8. 合并文件
现在需要做的就是收集所有文件(shapetable、normproto、inttemp、pffmtable、unicharset),并用lang.prefix(例如eng.)重命名它们,然后在它们上运行combine_tessdata,如下所示:
rename unicharset num.unicharset
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
通过如下命令来合并文件
combine_tessdata num.
结果如下:
Step9. 将生成的traineddata放入tessdata中
最后将num.trainddata复制到Tesseract-OCR中tessdata文件夹就行了。
4. 验证效果
我们可以通过如下指令来进行数据验证
tesseract test.png result -l num
可以看看,是不是准确率高了很多呢
注意:
* -l num
即指明使用我们的训练数据来进行识别
* 如果想提高准确率,需要更多的样本