运用tesseract3.05进行字符识别

一下内容转载自

http://blog.csdn.net/u011607273/article/details/78329830

https://www.cnblogs.com/zhongtang/p/5555950.html

Tesseract OCR 3.05.01 VS2015编译 及 字库训练

tesseract-ocr 源码 
https://github.com/tesseract-ocr/tesseract 
tesseract-ocr build it from source for windows(windows 源码编译) 
https://github.com/tesseract-ocr/tesseract/wiki/Compiling#windows 
Tesseract OCR 3.05.01 exe安装文件下载地址 
http://download.csdn.net/download/u011607273/10037974 
下面说正事

一、最新版本 Tesseract OCR EXE文件生成 
1、下载vs2015工程文件 
https://github.com/peirick/VS2015_Tesseract 
2、下载对应版本的tesseract ocr源码并放入vs2015工程对应文件夹 
https://github.com/tesseract-ocr/tesseracthttps://github.com/UB-Mannheim/tesseract 
3、下载leptonica 源码并放入vs2015工程对应文件夹内 
https://github.com/DanBloomberg/leptonica 
4、用vs2015或更高版本打开工程进行编译 
注意:如果出现缺少文件请查看tesseract ocr或leptonica 源码版本是否匹配, 
如果缺少strcasestr.cpp请到tesseract ocr4.0源码中对应文件下获取, 
如遇到乱码问题将乱码文件重新保存为工程编码格式GB2312或UTF-8 
5、添加变量TESSDATA_PREFIX指向tessdata上级目录 
注:如果不添加此步骤在图片识别过程中可能报错 
6、添加PATH指向tesseract.exe所在文件夹 
7、编译成功后运行test_tesseract.bat进行测试。

二、字符识别基础及训练字库 
1、下载jTessBoxEditor(需要安装jdk才能使用) 
2、准备好需训练的图片 
3、将每个需训练的图片进行识别查看识别效果

tesseract 1.jpg 1 // 后面的1为文本文件名称
  • 1

4、用jTessBoxEditor将jpg转换为tif文件 
这里写图片描述
这里写图片描述

5、将生成所有的tif文件合成一个tif图片集文件,并规范命名 
例如red.font.exp0 
重复第四步操作,这次选得是tif文件,记得将所有需要训练的tif文件都选上。 
这里写图片描述 
6、生成box文件

tesseract red.font.exp0.tif red.font.exp0 batch.nochop makebox 
  • 1

这里写图片描述

7、调整,因为 tesseract 识别的不准确,所以我们用 jTessBoxEditor来调整识别文字的位置、结果 
用 jTessBoxEditor打开生成的图片集red.font.exp0.tif ,注意red.font.exp0.tif 对应的box文件一定要和他处于同一个文件夹下(请保持文件名),否则,用jTessBoxEditor打开没有 位置、识别结果等信息,然后就可以调整了,调整完之后保存;注意多个tif文件生成的tif图片集在打开后是分页的。 
这里写图片描述
8、生成.tr文件

tesseract red.font.exp0.tif  red.font.exp0   nobatch box.train
  • 1

这里写图片描述
9、计算字符集,从生成的 box文件中提取

unicharset_extractor red.font.exp0.box
  • 1

这里写图片描述 
注意:unicharset_extractor在vs2015项目中是没有的,请下载tesseract3.05.exe安装文件,解压缩exe文件后将除tesseract.exe外的exe文件复制到vs2015中tesseract.exe文件路径下即PATH下。 
10、生成字体特征文件 
在tif文件夹下创建font_properties.txt 内容 
定义字体特征文件,Tesseract-OCR 3.01 以上的版本在训练之前需要创建一个名称为 font_properties 的字体特征文件。font_properties 不含有 BOM 头,文件内容格式如下:

font 0 0 0 0 0
  • 1

创建后执行命令

mftraining -F font_properties.txt -U unicharset red.font.exp0.tr
  • 1

这里写图片描述

11、聚集tesseract 识别的训练文件

cntraining red.font.exp0.tr
  • 1

这里写图片描述 
执行完这一步之后发现文件夹下生产了许多文件,把unicharset, inttemp, normproto, pfftable,shapetable这几个文件加上前缀 red. 
12、最后一步,合并相关文件,生成字典文件

combine_tessdata red.
  • 1

这里写图片描述 
好了,至此字典文件就生产了,我们把生成的字典文件red.traineddata放入到 vs2015中 tessdata文件夹下开始使用我们训练过得字体库,找到之前的jpg图片测试一下识别成功率

如果想更好的识别图片,可以试试将图片二值化处理,可以提高识别率


利用jTessBoxEditor工具进行Tesseract3.02.02样本训练,提高验证码识别率

1、背景

前文已经简要介绍tesseract ocr引擎的安装及基本使用,其中提到使用-l eng参数来限定语言库,可以提高识别准确率及识别效率

本文将针对某个网站的验证码进行样本训练,形成自己的语言库,来提高验证码识别率。

 

2、准备工具

tesseract样本训练有一个官方流程说明,https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract#run-tesseract-for-training,不过都是英文的,个人认为这个地址适合于查找细节问题,全程看E文对大众还是有一定的困难。

具体的方法有两种:1-利用三方工具,2-完全命令行操作,三方工具主要在https://github.com/tesseract-ocr/tesseract/wiki/AddOns下载,本文将用到jTessBoxEditor这个工具,我们先给他下载到本地。

需要特别说明,这个工具是基于java虚拟机运行的,所以我们还要下载并安装一个java虚拟机,下载地址:http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-windows-x64.exe?AuthParam=1463733597_1161f2d895aa7606ed260b43b83d5f86

总结一下:

1、工具2 java虚拟机  Ver 1.8.0_91 64位版本 (oracle官网)

2、工具1 jtessboxeditor  Ver 1.5版本 (jtessboxeditor官网),运行界面如下:

 

3、使用实例

1)、准备样本图片

手动刷新某网站验证码,手动或者写程序,保存了101个验证码样本文件,分别命名成:1.png,2.png,……,101.png。

该验证码有几个特点:a、定长4位,b、都是数字,c、有背景干扰,但比较简单,d、字体为红色。

为了提高识别率,首先做了一个工作就是灰度化处理,并全部转换成tif文件,分别命名成:1.tif,2.tif,……,101.tif,统一存放在d:\python\lnypcg下。

2)、合并样本图片

打开jtessboxeditor,点击Tools->Merge Tiff ,按住shift键选择前文提到的101个tif文件,并把生成的tif合并到新目录d:\python\lnypcg\new下,命名为langyp.fontyp.exp0.tif。

注意:langyp 是本人定义的语言名称,fontyp是本人定义的字体名称,后续都会用到,你可以修改成你喜欢的名字

3)、生成box文件

执行命令生成langyp.fontyp.exp0.box文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox

 

复制代码
D:\python\lnypcg\new>tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 101
Page 2 of 101
Page 3 of 101
……
Page 101 of 101

D:\python\lnypcg\new>dir
 驱动器 D 中的卷没有标签。
 卷的序列号是 36D9-CDC7

 D:\python\lnypcg\new 的目录

2016-06-03  14:37    <DIR>          .
2016-06-03  14:37    <DIR>          ..
2016-06-03  14:30             6,327 langyp.fontyp.exp0.box
2016-06-03  13:07           126,056 langyp.fontyp.exp0.tif
               2 个文件        132,383 字节
               2 个目录 24,869,994,496 可用字节
复制代码

 

4)、修改box文件

切换到jTessBoxEditor工具的Box Editor页,点击open,打开前面的tiff文件langyp.fontyp.exp0.tif,工具会自动加载对应的box文件。

检查box数据,如下图所示,数字8被误认成字母H,手工修改H成8,并保存。

点击下图红色框的按钮,逐个核对tif文件的box数据,全部检查结束并保存。

 

 

5)、生成font_properties

执行echo命令生成font_properties。

echo fontyp 0 0 0 0 0 >font_properties

也可以手工新建一个名为font_properties的文本文件(注意该文件没有扩展名),内容为字体名fontyp,后面带5个0,分别代表字体的粗体、斜体等属性,这里全部是0

D:\python\lnypcg\new>echo fontyp 0 0 0 0 0 >font_properties

D:\python\lnypcg\new>type font_properties
fontyp 0 0 0 0 0

 

6)、生成训练文件

执行命令,生成langyp.fontyp.exp0.tr训练文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train

复制代码
D:\python\lnypcg\new>tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train
Tesseract Open Source OCR Engine v3.02 with Leptonica
Page 1 of 101
row xheight=8.66667, but median xheight = 10
APPLY_BOXES:
   Boxes read from boxfile:       4
   Found 4 good blobs.
Generated training data for 1 words
……
……
……
Page 101 of 101
row xheight=8.66667, but median xheight = 10
APPLY_BOXES:
   Boxes read from boxfile:       4
   Found 4 good blobs.
Generated training data for 1 words

 D:\python\lnypcg\new 的目录

2016-06-03  16:34    <DIR>          .
2016-06-03  16:34    <DIR>          ..
2016-06-03  16:05                16 font_properties
2016-06-03  14:30             6,327 langyp.fontyp.exp0.box
2016-06-03  13:07           126,056 langyp.fontyp.exp0.tif
2016-06-03  16:20           618,844 langyp.fontyp.exp0.tr
2016-06-03  16:20               202 langyp.fontyp.exp0.txt
               5 个文件        751,445 字节
               2 个目录 24,869,101,568 可用字节
复制代码

 

7)、生成字符集文件

执行命令,生成名为unicharset的字符集文件。

unicharset_extractor langyp.fontyp.exp0.box

复制代码
D:\python\lnypcg\new>unicharset_extractor langyp.fontyp.exp0.box
Extracting unicharset from langyp.fontyp.exp0.box
Wrote unicharset file ./unicharset.

D:\python\lnypcg\new>dir
 驱动器 D 中的卷没有标签。
 卷的序列号是 36D9-CDC7

 D:\python\lnypcg\new 的目录

2016-06-03  16:41    <DIR>          .
2016-06-03  16:41    <DIR>          ..
2016-06-03  16:05                16 font_properties
2016-06-03  14:30             6,327 langyp.fontyp.exp0.box
2016-06-03  13:07           126,056 langyp.fontyp.exp0.tif
2016-06-03  16:20           618,844 langyp.fontyp.exp0.tr
2016-06-03  16:20               202 langyp.fontyp.exp0.txt
2016-06-03  16:41               712 unicharset
               6 个文件        752,157 字节
               2 个目录 24,869,171,200 可用字节
复制代码

 

8)、生成shape文件

执行命令,生成shape文件

shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

复制代码
D:\python\lnypcg\new>shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
Reading langyp.fontyp.exp0.tr ...
Building master shape table
Computing shape distances...
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0
Stopped with 0 merged, min dist 999.000000
Computing shape distances...
Stopped with 0 merged, min dist 999.000000
Computing shape distances...
Stopped with 0 merged, min dist 999.000000
Computing shape distances... 0 1 2 3 4 5 6 7 8 9 10
Stopped with 0 merged, min dist 0.057803
Master shape_table:Number of shapes = 11 max unichars = 1 number with multiple unichars = 0

D:\python\lnypcg\new>dir
 驱动器 D 中的卷没有标签。
 卷的序列号是 36D9-CDC7

 D:\python\lnypcg\new 的目录

2016-06-03  17:24    <DIR>          .
2016-06-03  17:24    <DIR>          ..
2016-06-03  17:20                19 font_properties
2016-06-03  14:30             6,327 langyp.fontyp.exp0.box
2016-06-03  13:07           126,056 langyp.fontyp.exp0.tif
2016-06-03  17:23           618,844 langyp.fontyp.exp0.tr
2016-06-03  17:23               202 langyp.fontyp.exp0.txt
2016-06-03  17:24               723 langyp.unicharset
2016-06-03  17:24               202 shapetable
2016-06-03  17:24               712 unicharset
               8 个文件        753,085 字节
               2 个目录 24,868,278,272 可用字节
复制代码

 


9)、生成聚集字符特征文件

执行命令,生成3个特征字符文件,unicharset、inttemp、pffmtable

mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

D:\python\lnypcg\new>mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
Read shape table shapetable of 11 shapes
Reading langyp.fontyp.exp0.tr ...
Done!

 

10)、生成字符正常化特征文件

执行命令,生成正常化特征文件normproto。

cntraining langyp.fontyp.exp0.tr

D:\python\lnypcg\new>cntraining langyp.fontyp.exp0.tr
Reading langyp.fontyp.exp0.tr ...
Clustering ...

 

11)、更名

执行命令,把步骤9,步骤10生成的特征文件进行更名。

rename normproto fontyp.normproto
rename inttemp fontyp.inttemp
rename pffmtable fontyp.pffmtable 
rename unicharset fontyp.unicharset
rename shapetable fontyp.shapetable

复制代码
D:\python\lnypcg\new>rename normproto fontyp.normproto

D:\python\lnypcg\new>rename inttemp fontyp.inttemp

D:\python\lnypcg\new>rename pffmtable fontyp.pffmtable

D:\python\lnypcg\new>rename unicharset fontyp.unicharset

D:\python\lnypcg\new>rename shapetable fontyp.shapetable
复制代码

 

12)、合并训练文件

执行命令,生成fontyp.traineddata文件。

combine_tessdata fontyp.

注意:

a、fontyp.traineddata文件最终要拷贝tesseract安装目录的tessdata目录下,才能被tesseract找到。

b、命令行最后必须带一个点。

c、执行结果中,1,3,4,5,13这几行必须有数值,才代表命令执行成功。

复制代码
D:\python\lnypcg\new>combine_tessdata fontyp.
Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 140
Offset for type 2 is -1
Offset for type 3 is 852
Offset for type 4 is 137760
Offset for type 5 is 137850
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
Offset for type 13 is 139352
Offset for type 14 is -1
Offset for type 15 is -1
Offset for type 16 is -1
复制代码

 

13)测试使用

譬如前文的28.tif中8被误认为字母S,用新的字体看是否还出错。

复制代码
D:\python\lnypcg>tesseract 28.tif output -l eng -psm 7
Tesseract Open Source OCR Engine v3.02 with Leptonica

D:\python\lnypcg>type output.txt
S094
#1调用默认的eng语言,8被识别成S

D:\python\lnypcg>tesseract 28.tif output -l fontyp -psm 7
Error opening data file C:\Program Files (x86)\Tesseract-OCR\tessdata/fontyp.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'fontyp'
Tesseract couldn't load any languages!
Could not initialize tesseract.
#2条用新的fontyp语言,tesseract找不到fontyp语言。

D:\python\lnypcg>copy .\new\fontyp.traineddata "C:\Program Files (x86)\Tesseract-OCR\tessdata"
已复制         1 个文件。
#3复制fontyp.traineddata到tesseract的安装目录的tessdata子目录下

D:\python\lnypcg>tesseract 28.tif output -l fontyp -psm 7
Tesseract Open Source OCR Engine v3.02 with Leptonica

D:\python\lnypcg>type output.txt
8094
#使用fontyp语言成功识别8094
复制代码

 

4、总结:

Anyway,jtessboxeditor 工具其实是一个基本成型的三方样本训练工具,它的功能就是自动执行上述脚本命令,但是在实际使用中,还存在不够完善的地方,譬如不能加psm参数,生成shape时经常程序异常崩溃,所以本文操作还是以命令行为主。

tesseract是一个非常强大的ocr引擎,尤其是做了针对性训练之后,验证码识别率几乎可以达到95%以上,再在程序中增加一些判断机制,基本上可以满足爬虫自动登陆需求了,回头写一个某东的自动识别验证码的爬虫程序。

把前文提的简化一下,综合成如下步骤列表:

复制代码
1、合并图片
2、生成box文件
tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 batch.nochop makebox
3、修改box文件
4、生成font_properties
echo fontyp 0 0 0 0 0 >font_properties
5、生成训练文件
tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l eng -psm 7 nobatch box.train
6、生成字符集文件
unicharset_extractor langyp.fontyp.exp0.box 
7、生成shape文件
shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
8、生成聚集字符特征文件
mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr
9、生成字符正常化特征文件
cntraining langyp.fontyp.exp0.tr
10、更名
rename normproto fontyp.normproto
rename inttemp fontyp.inttemp
rename pffmtable fontyp.pffmtable 
rename unicharset fontyp.unicharset
rename shapetable fontyp.shapetable
11、合并训练文件,生成fontyp.traineddata
combine_tessdata fontyp.
复制代码

以上!


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值