使用 Tesseract 进行文字识别

1. 安装 Tesseract、字库、jTessBoxEditor

  使用默认路径安装 Tesseract ,本文 Tesseract 版本3.0.5,安装的时候可手动勾选安装中文简体字库( chi_sim.traineddata)用于识别中文,鉴于安装页面的下载速度较慢,可在安装完 Tesseract 之后再额外下载字体,在 Tesseract 的GitHub 主页有字体大全:tesseract-ocr . 把下载的字体如chi_sim.traineddata 放到安装目录下的\tessdata\目录下。添加 Tesseract 安装根目录到环境变量。另外安装 jTessBoxEditor 用于矫正识别效果从而训练自己的一套字库。

2. 识别

  Tesseract 没有图形化界面,使用的是命令行,如需图形页面,可使用第三方集成软件.
  进入命令行,Windows下推荐使用git-bash,系统自带命令行可能找不到程序所在的path。首先cd到要识别的图片的目录下,然后输入识别命令:

tesseract 图片全名 生成的结果文件的名称 -l 字库名称

  -l表示language,后面接的是字库名称,如英文字库:eng,中文简体字:chi_sim

示例:

tesseract cardNom1.png result -l chi_sim

Tesseract识别图片命令

  使用的第一张图片如下,图片还比较简单,识别难度小:

  识别的图片

  正常运行完上述命令之后会发现目录下生成了一个result.txt文件,也就是识别结果:

  识别结果

  好吧,确实图片识别难度有点小了,完全无误差就识别出来了,在安装Tesseract-3.0.5版本之前,笔者曾使用3.0.2版本及其字体库识别同样的图片,并非能完全识别准确,例如会把数字2识别成字母z,看来更新版本的字体库识别率也更好些。

  下面换成更复杂的图片,识别率就有问题了:

  图片2:

  图片2

  图片2识别效果如下:

  效果图2

  图片3:

  图片3

  图片3识别效果如下:

  效果图3

  好吧,用身份证这种带条纹的测试数据就确实有点欺负人了。那么换成手写字体效果呢?手写字识别的等后面继续研究。先来看看Tesseract如何训练自己的字体库以期获得更高的识别准确率。下面就拿图片2 来处理。

3. 训练

(a). 生成.box文件

  因为jTessBoxEditor处理的是tif图片,所以先将jpg/png图片修改成tif格式(通过画图另存为或者直接修改后缀),然后运行以下命令生成.box文件:

tesseract 7.tif 7 -l chi_sim batch.nochop makebox

生成.box文件

  7.tif就是你的tif图片,参数7表明生成文件的文件名,请自定义,-l chi_sim还是和上面一样表示使用中文简体字库。运行上述命令后会在当前目录生成7.box文件如下:

box文件

(b). 使用jTessBoxEditor校正文字

  然后我们打开jTessBoxEditor 工具(运行根目录的train.bat文件,或直接运行jar包:java -jar jTessBoxEditor.jar),导入7.tif文件(工具会自动找到同一目录下的7.box文件)逐个校正文字:

  jTessBoxEditor

  校正完毕之后 save 一下。

(c). 生成训练文件

  接下来运行两条命令依次生成7.tr文件、unicharset文件`:

tesseract 7.png 7 nobatch box.train
unicharset_extractor 7.box

  然后在当前目录新建一个font_propertiesx新建一个font_properties文件,里面内容写入normal 0 0 0 0 0normal表示默认你训练出来的字库的名字(就像上面的chi_sim),请自定义。

  接着继续运行以下命令生成shapetable文件:

shapeclustering -F font_properties -U unicharset 7.tr

  继续敲以下命令生成inttemp文件和pffmtable文件:

mftraining -F font_properties -U unicharset -O unicharset 7.tr

  继续敲以下命令生成normproto文件:

cntraining 7.tr

  上述命令集运行输出图:

  命令集1

  命令集2

  命令集2

(d). 合并训练文件得到新字库

  好了,接下来把上面生成的unicharsetinttemppffmtableshapetablenormproto这五个文件前面都加上字库名称前缀normal.,如图:

5个文件加前缀

  然后运行以下命令合并这 5 个文件得到normal.traineddata文件,也就是我们要的训练字库:

combine_tessdata normal.

  命令6

(e). 使用新字库再次识别

  最后,把normal.traineddata复制到 Tesseract-OCR 安装目录下的tessdata文件夹中。然后用新字库再次识别7.png :

tesseract 7.png 777 -l normal

  最后得到完美的识别效果图:

  完美效果图

  

参考教程:

Tesseract-OCR识别中文与训练字库实例

tesseract-ocr训练方法

Tesseract 3 语言数据的训练方法

标签: 文字识别, Tesseract

添加新评论