tesseract-ocr 如何训练新语言 && 字符识别---样本训练
来源:互联网 发布:阿里云发布网站 编辑:程序博客网 时间:2024/04/28 21:48
作者:jolly wang
- tessdata/eng.config
- tessdata/eng.unicharset
- tessdata/eng.unicharambigs
- tessdata/eng.inttemp
- tessdata/eng.pffmtable
- tessdata/eng.normproto
- tessdata/eng.punc-dawg
- tessdata/eng.word-dawg
- tessdata/eng.number-dawg
- tessdata/eng.freq-dawg
- ASCII 或者 utf8 编码,没有BOM
- uinx行结尾符('\n')
- 文件尾空行(否则:将得到错误信息:last_char == '\n':Error:Assert failed..)
- 确保每个字符的最小数目的样本。10很好,但5只对少数字符有效。
- 常用字符的样本应更多:至少20个。
- 不要将所有非字母组合在一起。让文件更实际化。例如,“The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.{}<>/?”,这个就很糟糕。而这个则更好:“The (quick) brown {fox} jumps! over the $3,456.78<lazy> #90 dog & duck/goose, as 12.5% of E-mail from aspammer@website.com is spam?” ,这个给出了文本行查找码,来获取特定字符的基标语义。
- 当打印时,文本空格绝对安全。。。。。。
- 训练数据应该按字体分组。。。。。
- 没必要训练多个size的文本。。。。。
- 不要在一个image文件混合多种字体(确切的说:在单个.tr文件中),它将造成丢弃一些特征,导致识别错误
- 下载页的boxtiff文件将帮助你如何格式化你的训练数据。
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
tesseract eng.timesitalic.exp0.tif eng.timesitalic.exp0 batch.nochop makebox
s 734 494 751 519 0p 753 486 776 518 0r 779 494 796 518 0i 799 494 810 527 0n 814 494 837 518 0g 839 485 862 518 0t 865 492 878 521 0u 101 453 122 484 0b 126 453 146 486 0e 149 452 168 477 0r 172 453 187 476 0d 211 451 232 484 0e 236 451 255 475 0n 259 452 281 475 0
D 101 504 131 535 0e 135 502 154 528 0r 158 503 173 526 0, 197 498 206 510 0, 206 497 214 509 0s 220 501 236 526 0c 239 501 258 525 0h 262 502 284 534 0n 288 501 310 525 0e 313 500 332 524 0l 336 501 347 534 0l 352 500 363 532 0e 367 499 386 524 0” 389 520 407 532 0
- 第一个数(左)采用两行中最小的(197)
- 第二个数(下)采用两行中最小的(496)
- 第三个数(右)采用两行中最大的(214)
- 第四个数(上)采用两行中最大的(508)
D 101 504 131 535 0e 135 502 154 528 0r 158 503 173 526 0? 197 497 214 510 0s 220 501 236 526 0c 239 501 258 525 0h 262 502 284 534 0n 288 501 310 525 0e 313 500 332 524 0l 336 501 347 534 0l 352 500 363 532 0e 367 499 386 524 0” 389 520 407 532 0
tesseract fontfile.tif fontfile -l yournewlanguage batch.nochop makebox
- 过滤box文件,只保持你想要的字符。
- 运行tesseract来训练。
- 对于每种字体,从多个语言中cat出.tr文件,来获取你想要的字符休,并从你有的字体或字符中添加.tr文件
- 以相同的方式cat出已经过滤的box文件到.tr文件中,以便在unicharset_extractor中处理
- 运行训练过程的其它步骤
tesseract fontfile.tif junk nobatch box.train
tesseract fontfile.tif junk nobatch box.train.stderr
Every character in the box file has a corresponding set of entries inthe .tr file (in order) like thisUnknownFont <utf8 code(s)> 2mf <number of features>x y length dir 0 0... (there are a set of these determined by <number of features>above)cn 1ypos length x2ndmoment y2ndmomentThe mf features are polygon segments of the outline normalized to the1st and 2nd moments.x= x position [-0.5.0.5]y = y position [-0.25, 0.75]length is the length of the polygon segment [0,1.0]dir is the direction of the segment [0,1.0]The cn feature is to correct for the moment normalization todistinguish position and size (eg c vs C and , vs ')
unicharset_extractor fontfile_1.box fontfile_2.box ...
- ';' 为非字母字符,小写字符,大小字符,而非数字。它的属性通过二进制数 10000表示(16进制的10表示 )
- 'b'是一个字母字符,小写字符。它的属性通过二进制数00011表示(3)
- 'W'是一个字母字符,大写字符。它的属性通过二进制数00101表示(5)
- '7'只是一个数字。它的属性通过二进制数01000表示(8)
- ‘=’非数字或字母字符。它的属性通过二进制数字00000表示(0)
; 10 Common 46b 3 Latin 59W 5 Latin 407 8 Common 66= 0 Common 93
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
timesitalic 1 0 0 1 0
shapeclustering -F font_properties -U unicharset eng.timesitalic.exp0.trmftraining -F font_properties -U unicharset -O eng.unicharset eng.timesitalic.exp0.tr
shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...
mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr ...
cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr ...
wordlist2dawg frequent_words_list lang.freq-dawg lang.unicharsetwordlist2dawg words_list lang.word-dawg lang.unicharset
v13 I I 0 2 u o 33 I - I 1 H 22 ' ' 1 " 12 ?? 6 1 ?? 11 m 2 r n 03 i i i 1 m 0
combine_tessdata lang.
tesseract image.tif output -l lang
原文地址:http://wangjunle23.blog.163.com/blog/static/117838171201323031458171/
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,目前发布在Googel Project上。地址为http://code.google.com/p/tesseract-ocr/。
使用默认的语言库识别
1.安装Tesseract
3. 打开命令行,定位到Tesseract-OCR目录,输入命令:
- tesseract.exe number.jpg result -l eng
其中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。
3. 打开Tesseract-OCR目录下的result.txt文件,看到识别的结果为7542315857,有3个字符识别错误,识别率还不是很高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。下面介绍一下具体训练样本的方法。
训练样本
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为序号,可以随便定义。
【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文件中修改。
font_properties不含有BOM头,文件内容格式如下:
- <fontname> <italic> <bold> <fixed> <serif> <fraktur>
其中fontname为字体名称,必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。
这里在样本图片所在目录下创建一个名称为font_properties的文件,用记事本打开,输入以下下内容:
- font 0 0 0 0 0
- rem 执行改批处理前先要目录下创建font_properties文件
- echo Run Tesseract for Training..
- tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train
- echo Compute the Character Set..
- unicharset_extractor.exe num.font.exp0.box
- mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr
- echo Clustering..
- cntraining.exe num.font.exp0.tr
- echo Rename Files..
- rename normproto num.normproto
- rename inttemp num.inttemp
- rename pffmtable num.pffmtable
- rename shapetable num.shapetable
- echo Create Tessdata..
- combine_tessdata.exe num.
将批处理通过命令行执行。执行后的结果如下:
需确认打印结果中的Offset 1、3、4、5、13这些项不是-1。这样,一个新的语言文件就生成了。
num.traineddata便是最终生成的语言文件,将生成的num.traineddata拷贝到Tesseract-OCR-->tessdata目录下。可以用它来进行字符识别了。
使用训练后的语言库识别
用训练后的语言库识别number.jpg文件, 打开命令行,定位到Tesseract-OCR目录,输入命令:
- tesseract.exe number.jpg result -l eng
识别结果如如图所示,可以看到识别率提高了不少。通过自定义训练样本,可以进行图形验证码、车牌号码识别等。感兴趣的朋友可以研究研究。
【Yasi】试验结果如下:
下面是num-yasi.png将生成的num.traineddata拷贝到E:\tesseract\tessdata,即环境变量TESSDATA_PREFIX 设置的路径下,执行下面的命令(注意第二条命令结尾是num,即新加的traineddata,而不是eng)
- E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-eng -l eng
- E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-num -l num
下图是两次识别结果对比
使用eng traineddata的结果完全不靠谱;使用了自己的traineddata,识别出来的当然都是数字,但正确率实在糟糕。可能是我自己手写的字体和用来做traineddata的手写数字的字体差别太大了吧。
原文地址:http://blog.csdn.net/yasi_xi/article/details/8763385
- tesseract-ocr 如何训练新语言 && 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别-样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练
- Tesseract-OCR 字符识别---样本训练 [转]
- Tesseract-OCR 字符识别---样本训练
- java正则表达式详解Pattern类和Matcher类
- ubuntu server 16.04离线安装docker 1.12.3的探索
- DEV——ComboBoxEdit(barEditItem)
- OAuth
- Android Studio 的 Android Monitor / DDMS 中不显示应用的进程(看不到 log)
- tesseract-ocr 如何训练新语言 && 字符识别---样本训练
- 解决方案
- Java 使用ArrayList.add() 前面所有值被 覆盖 的问题
- 博文整理
- centos7安装mysql
- mysql如何查看自己数据库文件所在的位置
- ansible学习之旅---1.安装和配置
- openwrt-njit-client --我的笔记(2.6)
- Python2.7在win10下的安装配置