Title: 使用 Tesseract 进行文字识别
Date: 2017-12-1 17:49
Category: 技术博客
Modified: 2017-12-1 17:49
Tags: 文字识别
Slug: Tesseract
Authors: Victor Lv
Summary: 使用 Tesseract 进行文字识别
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到要识别的图片的目录下,然后输入识别命令:
tesseract 图片全名 生成的结果文件的名称 -l 字库名称
-l表示language,后面接的是字库名称,如英文字库:eng,中文简体字:chi_sim。
示例:
tesseract cardNom1.png result -l chi_sim

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

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

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

图片2识别效果如下:

图片3:

图片3识别效果如下:

好吧,用身份证这种带条纹的测试数据就确实有点欺负人了。那么换成手写字体效果呢?手写字识别的等后面继续研究。先来看看Tesseract如何训练自己的字体库以期获得更高的识别准确率。下面就拿图片2 来处理。
3. 训练
(a). 生成.box文件
因为jTessBoxEditor处理的是tif图片,所以先将jpg/png图片修改成tif格式(通过画图另存为或者直接修改后缀),然后运行以下命令生成.box文件:
tesseract 7.tif 7 -l chi_sim batch.nochop makebox

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

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

校正完毕之后 save 一下。
©. 生成训练文件
接下来运行两条命令依次生成7.tr文件、unicharset文件`:
tesseract 7.png 7 nobatch box.train
unicharset_extractor 7.box
然后在当前目录新建一个font_propertiesx新建一个font_properties文件,里面内容写入normal 0 0 0 0 0, normal表示默认你训练出来的字库的名字(就像上面的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
上述命令集运行输出图:



(d). 合并训练文件得到新字库
好了,接下来把上面生成的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件前面都加上字库名称前缀**normal.**,如图:

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

(e). 使用新字库再次识别
最后,把normal.traineddata复制到 Tesseract-OCR 安装目录下的tessdata文件夹中。然后用新字库再次识别7.png :
tesseract 7.png 777 -l normal
最后得到完美的识别效果图:
