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
最后得到完美的识别效果图: