如何通过训练提高Tesseract OCR验证码识别率

1. 前言

Tesseract 4.00包含一个新的基于神经网络的识别引擎,该引擎(在文档图像上)的准确率显著高于以前的版本,从而显著提高了所需的计算能力,同时神经网络需要大量的训练数据。

2. 训练过程

对于Tesseract来说,训练过程主要是以下步骤

  1. Prepare training text. 准备你的训练文本
  2. Render text to image + box file. 将文本转为image+box文件
  3. Make unicharset file. 生成unicharset文件
  4. Optionally make dictionary data.有选择性的生成字典数据
  5. Run tesseract to process image + box file to make training data set. 运行tesseract来处理之前的image+box文件生成一个训练数据集合
  6. Run training on training data set. 在训练数据集合的基础上进行训练
  7. 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 即指明使用我们的训练数据来进行识别 * 如果想提高准确率,需要更多的样本

展开剩余53%