参考:http://blog.csdn.net/yasi_xi/article/details/8763385
概述:用4幅手写数字图片为训练样本,1幅为测试样本,按下面方法得Tesseract-OCR新字库num.traineddata。最终识别结果准确率较高。
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
一 前期准备
1.下载并安装tesseract-ocr
我下载的是tesseract-ocr-setup-3.02.02.exe,安装路径为D:\Program Files (x86)\Tesseract-OCR。
尽量不安装在C盘,因为有写限制,不方便。
2.下载并解压jTessBoxEditor
jTessBoxEditor的作用:(1).将多幅图片合并成1幅.tif文件;(2).更正识别错误的字符。
jTessBoxEditor是用java写的,运行前还要安装jre(Java RuntimeEnvironment)。
3.准备训练图片和测试图片
训练图片 1.jpg
训练图片 2.jpg
训练图片 3.jpg
训练图片 4.jpg
测试图片 test.jpg
4.合并训练图片
打开jTessBoxEditor.jar,点击菜单栏Tools→ Merge TIFF...;
选择多幅训练图片(1.jpg、2.jpg、3.jpg、4.jpg),点击打开;
输入.tif文件名“num.font.exp0”,点击保存,得num.font.exp0.tif,存放路径为D:\train。
────────────────────────────────────────────────
二 Tesseract-OCR训练
1.打开cmd命令行,进入num.font.exp0.tif所在目录
D:
cd D:\train
2.生成box文件
得num.font.exp0.box。box文件为Tesseract识别出的字符结果及字符在图片中位置信息。在命令行输入:
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
注意:box文件命名有一定规则,不能随便乱取名字,命名格式为:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
其中,lang为语言名称,fontname为字体名称,num为序号,3个都可以自定义。
注意:善用布局参数-psm,描述如下:
若图片为一行字符,可以在tesseract命令中添加"-psm 7";若图片为一个字符,可以在tesseract命令中添加"-psm 10";选择最合适的布局参数值,提高准确率。
3.识别结果校正
打开jTessBoxEditor.jar,点击工具栏Box Editor → Open,打开num.font.exp0.tif(必须将.box和.tif样本文件放在同一目录);
可以看到有些字符的识别结果不正确。校正每页图片中识别错误的字符Char,校正完成后Save退出。
注意:边框不能正确框住字符时,校正X、Y、Width、Weight的值。
也可以用记事本打开box文件校正字符,每个字符信息为“字符Char、方框左下角坐标、方框右上角坐标、在tif中序号”。修改速度更快。
4.新建字体特征文件
Tesseract-OCR3.01及以上版本在训练前要创建一个名称为font_properties的字体特征文件(新建.txt文件,去掉.txt后缀,命名为font_properties)。
用记事本打开font_properties文件,输入内容并保存:
font 0 0 0 0 0
注意:font_properties文件内容格式为:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
其中,<fontname>为字体名称,必须与[lang].[fontname].exp[num].box中的[fontname]保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>表示字体属性,取值为0或1。上面全0表示不是粗体、斜体等,即这个字库的字体为普通字体。
5.生成字库文件
在命令行输入:
tesseract num.font.exp0.tif num.font.exp0 nobatch box.train
unicharset_extractor num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr
cntraining num.font.exp0.tr
此时,在目录下生成了若干文件。把normproto、inttemp、pffmtable、shapetable这四个文件加上前缀"num.":
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
在命令行输入:
combine_tessdata num.
注意:不要漏掉末尾的"."
cmd界面显示:
注意:必须确定Offset 1、3、4、5、13的数据都不是-1。否则,找出前面哪步出错或重做一遍。
得到num.traineddata,一个新的字库生成了。将num.traineddata复制到D:\Program Files (x86)\Tesseract-OCR\tessdata目录下,可以用来识别字符了。
────────────────────────────────────────────────
三 使用新字库识别图片
对比使用原字库和新字库的识别结果。在命令行输入:
tesseract test.jpg 1
tesseract test.jpg 2 -l num
其中,test.jpg为测试样本,要在当前目录下;1.txt、2.txt为识别结果。
识别结果:
原字库识别结果
新字库识别结果
新字库识别结果中,除了"9"识别为"7"外,其它字符都能正确识别。与原字库识别结果比较,正确率显然更高。
当然,训练样本更多时,正确率会进一步提高。