2024年2月19日发(作者:)
这些天由于工作需要,需要对验证码进行识别,当然验证码识别是老问题了,这里介绍了google开源项目Tesseract-OCR3.01对于验证码的识别。对于这款开源项目,要想彻底搞清楚这款开源OCR软件的来龙去脉,还得看Google开源项目的说明:/p/tesseract-ocr/wiki/TrainingTesseract3,这里就不罗嗦了。
我使用的是最新的3.01版本的。训练所需准备:
1.下载并安装3.01版本的tesseract。事实上并不需要安装这步骤,我下载的是压缩包版,解压即可,这里我解压到E:Tesseract-ocr目录。
2.下载并安装jTessBoxEditor工具,这是一个Box file editors,用来编辑训练文件的,直接下载地址在这里。这个软件是用java写的,运行需要安装jre,好在这个东西比.net好装多了,怎么运行可以见它的readme文件。
3.当然也可以用这个工具,他也是Box file编辑工具,在实际应用中,最好将这两个工具结合。
4.接下来要训练一个新的语言(自定义语言或者某种自然语言都可以)对应的traineddata文件,需要产生下列过程文件:
•
• rset
• rambigs
• p
• ble
• oto
• -dawg
• -dawg
• -dawg
• -dawg
在这八个文件中,红色标示的是必须的,其他的文件可选。当这些文件都准备好之后,再使用combine_tessdata进行最后的合并工作,生成ddata,这个文件就是最终训练出来语言库。下面再来说一下如何产生上述的文件:
1、获取一个训练图片(*.tif)
这里采用铁道部购票系统中的验证码,将这个验证码下载后,用上文提到的jTessBoxEditor工具将其转换为tif文件,或者直接重命名也可以。名称为,命名规则可以参照官网说明:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] makebox。
2、产生相应的Box文件(*.box)
命令: 0 makebox
这一步产生对应的文件。该文件记录了tesseract识别出来的每一个字和其位置坐标。使用jTessBoxEditor编辑该Box文件,校正识别出来的字符,如果单个字符识别成了两个或者多个字符,则要将这些行进行合并。前两项坐标取最小值,后两项坐标取最大值。
备注:这时候要注意的是编辑box要和tif文件同在一个目录下,然后逐个校正文字,后保存。
如果使用cowboxer1.01,他会自动找到与之相对于的box文件。
3、产生字符特征文件(*.tr)
命令:tesseract 0 nobatch
这一步产生两个文件:
(1);
(2)为特征文件。
可能会产生主要是记录该步骤执行结果的日志没啥用;
4、计算字符集(unicharset)
命令:unicharset_extractor
这一步产生字符集文件unicharset。
5、聚集字符特征(inttemp、pffmtable、normproto)
命令:mftraining -F font_properties -U unicharset
这一步中的font_properties这个文件需要自己手动创建,文件内容
where
官网有详细说明,大致意思就是你设置的字体。
这是我的font_properties内容:lpft 0 0 1 0 0。
根据上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件mfunicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符特征数文件pffmtable。附带还会产生Microfeat文件,但是这个文件没啥用。
接下来使用命令 ,这一步产生字符形状正常化特征文件normproto。
到这里基本上所需的文件都形成了,下面就开始生成字典文件。
6、合并训练文件(*.traineddata)
此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pffmtable这四个文件加上前缀“cnlp.“。然后使用命令:combine_tessdata cnlp.
将其合并成一个字典文件。这时会生成如下结果:
必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了。
此时目录下“ddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。
以后就可以使用该该字典来识别了。
7、测试
验证码识别
需要借助开源工具库tesseract-ocr,目前版本是3.0.1。
编译安装
在windows下安装比较简单直接下载一个二进制文件即可,CentOS下相对于比较麻烦。
下载地址:/p/tesseract-ocr/downloads/list
tesseract-ocr的编译安装依赖于leptonica
其下载地址:/files/2
其编译安装相对于比较简单。
而tesseract-ocr编译安装过程稍微需要注意几点。
进入解压目录后先执行,然后新建目录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): /projects/vietocr/files/jTessBoxEditor/
cowboxer(校验Box):/p/cowboxer/downloads/list
要生成语言对应的traineddata文件,必须依赖rset、p、ble、oto这些文件(其中lang为语言名称,这个名称可以自己定义),生成后的语言文件就为ddata。
获取训练图片
拿12306的验证码识别来说,首先去下载验证码图片几十张,我们先下载10张,编号为到.
生成tif
利用jTessBoxEditor工具将这10张图片生成一个tif,命名为
当然我们也可以每张单独生成tif(可以直接重命名就是),但是图片数很多时不好去操作。
打开jTessBoxEditor,点击tools菜单里的“Merge TIFF”
如果是每个文件单独生成tif,可直接重命名为,依此类推。
生成Box
可执行 tick makebox
如果有很多tif,可执行 tick.001 makebox
修正Box里的文字
还是可以使用jTessBoxEditor(cowboxer不会用),用其打开tif后,一个个进行文字修正和坐标调整。
生成初始的 traineddata
执行 tick nobatch
对于单个tif之类的执行 tick.001 nobatch
切记生成的box文件要在同目录下
计算字符集
执行 unicharset_extractor
会在该目录下生成 unicharset文件
聚集字符特征
需先在当前目录下新建文件font_properties
文件内容为:
tick 0 0 0 0 0
意思为:这个语言的字体为普通字体
然后执行 mftraining -F font_properties -U unicharset -O rset
会生成 rset、inttemp、Microfeat、pffmtable
接着执行 cntraining
会生成 normproto
产生字典文件
这一步可选
执行 wordlist2dawg frequent_words_list -dawg rset
执行 wordlist2dawg words_list -dawg rset
frequent_words_list存放出现频率较高的字符;words_list存放所有字符集,至少一个字符。每个字符占一行。这样可以产生对应语言的字典文件了,共五个。
同样的方法产生punc-dawg文件(符号)、number-dawg文件(数字)以及user-words文件(用户自定义字符,通常为空)。
模糊字集校正文件
这一步可选
例如某unicharambigs文件内容如下:
2 „ „ 1 ” 1
1 m 2 r n 0
3 i i i 1 m 0
每一行表示一条校正信息:第一个数字表示接下来有几个字符,第二个数字也表示后面跟有几个字符,最后一个数字表示校正动作的类型。
在这个例子中,第一行表示将连续的两个单引号(‟)合并成一个双引号(”),最后的数字1表示强制转换;第二行、第三行表示一个字母m有可能被识别成两个字母‟r‟‟n‟,也有可能识别成连续三个字母‟i‟。
这个校正文件可以为空或者不存在。
合并训练文件
把 inttemp, normproto, pfftable这四个文件加上前缀“tick.”
然后执行 combine_ tick.
会生成 ddata
测试使用
将ddata拷贝到安装目录下的tessdata目录
执行 tesseract a -l tick
然后打开 对照查看
参考文章
/lixinspace/blog/60124
/entry/f25efc5f/
/rayz/archive/2012/06/03/
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,目前发布在Googel Project上。地址为/p/tesseract-ocr/。
使用默认的语言库识别
1.安装Tesseract
从/p/tesseract-ocr/downloads/list下载Tesseract,目前版本为Tesseract3.02。因为只是测试使用,这里直接下载winodws下的安装文件。安装成功后会在相应磁盘上生成一个Tesseract-OCR目录。通过目录下的程序就可以对图像字符进行识别了。
2.准备一副待识别的图像,这里用画图工具随便写了一串数字,保存为,如下图所示:
3. 打开命令行,定位到Tesseract-OCR目录,输入命令: result -l eng
其中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。
3. 打开Tesseract-OCR目录下的文件,看到识别的结果为7542315857,有3个字符识别错误,识别率还不是很高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。下面介绍一下具体训练样本的方法。
训练样本
关于如何训练样本,Tesseract-OCR官网有详细的介绍/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过一个简单的例子来介绍一下如何进行样本训练。
1.下载工具jTessBoxEditor. /projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的,由于该工具是用JAVA开发的,需要安装JAVA虚拟机才能运行。
2. 获取样本图像。用画图工具绘制了5张0-9的文样本图像(当然样本越多越好),如下图所示:
3.合并样本图像。运行jTessBoxEditor工具,在点击菜单栏中Tools--->Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并成文件。4.生成Box File文件。打开命令行,执行命令: 0 makebox
生成的BOX文件为,BOX文件为Tessercat识别出的文字和其坐标。
注:Make Box File的命令格式为:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] makebox
其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。
5.文字校正。运行jTessBoxEditor工具,打开文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。
6.定义字体特征文件。Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties的字体特征文件。
font_properties不含有BOM头,文件内容格式如下:
1.
其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。
这里在样本图片所在目录下创建一个名称为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. 0 nobatch
5.
6. echo Compute the Character Set..
7. unicharset_
8. mftraining -F font_properties -U unicharset -O rset
9.
10. echo Clustering..
11.
12.
13. echo Rename Files..
14. rename normproto oto
15. rename inttemp p
16. rename pffmtable ble
17. rename shapetable able
18.
19. echo Create Tessdata..
20. combine_ num.
将批处理通过命令行执行。执行后的结果如下:
需确认打印结果中的Offset 1、3、4、5、13这些项不是-1。这样,一个新的语言文件就生成了。
ddata便是最终生成的语言文件,将生成的ddata拷贝到Tesseract-OCR-->tessdata目录下。可以用它来进行字符识别了。
使用训练后的语言库识别
用训练后的语言库识别文件, 打开命令行,定位到Tesseract-OCR目录,输入命令:
[plain] view plaincopy
1. 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图片叫做
Box Files。在所在的目录下打开一个命令行,输入:
E: orderNo makebox
来生成一个box文件,该文件记录了tesseract识别出来的每一个字和其位置坐标。
3.使用jTessBoxEditor打开文件,需要记住的是第2步生成的要和这个文件同在一个目录下。逐个校正文字,后保存。
Tesseract for Training。输入命令:
E: orderNo nobatch
e the Character Set。输入命令:
E:Tesseract-ocrunicharset_
6.新建文件“font_properties”。如果是3.01版本,那么需要在目录下新建一个名字为“font_properties”的文件,并且输入文本 :
orderNo 0 0 0 0 0
大致意思就是说orderNo这个语言的字体为普通字体。
并执行命令:
E: -F font_properties -U unicharset
ring。输入命令:
E:
8.此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pffmtable这四个文件加上前缀“orderNo.”。然后输入命令:
E:Tesseract-ocrcombine_ 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,那么一个新的字典就算生成了。
此时目录下“ddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。
以后就可以使用该该字典来识别了,例如:
result –l orderNo
通过训练出来的新语言,识别率提高了不少。


发布评论