我使用的是最新的3.01版本的。训练所需准备:
1.下载并安装3.01版本的tesseract。事实上并不需要安装这步骤,我下载的是压缩包版,解压即可,这里我解压到E:\\Tesseract-ocr目录。 2.下载并安装jTessBoxEditor工具,这是一个Box file editors,用来编辑训练文件的,直接下载地址在这里。这个软件是用java写的,运行需要安装jre,好在这个东西比.net好装多了,怎么运行可以见它的readme文件。
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.traineddata,这个文件就是最终训练出来语言库。下面再来说一下如何产生上述的文件: 1、获取一个训练图片(*.tif)
这里采用铁道部购票系统中的验证码,将这个验证码
下载后,用上文提到的jTessBoxEditor工具将其转换为tif文件,或者直接重命名也可以。名称为cnlp.lpft.exp0.tif,命名规则可以参照官网说明:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox。
2、产生相应的Box文件(*.box)
命令:tesseract.exe cnlp.lpft.exp0.tif cnlp.lpft.exp0 batch.nochop makebox
这一步产生对应的cnlp.lpft.exp0.box文件。该文件记录了tesseract识别出来的每一个字和其位置坐标。使用jTessBoxEditor编辑该Box文件,校正识别出来的字符,如果单个字符识别成了两个或者多个字符,则要将这些行进行合并。前两项坐标取最小值,后两项坐标取最大值。
备注:这时候要注意的是编辑box要和tif文件同在一个目录下,然后逐个校正文字,后保存。
如果使用cowboxer1.01,他会自动找到与之相对于的box文件。 3、产生字符特征文件(*.tr)
命令:tesseract cnlp.lpft.exp0.tif cnlp.lpft.exp0 nobatch box.train
这一步产生两个文件: (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.tr
这一步中的font_properties这个文件需要自己手动创建,文件内容
where 官网有详细说明,大致意思就是你设置的字体。 这是我的font_properties内容:lpft 0 0 1 0 0。 根据上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件mfunicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符特征数文件pffmtable。附带还会产生Microfeat文件,但是这个文件没啥用。 接下来使用命令cntraining.exe cnlp.lpft.exp0.tr,这一步产生字符形状正常化特征文件normproto。 到这里基本上所需的文件都形成了,下面就开始生成字典文件。 6、合并训练文件(*.traineddata) 此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, 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 1 m 2 r n 0 3 i i i 1 m 0 每一行表示一条校正信息:第一个数字表示接下来有几个字符,第二个数字也表示后面跟有几个字符,最后一个数字表示校正动作的类型。 在这个例子中,第一行表示将连续的两个单引号(‟)合并成一个双引号(”),最后的数字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 makebox 其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。 5.文字校正。运行jTessBoxEditor工具,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。 6.定义字体特征文件。Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties的字体特征文件。 font_properties不含有BOM头,文件内容格式如下: 1. 其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。 [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\esseract.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\esseract.exe orderNo.tif orderNo nobatch box.train 5.Compute the Character Set。输入命令: E:\\Tesseract-ocr\arset_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 通过训练出来的新语言,识别率提高了不少。 因篇幅问题不能全部显示,请点此查看更多更全内容