当前位置:首页 >> 法律资料 >>

tesseract-ocr训练


这些天由于工作需要,需要对验证码进行识别,当然验证码识别是老问题了,这 里介绍了 google 开源项目 Tesseract-OCR3.01 对于验证码的识别。对于这款开 源项目,要想彻底搞清楚这款开源 OCR 软件的来龙去脉,还得看 Google 开源项 目的说明:http://code.google.com/p/tesseract-ocr/wiki/TrainingTessera ct3,这里就不罗嗦了。

我使用的是最新的 3.01 版本的。训练所需准备: 1.下载并安装 3.01 版本的 tesseract。事实上并不需要安装这步骤,我 下载的是压缩包版,解压即可,这里我解压到 E:\Tesseract-ocr 目录。 2.下载并安装 jTessBoxEditor 工具,这是一个 Box file editors,用来 编辑训练文件的,直接下载地址在这里。这个软件是用 java 写的,运 行需要安装 jre,好在这个东西比.net 好装多了,怎么运行可以见它的 r eadme 文件。 3.当然也可以用 cowboxer1.01.exe 这个工具,他也是 Box file 编辑工 具,在实际应用中,最好将这两个工具结合。 4.接下来要训练一个新的语言(自定义语言或者某种自然语言都可以) 对应的 traineddata 文件,需要产生下列过程文件:
? cnlp.config ? cnlp.unicharset ? cnlp.unicharambigs ? cnlp.inttemp ? cnlp.pffmtable ? cnlp.normproto ? cnlp.punc-dawg ? cnlp.word-dawg ? cnlp.number-dawg ? cnlp.freq-dawg

在这八个文件中,红色标示的是必须的,其他的文件可选。当这些文件都 准备好之后,再使用 combine_tessdata 进行最后的合并工作,生成 cnlp.trainedda ta,这个文件就是最终训练出来语言库。下面再来说一下如何产生上述的文件: 1、获取一个训练图片(*.tif)

这里采用铁道部购票系统中的验证码

,将这个验证码

下载后,用上文提到的 jTessBoxEditor 工具将其转换为 tif 文件,或 者直接重命名也可以。 名称为 cnlp.lpft.exp0.tif, 命名规则可以参照 官网说明: tesseract [lang].[fontname].exp[num].tif [lang].[fontname].ex p[num] batch.nochop makebox。
2、产生相应的 Box 文件(*.box) 命令:tesseract.exe cnlp.lpft.exp0.tif cnlp.lpft.exp0 p makebox batch.nocho

这一步产生对应的 cnlp.lpft.exp0.box 文件。该文件记录了 tesseract 识别 出来的每一个字和其位置坐标。使用 jTessBoxEditor 编辑该 Box 文件,校正识 别出来的字符, 如果单个字符识别成了两个或者多个字符,则要将这些行进行合 并。前两项坐标取最小值,后两项坐标取最大值。 备注: 这时候要注意的是编辑 box 要和 tif 文件同在一个目录下,然后逐个校 正文字,后保存。 如果使用 cowboxer1.01,他会自动找到与之相对于的 box 文件。 3、产生字符特征文件(*.tr) 命令:tesseract cnlp.lpft.exp0.tif cnlp.lpft.exp0 nobatch box.trai n 这一步产生两个文件: (1)cnlp.lpft.exp0.txt; (2)cnlp.lpft.exp0.tr 为特征文件。 可能会产生 tesseract.log 主要是记录该步骤执行结果的日志没啥用;

4、计算字符集(unicharset) 命令:unicharset_extractor cnlp.lpft.exp0.box 这一步产生字符集文件 unicharset。 5、聚集字符特征(inttemp、pffmtable、normproto) 命令:mftraining -F font_properties -U unicharset cnlp.lpft.exp0.t r

这一步中的 font_properties 这个文件需要自己手动创建,文件内 容 <fontname><italic><bold><fixed><serif><fraktur>。 where<fontname>is a string naming the font (no spaces allowe d!), and<italic>, <bold>, <fixed>, <serif> and <fraktur>are all si mple 0 or 1 flags indicating whether the font has the named p roperty. 官网有详细说明,大致意思就是你设置的字体。 这是我的 font_properties 内容:lpft 0 0 1 0 0。

根据上一步产生的字符集文件 unicharset, 来生成当前新语言的字符集文件 mfunicharset。 同时还会产生图形原型文件 inttemp 和每个字符所对应的字符特 征数文件 pffmtable。附带还会产生 Microfeat 文件,但是这个文件没啥用。

接下来使用命令 cntraining.exe cnlp.lpft.exp0.tr, 这一步产生字符形状 正常化特征文件 normproto。 到这里基本上所需的文件都形成了,下面就开始生成字典文件。 6、合并训练文件(*.traineddata)

此时,在目录下应该生成若干个文件了,把 unicharset, inttemp, n ormproto, pffmtable 这四个文件加上前缀“cnlp.“。然后使用命令:c
ombine_tessdata cnlp. 将其合并成一个字典文件。这时会生成如下结果:

必须确定的是第 2、4、5、6 行的数据不是-1,那么一个新的字典就算生成 了。

此时目录下“cnlp.traineddata”的文件拷贝到 tesseract 程序目录下的 “tessdata”目录。 以后就可以使用该该字典来识别了。
7、测试

验证码识别
需要借助开源工具库 tesseract-ocr,目前版本是 3.0.1。

编译安装
在 windows 下安装比较简单直接下载一个二进制文件即可,CentOS 下相对于比较麻烦。 下载地址:http://code.google.com/p/tesseract-ocr/downloads/list tesseract-ocr 的编译安装依赖于 leptonica 其下载地址:http://leptonica.googlecode.com/files/leptonica-1.69.tar.bz2 其编译安装相对于比较简单。 而 tesseract-ocr 编译安装过程稍微需要注意几点。 进入解压目录后先执行 autogen.sh,然后新建目录 m4 再执行./configure –prefix=/usr/local 编译的时候需要先修改 ccutil/strngs.h 这个文件,可能这个文件最头部有特殊字符需要去掉(vi 编辑) 接下来的编译安装就很简单了。

使用
主要是 tesseract 这个命令工具,第一个参数为要识别的图片,第二个参数是要输出的文件(会自动在后 面加上.txt) -l 要使用的语言(可以是自己生成的,但是要在系统里找得其语言文件) windows 下的安装目录下有个 tessdata 目录,其语言文件都存放在此,默认提供了 eng 和 osd 这两个 语言。 CentOS 下语言文件是存放在/usr/local/share/tessdata 下(因为我是安装在/usr/local 下的),默认 没有提供语言文件。

制作语言

要想识别验证码,必须根据实际情况训练出新的语言。 首先下载依赖工具 jTessBoxEditor(合并图片生成 tif): http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/ cowboxer(校验 Box):http://code.google.com/p/cowboxer/downloads/list

要生成语言对应的 traineddata 文件,必须依赖 lang.unicharset、lang.inttemp、lang.pffmtable、 lang.normproto 这些文件(其中 lang 为语言名称,这个名称可以自己定义),生成后的语言文件就为 lang.traineddata。

获取训练图片
拿 12306 的验证码识别来说, 首先去下载验证码图片几十张, 我们先下载 10 张, 编号为 1.jpg 到 10.jpg.

生成 tif
利用 jTessBoxEditor 工具将这 10 张图片生成一个 tif,命名为 tick.tif 当然我们也可以每张单独生成 tif(可以直接重命名就是),但是图片数很多时不好去操作。 打开 jTessBoxEditor,点击 tools 菜单里的“Merge TIFF” 如果是每个文件单独生成 tif,可直接重命名为 tick.001.tif,依此类推。

生成 Box
可执行 tesseract.exe tick.tif tick batch.nochop makebox 如果有很多 tif,可执行 tesseract.exe tick.001.tif tick.001 batch.nochop makebox

修正 Box 里的文字
还是可以使用 jTessBoxEditor (cowboxer 不会用) 用其打开 tif 后, , 一个个进行文字修正和坐标调整。

生成初始的 traineddata
执行 tesseract.exe tick.tif tick nobatch box.train 对于单个 tif 之类的执行 tesseract.exe tick.001.tif tick.001 nobatch box.train 切记生成的 box 文件要在同目录下

计算字符集
执行 unicharset_extractor tick.box 会在该目录下生成 unicharset 文件

聚集字符特征
需先在当前目录下新建文件 font_properties 文件内容为: tick 0 0 0 0 0 意思为:这个语言的字体为普通字体 然后执行 mftraining -F font_properties -U unicharset -O tick.unicharset tick.tr

会生成 tick.unicharset、inttemp、Microfeat、pffmtable 接着执行 cntraining tick.tr 会生成 normproto

产生字典文件
这一步可选 执行 wordlist2dawg frequent_words_list tick.freq-dawg tick.unicharset 执行 wordlist2dawg words_list tick.word-dawg tick.unicharset frequent_words_list 存放出现频率较高的字符;words_list 存放所有字符集,至少一个字符。每个字符 占一行。这样可以产生对应语言的字典文件了,共五个。 同样的方法产生 punc-dawg 文件(符号)、number-dawg 文件(数字)以及 user-words 文件(用户 自定义字符,通常为空)。

模糊字集校正文件
这一步可选 例如某 unicharambigs 文件内容如下: 2??1”1 1m2rn0 3iii1m0 每一行表示一条校正信息:第一个数字表示接下来有几个字符,第二个数字也表示后面跟有几个字符,最 后一个数字表示校正动作的类型。 在这个例子中,第一行表示将连续的两个单引号(?)合并成一个双引号(”),最后的数字 1 表示强制转 换;第二行、第三行表示一个字母 m 有可能被识别成两个字母?r??n?,也有可能识别成连续三个字母?i?。 这个校正文件可以为空或者不存在。

合并训练文件
把 inttemp, normproto, pfftable 这四个文件加上前缀“tick.” 然后执行 combine_tessdata.exe tick. 会生成 tick.traineddata

测试使用
将 tick.traineddata 拷贝到安装目录下的 tessdata 目录 执行 tesseract 1.jpg a -l tick 然后打开 a.txt 对照查看

参考文章
http://my.oschina.net/lixinspace/blog/60124 http://blog.wudilabs.org/entry/f25efc5f/ http://www.cnblogs.com/rayz/archive/2012/06/03/2533248.html

Tesseract 是一个开源的 OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格 式的图像文件并将其转换成文本, 目前已支持 60 多种语言 (包括中文) Tesseract 最初由 HP 公司开发, 。 后来由 Google 维护,目前发布在 Googel Project 上。地址为 http://code.google.com/p/tesseract-ocr/。

使用默认的语言库识别
1.安装 Tesseract 从 http://code.google.com/p/tesseract-ocr/downloads/list 下载 Tesseract,目前版本 为 Tesseract3.02 。 因 为 只 是 测 试 使 用 , 这 里 直 接 下 载 winodws 下 的 安 装 文 件 tesseract-ocr-setup-3.02.02.exe。安装成功后会在相应磁盘上生成一个 Tesseract-OCR 目 录。通过目录下的 tesseract.exe 程序就可以对图像字符进行识别了。
2.准备一副待识别的图像,这里用画图工具随便写了一串数字,保存为 number.jpg,如下图所示:

3. 打开命令行,定位到 Tesseract-OCR 目录,输入命令: tesseract.exe number.jpg result -l eng 其中 result 表示输出结果文件 txt 名称,eng 表示用以识别的语言文件为英文。 3. 打开 Tesseract-OCR 目录下的 result.txt 文件, 看到识别的结果为 7542315857, 3 个字符识别错误, 有 识别率还不是很高, 那有没有什么方法来提供识别率呢?Tesseract 提供了一套训练样本的方法, 用以生成 自己所需的识别语言库。下面介绍一下具体训练样本的方法。

训练样本
关 于 如 何 训 练 样 本 , Tesseract-OCR 官 网 有 详 细 的 介 绍

http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过一个简单的例子 来介绍一下如何进行样本训练。

1.下载工具 jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用 来训练样本用的,由于该工具是用 JAVA 开发的,需要安装 JAVA 虚拟机才能运行。 2. 获取样本图像。用画图工具绘制了 5 张 0-9 的文样本图像(当然样本越多越好),如下图所示:

3.合并样本图像。运行 jTessBoxEditor 工具,在点击菜单栏中 Tools--->Merge TIFF。在弹出的对话框中选 择样本图像(按 Shift 选择多张) ,合并成 num.font.exp0.tif 文件。4.生成 Box File 文件。打开命令行,

执行命令:tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox 生成的 BOX 文件为 num.font.exp0.box, BOX 文件为 Tessercat 识别出的文字和其坐标。 注:Make Box File 的命令格式为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop ma kebox

其中 lang 为语言名称,fontname 为字体名称,num 为序号,可以随便定义。
5.文字校正。运行 jTessBoxEditor 工具,打开 num.font.exp0.tif 文件(必须将上一步生成的.box 和.tif 样本 文件放在同一目录) ,如下图所示。可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识 别错误的字符进行校正。校正完成后保存即可。

6.定义字体特征文件。Tesseract-OCR3.01 以上的版本在训练之前需要创建一个名称为 font_properties 的 字体特征文件。

font_properties 不含有 BOM 头,文件内容格式如下:
1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>

其中 fontname 为字体名称, 必须与[lang].[fontname].exp[num].box 中的名称保持一致。 <italic>、

<bold>、<fixed>、<serif>、<fraktur>的取值为 1 或 0,表示字体是否具有这些属性。 这里在样本图片所在目录下创建一个名称为 font_properties 的文件,用记事本打开,输入 以下下内容:
[plain] view plaincopy

1. font 0 0 0 0 0

这里全取值为 0,表示字体不是粗体、斜体等等。
7.生成语言文件。在样本图片所在目录下创建一个批处理文件,输入如下内容。 1. rem 执行改批处理前先要目录下创建 font_properties 文件 2. 3. echo Run Tesseract for Training.. 4. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train 5. 6. echo Compute the Character Set.. 7. unicharset_extractor.exe num.font.exp0.box 8. mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0. tr 9.

10. echo Clustering.. 11. cntraining.exe num.font.exp0.tr 12. 13. echo Rename Files.. 14. rename normproto num.normproto 15. rename inttemp num.inttemp 16. rename pffmtable num.pffmtable 17. rename shapetable num.shapetable 18. 19. echo Create Tessdata.. 20. combine_tessdata.exe num.

将批处理通过命令行执行。执行后的结果如下:

需确认打印结果中的 Offset 1、3、4、5、13 这些项不是-1。这样,一个新的语言文件就生 成了。 num.traineddata 便是最终生成的语言文件,将生成的 num.traineddata 拷贝到 Tesseract-OCR-->tessdata 目录下。可以用它来进行字符识别了。

使用训练后的语言库识别
用训练后的语言库识别 number.jpg 文件, 打开命令行,定位到 Tesseract-OCR 目录,输 入命令:
[plain] view plaincopy

1. tesseract.exe number.jpg result -l eng

识别结果如如图所示,可以看到识别率提高了不少。通过自定义训练样本,可以进行图形验证码、车牌号 码识别等。感兴趣的朋友可以研究研究。

tesseract-ocr 有 2 和 3 两个版本,不同版本训练方法稍有不同。 第 3 版本的训练方法官版教程在这里:TrainingTesseract3 第 2 版的训练方法官版教程在这里:TrainingTesseract 我使用的是最新的 3.01 版本的。训练所需准备: 1.下载并安装 3.01 版本的 tesseract。事实上并不需要安装这步骤,我下载的是压缩包版, 解压即可,这里我解压到 E:\Tesseract-ocr 目录。 2.下载并安装 jTessBoxEditor 工具,这是一个 Box file editors,用来编辑训练文件的,直接 下载地址在这里。这个软件是用 java 写的,运行需要安装 jre,好在这个东西比.net 好装多 了,怎么运行可以见它的 readme 文件。 3.一张用来训练的 tiff 格式图片。

在不通过训练的前提下,使用 tesseract 来识别一个订单号的内容,如图 发现错误率很高,希望通过训练来提高准确率。 训练过程: 1.通过合并 10 张如上图的图片合并为一张 tiff 格式的图片,如何合并呢?通过 jTessBoxEditor 的 Merge Tiff 来完成,不过他的小缺点就是只能合并多张 tiff 格式的,如果 你的图片是 jpg 的,需要先转换。生成后的 tiff 图片叫做 orderNo.tif 2.Make Box Files。在 orderNo.tif 所在的目录下打开一个命令行,输入: E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo batch.nochop makebox 来生成一个 box 文件,该文件记录了 tesseract 识别出来的每一个字和其位置坐标。 3.使用 jTessBoxEditor 打开 orderNo.tif 文件,需要记住的是第 2 步生成的 orderNo.box 要 和这个 orderNo.tif 文件同在一个目录下。逐个校正文字,后保存。 4.Run Tesseract for Training。输入命令: E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo nobatch box.train 5.Compute the Character Set。输入命令:

E:\Tesseract-ocr\unicharset_extractor.exe orderNo.box 6.新建文件“font_properties”。如果是 3.01 版本,那么需要在目录下新建一个名字为 “font_properties”的文件,并且输入文本 : orderNo 0 0 0 0 0 大致意思就是说 orderNo 这个语言的字体为普通字体。 并执行命令: E:\Tesseract-ocr\mftraining.exe -F font_properties -U unicharset orderNo.tr 7.Clustering。输入命令: E:\Tesseract-ocr\cntraining.exe orderNo.tr 8.此时,在目录下应该生成若干个文件了,把 unicharset, inttemp, normproto, pffmtable 这 四个文件加上前缀“orderNo.”。然后输入命令: E:\Tesseract-ocr\combine_tessdata.exe orderNo. 会显示一个结果如: Combining tessdata files TessdataManager combined tesseract data files. Offset for type 0 is -1 Offset for type 1 is 108 Offset for type 2 is -1 Offset for type 3 is 1660 Offset for type 4 is 327545 Offset for type 5 is 327781 Offset for type 6 is -1 Offset for type 7 is -1 Offset for type 8 is -1 Offset for type 9 is -1 Offset for type 10 is -1 Offset for type 11 is -1 Offset for type 12 is –1

必须确定的是第 2、4、5、6 行的数据不是-1,那么一个新的字典就算生成了。 此时目录下“orderNo.traineddata”的文件拷贝到 tesseract 程序目录下的“tessdata”目录。 以后就可以使用该该字典来识别了,例如: tesseract.exe test.jpg result –l orderNo

通过训练出来的新语言,识别率提高了不少。


相关文章:
如何提高Tesseract-OCR的识别精度
如何提高 Tesseract-OCR 的识别精度概述: 本文介绍了提高 Tesseract-OCR 识别精度的步骤及注意事项。 通过对 Tesseract-OCR训练能有效提高 Tesseract-OCR 的识别...
Tesseract字库训练说明
Tesseract字库训练说明_计算机软件及应用_IT/计算机_专业资料。Tesseract字库训练,...便是最终生成的语言文件,将生成的 my.traineddata 拷贝到 Tesseract-OCR-->...
OCR开源代码以及OCR公开训练测试数据集汇总
OCR开源代码以及OCR公开训练测试数据集汇总_计算机软件及应用_IT/计算机_专业资料...p/tesseract-ocr/ 1.7 OCR,http://www.ocrspace.com/ocr-download.html ?...
Tesseract_3_语言数据的训练方法
生成第一个 box 文件 演示中将 Tesseract 解压到了 E:\tesseract-ocr 目录。然后在该目录中建立了一个 build 目录用于存放原始数据和训练过程中生成的文件。原始...
Tesseract 3.02中文字库训练
Tesseract 3.02中文字库训练_计算机软件及应用_IT/计算机_专业资料。Tesseract 3.02 中文字库训练下载 chi_sim.traindata 字库 下载 tesseract-ocr-setup-3.02.02....
VS2010调用tesseract-OCR API步骤
将 chi_sim.traineddata.gz 解压缩,然后将 chi_sim.traineddata 复制到 D:\Tesseract-OCR\tessdata 下,这是已经有的简体中文训练集 2. 检查并修改环境变量 ...
tesseract ocr engine 中文文档
tesseract ocr engine 中文文档_计算机软件及应用_IT/计算机_专业资料。tesseract ...先分析的且满 足条件的单词也作为训练样本,所以后面的字符(比如页尾)识别更...
识别训练
识别训练_交通运输_工程科技_专业资料。识别查看: 1.安装 Tesseract(已安装) 从 http://code.google.com/p/tesseract-ocr/downloads/list 下载 Tesseract,目前版...
tesseract使用方法
tesseract使用方法_计算机软件及应用_IT/计算机_专业资料。tesseract 配置过程: 1...tesseract-ocr训练 16页 免费 一起作业使用说明 6页 免费 Tesseract A 4D ...
Tesseract-OCR 介绍
Tesseract-OCR 介绍_IT/计算机_专业资料。From: http://code.google.com/p/tesseract...如何提高Tesseract-OCR的... 5页 3下载券 tesseract-ocr训练 16页 免费 ...
更多相关标签: