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.准备一副待识别的图像,这里用画图工具随便写了一串数字,保存为11111.jpg,如下图所示:
3. 开始菜单打开命令行,定位到Tesseract-OCR目录,输入命令:
其中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文,7表示把图像看作一个单文本行。3. 打开Tesseract-OCR目录下的result.txt文件,看到识别的结果为764-2316857,有2个字符识别错误,识别率还不是很高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。下面介绍一下具体训练样本的方法。
训练样本
关于如何训练样本,Tesseract-OCR官网有详细的介绍http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过我自己做的例子来介绍一下如何进行样本训练。
1.下载工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的,由于该工具是用JAVA开发的,需要安装JDK,才能运行。可以在http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载Java SE Development Kit 7u71,看你电脑的具体需求环境。
2.把所有的需要训练的图片合并为一张tiff格式的图片,如何合并呢?通过jTessBoxEditor中的Merge Tiff 来完成,不过他的小缺点就是只能合并多张tiff格式的,如果你的图片是jpg的,需要先通过格式工厂转换为tif。
3.合并图像。运行jTessBoxEditor工具,在点击菜单栏中Tools--->Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并成new.font.exp0.tif文件。
4.生成Box File文件。在new.font.exp0.tif所在的目录下打开一个命令行,输入:
生成的BOX文件为new.font.exp0.box,该文件记录了tesseract识别出来的每一个字和其位置坐标。
注:Make Box File的命令格式为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox 其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。
注意:在使用中发现,在上述识别生成box文件的过程中需要加上适当的参数才能保证识别率,否则真的是惨不忍睹啊!
-lng eng (指定使用英文字库识别样本中的验证码。注意:一个减号)
--psm 7 (强调图像中为单行文字,很重要!注意:两个减号)
digits (字符集中只含字母数字,有没有效果需要实验,前面不需要加引号,与上面的参数用空格隔开就行)
5.文字校正。使用jTessBoxEditor中的Box Editor打开new.font.exp0.tif文件,需要记住的是第4步生成的new.font.exp0.box要和这个new.font.exp0.tif文件同在一个目录下。如下图所示,可以看出有些字符识别的不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。
6.定义字体特征文件。Tesseract-OCR3.01以上的版本在训练之前需要创建一个名称为font_properties的字体特征文件。
font_properties不含有BOM头,文件内容格式如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。
在样本图片所在目录下创建一个名称为font_properties的文件,
.
用记事本打开,输入以下下内容:
这里全取值为0,表示字体不是粗体、斜体等等。
7.生成语言文件
在样本图片所在目录下创建一个批处理文件rem,
输入如下内容:
echo Run Tesseract for Training..
tesseract.exe new.font.exp0.tif new.font.exp0 nobatch box.train
echo Compute the Character Set..
unicharset_extractor.exe new.font.exp0.box
mftraining -F font_properties -U unicharset -O new.unicharset new.font.exp0.tr
echo Clustering..
cntraining.exe new.font.exp0.tr
echo Rename Files..
rename normproto new.normproto
rename inttemp new.inttemp
rename pffmtable new.pffmtable
rename shapetable new.shapetable
echo Create Tessdata..
combine_tessdata.exe new. (这里new后面的 . 不能缺少)
tesseract.exe new.font.exp0.tif new.font.exp0 nobatch box.train
echo Compute the Character Set..
unicharset_extractor.exe new.font.exp0.box
mftraining -F font_properties -U unicharset -O new.unicharset new.font.exp0.tr
echo Clustering..
cntraining.exe new.font.exp0.tr
echo Rename Files..
rename normproto new.normproto
rename inttemp new.inttemp
rename pffmtable new.pffmtable
rename shapetable new.shapetable
echo Create Tessdata..
combine_tessdata.exe new. (这里new后面的 . 不能缺少)
最后把批处理文件rem的后缀改为.bat 。
将批处理通过命令行执行(call rem)。执行后的结果如下:必须确定的是Offset 1、3、4、5、13的数据不是-1,那么一个新的字典就算生成了。
new.traineddata是最终生成的字典。将生成的new.traineddata拷贝到Tesseract-OCR-->tessdata目录下。以后就可以使用该该字典来识别了,例如:
需要注意的是:因为这时是使用自己的材料库来进行识别,所以调用时就不要在后面加 digits 参数了,否则你会怀疑上面的训练是不是白做了!