tesseract 训练-

来源:互联网 发布:linux系统和ubuntu 编辑:程序博客网 时间:2024/04/28 01:44
关于tesseract-ocr3的训练和使用 众所周知,这是一个出色的字符识别软件。这个开源项目可以在http://code.google.com/p/tesseract-ocr/downloads/list下载。 

在使用时,建议使用3而不要使用2,因为一些原因,2虽然可以直接用在工程,但是由于一些显而易见的BUG和其他原因,多导致程序无法运行甚至崩溃。所以建议使用命令行版本的3 。 

除了下载tesseract安装程序以外,还可以在下载页面下载一些语言库,当然,也可以在安装过程中选择一些语言库来进行安装。 



一、训练 

在很多时候,默认的字库等完全可以高准确度的识别,但是有些时候我们需要训练自己的库来使用。训练步骤如下: 

注: 

A、均以DOS命令为例,即将每步下面的命令保存为.BAT运行,或运行CMD进入tesseract所在目录运行 

B、注意保证文件名的一致性(此处均为DDT) 

0、复制training目录下的全部文件到tesseract3所在目录 

copy .\training\*.exe .\ 

1、标记边框 

tesseract ddt.tif ddt -l eng digits batch.nochop makebox 

解释一下 

ddt.tif为要识别的文件,支持jpg,gif,tiff等格式,建议用tif 

ddt 为要保存的文件名(自动添加扩展名.box) 

-l eng 使用的库,这个参数可以让我们选择用哪个字库来标记边框 

后面的都是配置文件了,也就是tesseract的其他参数被以文件形式加载,而不是直接输入参数 

digits指定了只识别0-9的数字(当然你可以编辑它,使它包含更多的字符),当你不需要指定时,一定要去掉这个参数,但使用这种字符集限定,可以最大程度上减少被错误识别搞的你编辑ddt.box头昏脑胀的几率。 

注: 

这一步非常关键,但也经常出现问题,即使你在http://code.google.com/p/bbtesseract/downloads/list下载了bbtesseract也是如此,所以我感觉应该自己编一个边框识别,但没有时间做。完全可以将命令写入到软件里,实现图形化。所以,注意编辑你生成的ddt.box文件,保证字符都被识别且边框正确。 

这里也有一个小技巧,例如我做过这样一个tif:1.2-34567089,在这一步的时候,只识别了2-9这一部分,于是我修改tif为:001.2-34567089,就全部识别了。也许可以给你一些启示。 

2、形成语言库 

tesseract ddt.tif ddt -l eng digits nobatch box.train 
unicharset_extractor ddt.box 
rename unicharset ddt.unicharset 
mftraining -U unicharset -O ddt.unicharset ddt.tr 
rename inttemp ddt.inttemp 
rename pffmtable ddt.pffmtable 
rename Microfeat ddt.Microfeat 
cntraining ddt.tr 
rename normproto ddt.normproto 
combine_tessdata ddt. 

这里面包含了若干步骤,但其他人扒的“教程”已经啰嗦很多了,不再啰嗦。 

注:那几个rename是必要的,因为生成的文件只有扩展名。只要注意了这些,就没问题了。 

3、测试语言库 

copy ddt.traineddata .\tessdata\ddt.traineddata 

tesseract ddt.tif ddt -l ddt 
notepad ddt.txt 

如果测试失败了,你应该检查: 

A、是否tif宽度太小,如果是,我建议你在下面增加一行,就是说把1行改成2行,增加什么呢,随意增加一些你字库里面的字符,但最好和图像一样宽。 

B、如果还没正确识别,回头仔细检查你的ddt.box 





如果你失败了,记得清理前面生成的文件,可以使用一下命令: 

copy ddt.tif tmp.tif 
del ddt.* /f /s 
copy tmp.tif ddt.tif 
del tmp.tif 

然后从第一步重新来过。 



二、使用 

使用时,只需要注意,对于单行并且字符数较少的图像,如果不识别,最好是在下面添加一行无用行,并保证该行基本达到图像宽。 

注: 

在使用时,可能会发生找不到字库的情况(尤其当你卸载后重装tesseract时),此时,应修改 

HKEY_CURRENT_USER\Environment\TESSDATA_PREFIX的值为你的tesseract所在目 

在代码的new函数中,我修改了注册表,以防止出错,更好的做法应该是在这之前记录原始值并在类销毁时恢复。之后,指出了屏幕复制时可能存在的一些问题,当然,如果你是取验证码啥的,那就不用关心这些了。然后对图像进行了简单的校正,需要注意的是,必须校正为白底黑字才行,否则不识别。而后,我在下面添加了一行无用的文字,并在返回值时进行了适当处理。再有一点需要注意的是,shell函数的最后一个参数,指出了等待调用进程结束,如果你要在vb6当中使用,这里就需要用api来实现等待——而不要用sleep等定时等待函数,那将会使得你的程序不够健壮。 
0 0
原创粉丝点击