1.1

Windows下 训练Tesseract实现识别图片中的文字

介绍

Tesseract是一个基于Apache2.0协议开源的跨平台ocr引擎,支持多种语言的识别,在Windows和Linux上都有良好的支持.

源代码在这:
源码地址
有一个编译打包好的Windows安装包(里面带了官方训练好的英文库):
Windows安装包下载tesseract-ocr-setup-4.00.00dev.exe
选装其它语言支持:
官方训练好的各种语言库
自己训练数据的工具jTessBoxEditorFX v2.0.1
官网是国外网站,下载速度非常慢,我打包了一个训练工具放在了CSDN(里面带了我准备的学习资源,如果你从官网下载,请自备资源):
CSDN下载
官网下载

安装配置tesseract

安装命令行工具

下载来是一个这样的自解压文件,双击安装:

需要注意的是,有一步让选择添加语言支持的,是从国外网站下载文件的,慎选(会卡很久,会卡很久,会卡很久)
安装包已经自带了英文数字识别的库,不用勾选!

配置环境变量

安装完后需要把安装目录添加到环境变量PATH里
另外:注意图中有个tessdata文件夹,这里面是放置训练结果的,之后自己训练的文件可以放到这里,如果下载别人的文件,也是放到这.
需要创建一个环境变量TESSDATA_PREFIX,内容为这个tessdata文件夹的路径.
注意:环境变量有2个操作

解压训练工具

训练工具jTessBoxEditorFX,由于是java写的,需要安装jre才能运行.

用自带的英文数字库识别图片

Tesseract提供了一个exe命令行工具,这里用这个工具来试试效果.
在训练工具的目录里,有个"学习资源"目录,里面是我准备的一些图片资源.共50张
我给每张图片编号,以及将文件内容放在了文件名里,以便于学习:

放2张预览:

在命令行输入以下命令,即可让tesseract识别图片

tesseract .\5-65000000313.tif output -l eng
type output.txt

如果这一步报错,尝试检查环境变量
其中".\5-65000000313.tif"是文件名,识别的时候支持多种图片格式,不过训练的时候要用tif,所以我这里提供的都是tif
"output"是输出文件名,tesseract的识别结果是输出为txt文件的这里指定输出文件名,程序会自动加扩展名".txt"
"-l eng"这里选择使用eng语言库
这里在识别完后用type命令读取识别结果并显示

识别效果:



这里挑选的是编号为1,5,14的三张图.
可以看到有个别文字识别失败了!
由于官方的训练数据是综合各种场景比较通用的,而我们自己的数据通常是固定项目,固定场景的,如果能自己训练一个库,那对于我们自己的项目而言,其识别率将是最高的!

训练自己的库

正如前面的演示,官方库不适合我们的学习数据,所以我们需要训练自己的数据.
tesseract提供了多种训练方法,从头开始搭建,或者在旧的库基础上去改进.
我这里做的是后者
不过有一点得说下:虽然在这里用了旧的库,但是生成新的库也只支持训练过程中有的字符,并不是说旧的库里所有字符都会加到新的库里面.

合并图片资源

首先我们得把所有图片资源合为一个,这里只支持tif格式
到jTessBoxEditorFX目录下,首先运行这个

如果你的java环境没问题的话,应该能看到这个界面

在菜单的"Tools"下,选择"Merge TIF"

接着把所有学习资源都选中,按确认,然后再选择要保存的地方.(建议选择"工作区"文件夹)

合并成功

用旧的库去生成box文件

前面说过要在旧的库基础上去训练,所以这里先用旧的库,去生成一个box文件
在工作目使用命令行执行如下命令:

tesseract 1.tif 1 -l eng makebox

"1.tif"是上一步生成的文件 后面的"1"是box的文件名,文件名要和tif文件一样,不带扩展名

然后就会生成box文件:

纠正旧的库识别错误的地方

旧的库有很多地方识别错误,所以这里要纠正它,还是那个GUI工具,切换到"Box Editor"选项卡,用"Open"打开那个tif文件:

可以看到Tesseract把旧的识别结果给显示了出来,我们需要在这里纠正它.
比如有些框的选择位置大小不对,给调整一下.
有些字符识别错误,给改改.
另外记得翻页,这里面不止一页.

啊,对了.改这个很辛苦,每次修改完一页记得点"Save"或者按"Ctrl+S"保存,不然突然停电就头疼了. 别问我为啥突然说这个 Q_Q

把全部改完后保存

生成训练结果

上一步纠正了旧的库的识别结果,接着要把它生成新的库
命令行执行这个:

makedata.bat 1

其中的"1"就是我们的tif和box的文件名,这个bat是我自己写的,如果你是从别的地方下载的训练工具jTessBoxEditorFX,是没有的,不过我会把bat的内容放在本文末尾.

界面一阵闪烁,当停下的时候,就生成了新的库

这个文件就是我们要的训练结果了.

把它改名为num.traineddata,放到tessdata目录(不知道在哪?请看前文"环境变量"那一节)
可以看到里面已经有一个eng库了,就是旧的库

试试自己训练的库效果

终于到了这一步,可以试试自己训练的库效果咋样了,还是前面那几张图:
需要注意的是,这里命令的"-l"参数后面是"num",是自己训练的那个库.

可以看到识别效果非常棒,一字不差!证明我们的训练是成功的!

附录

makedata.bat文件内容

::echo %1
move %1.box data.font.exp0.box
move %1.tif data.font.exp0.tif
echo font 0 0 0 0 0>font_properties
tesseract data.font.exp0.tif data.font.exp0 nobatch box.train
unicharset_extractor data.font.exp0.box
mftraining -F font_properties -U unicharset -O data.unicharset data.font.exp0.tr
cntraining data.font.exp0.tr
move inttemp data.inttemp
move pffmtable data.pffmtable
move normproto data.normproto
move shapetable data.shapetable
combine_tessdata data.
pause

一些命令注释:
echo font 0 0 0 0 0>font_properties
这一步生成一个文件,记录了字体的信息,font是字体名称(需要注意的是,这个"font",和前面两步设置的文件名中间得是一样的),其中5个0表示字体的粗斜属性等.如果有必要的时候可以设置下.

tesseract data.font.exp0.tif data.font.exp0 nobatch box.train
生成tr训练文件

unicharset_extractor data.font.exp0.box
生成字符集,里面包含了训练过程中遇到的字符

mftraining -F font_properties -U unicharset -O data.unicharset data.font.exp0.tr
cntraining data.font.exp0.tr
生成字典数据

combine_tessdata data.
合并训练数据

结束

本文到此结束

posted @ 2018-08-04 11:28  asml  阅读(2439)  评论(2编辑  收藏  举报
@.@