使用 Tesseract 进行文字识别

2017-12-01 by Victor Lv Filed under 技术博客

1. 安装 Tesseract、字库、jTessBoxEditor

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

2. 识别

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

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

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

示例:
```bash shell
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文件:

```bash shell tesseract 7.tif 7 -l chi_sim batch.nochop makebox

![生成.box文件][9]  

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

![box文件][10]  

#### (b). 使用jTessBoxEditor校正文字

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

  ![jTessBoxEditor][11]  

  校正完毕之后 save 一下。

#### (c). 生成训练文件

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

```bash shell
tesseract 7.png 7 nobatch box.train

```bash shell unicharset_extractor 7.box

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

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

```bash shell
shapeclustering -F font_properties -U unicharset 7.tr

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

```bash shell mftraining -F font_properties -U unicharset -O unicharset 7.tr

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

```bash shell
cntraining 7.tr

  上述命令集运行输出图:

  命令集1

  命令集2

  命令集2

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

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

5个文件加前缀

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

```bash shell combine_tessdata normal.

  ![命令6][16]

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

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

```bash shell
tesseract 7.png 777 -l normal

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

  完美效果图

  

参考教程:

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

tesseract-ocr训练方法

Tesseract 3 语言数据的训练方法


本文作者为 Victor Lv ,原出处为Victor Lv's Blog(http://langlv.me),转载请保留此句。


标签 文字识别
Fork me on GitHub