转 Tesseract-OCR 字符识别---样本训练

转自:http://blog.csdn.net/feihu521a/article/details/8433077ide


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


使用默认的语言库识别


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目录,输入命令:测试

 

[plain]  view plain copy
 
  1. tesseract.exe number.jpg result -l eng  

 

     其中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。字体

3.  打开Tesseract-OCR目录下的result.txt文件,看到识别的结果为7542315857,有3个字符识别错误,识别率还不是很高,那 有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成本身所需的识别语言库。下面介绍一下具体训练样本的方法。google


     


训练样本


关于如何训练样本,Tesseract-OCR官网有详细的介绍 http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里经过一个简单的例子来介绍一下如何进行样本训练。

1.下载工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的,因为该工具是用JAVA开发的,须要安装JAVA虚拟机才能运行。spa

2. 获取样本图像。用画图工具绘制了5张0-9的文样本图像(固然样本越多越好),以下图所示:.net

  

  


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

4.生成Box File文件打开命令行,执行命令:code

[plain]  view plain copy
 
  1. tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox  

 

  生成的BOX文件为num.font.exp0.box,BOX文件为Tessercat识别出的文字和其坐标。

 

注:Make Box File 文件名有必定的格式,不能随便乱取名字,命令格式为:

 

[plain]  view plain copy
 
  1. tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  

 

 

其中lang为语言名称,fontname为字体名称,num为序号,能够随便定义。

【Yasi】:先前本身定义了tessdata的环境变量 TESSDATA_PREFIX 值为 E:\tesseract\tessdata,但没有从tesseract源文件目录中将tessdata子目录中的内容copy到 E:\tesseract\tessdata 中,形成上面的命令报错,说找不到batch.nochop 和 makebox。解决办法:将 tesseract 源文件目录中全部文件和子文件夹(可能充分但非必要,先无论这些啦)copy到 E:\tesseract\tessdata 中

5.文字校订。 运行jTessBoxEditor工具,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如 下图所示。能够看出有些字符识别的不正确,能够经过该工具手动对每张图片中识别错误的字符进行校订。校订完成后保存便可。

【Yasi】这里必须修改识别错误的字符,不然作出来的traineddata文件也是错的。能够在下面的界面中修改并保存,也能够直接在traineddata文件中修改。



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

font_properties不含有BOM头,文件内容格式以下:

 

[plain]  view plain copy
 
  1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>  

 

其中fontname为字体名称,必须与[lang]. [fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具备这些属性。

这里在样本图片所在目录下建立一个名称为font_properties的文件,用记事本打开,输入如下下内容:

 

[plain]  view plain copy
 
  1. font 0 0 0 0 0  
这里全取值为0,表示字体不是粗体、斜体等等。

 

7.生成语言文件。在样本图片所在目录下建立一个批处理文件,输入以下内容。

 

[plain]  view plain copy
 
  1. rem 执行改批处理前先要目录下建立font_properties文件  
  2. combine_tessdata.exe num.  

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


需确认打印结果中的Offset 一、三、四、五、13这些项不是-1。这样,一个新的语言文件就生成了。

num.traineddata即是最终生成的语言文件,将生成的num.traineddata拷贝到Tesseract-OCR-->tessdata目录下。能够用它来进行字符识别了。


使用训练后的语言库识别


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

 

[plain]  view plain copy
 
  1. tesseract.exe number.jpg result -l eng  

 

识别结果如如图所示,能够看到识别率提升了很多。经过自定义训练样本,能够进行图形验证码、车牌号码识别等。感兴趣的朋友能够研究研究。

【Yasi】试验结果以下:

下面是num-yasi.png

将生成的num.traineddata拷贝到E:\tesseract\tessdata,即环境变量TESSDATA_PREFIX 设置的路径下,执行下面的命令(注意第二条命令结尾是num,即新加的traineddata,而不是eng
[plain] view plain copy
  1. E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-eng -l eng  
  2. E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-num -l num  

下图是两次识别结果对比


使用eng traineddata的结果彻底不靠谱;使用了本身的traineddata,识别出来的固然都是数字,但正确率实在糟糕。多是我本身手写的字体和用来作traineddata的手写数字的字体差异太大了吧。

相关文章
相关标签/搜索