由于tesseract的中文语言包“chi_sim”对中文手写字体或者环境比较复杂的图片,识别正确率不高,因此需要针对特定情况用自己的样本进行训练,提高识别率,通过训练,也可以形成自己的语言库。
Linux和windows的系统方法一样,就是下面改名的地方,linux用的mv 命令,windows要用rename命令 , linux下要先安装 tesseract-ocr
sudo apt install tesseract-ocr
步骤:
1、工具准备:
(1)官方文档:https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00
(2)Java虚拟机,由于jTessBoxEditor的运行依赖Java运行时环境,所以需要安装Java虚拟机。
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(3)jTessBoxEditor2.0工具,用于调整图片上文字的内容和位置,
下载地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
安装包解压后运行的“jTessBoxEditor.jar”,,就可以打开该工具了。
java -jar jTessBoxEditor.jar // linux下
2、样本图片准备:(进行训练的样本图片数量越多越好)
这里只准备2种不同字体样本进行测试:
3、使用jTessBoxEditor生成训练样本的的合并tif图片:
(1)打开jTessBoxEditor,选择Tools->Merge TIFF,进入训练样本所在文件夹,选中要参与训练的样本图片:
(2)点击 “打开” 后弹出保存对话框,选择保存在当前路径下,文件命名为 “zwp.test.exp0.tif” ,格式只有一种 “TIFF” 可选。
tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言,fontname是字体,num为自定义数字。
比如我们要训练自定义字库 zwp,字体名test,那么我们把图片文件命名为 zwp.test.exp0.tif
4、使用tesseract生成.box文件:
在上一步骤生成的“zwp.test.exp0.tif”文件所在目录下打开命令行程序,执行下面命令,执行完之后会生成zwp.test.exp0.box文件。
tesseract zwp.test.exp0.tif zwp.test.exp0 -l chi_sim -psm 7 batch.nochop makebox
5、使用jTessBoxEditor矫正.box文件的错误:
.box文件记录了每个字符在图片上的位置和识别出的内容,训练前需要使用jTessBoxEditor调整字符的位置和内容。
打开jTessBoxEditor点击Box Editor ->Open,打开步骤2中生成的“zwp.test.exp0.tif”,会自动关联到“zwp.test.exp0.box”文件,这两文件要求在同一目录下。调整完点击“save”保存修改。(有merge,split ,insert.delete等操作,同时可以将包含字的框进行调节 ,图中用调整位置标红)
6、生成font_properties文件:(该文件没有后缀名)
(1)执行命令,执行完之后,会在当前目录生成font_properties文件
echo test 0 0 0 0 0 >font_properties
(2)也可以手工新建一个名为font_properties的文本文件,输入内容 “test 0 0 0 0 0” 表示字体test的粗体、倾斜等共计5个属性。这里的“test”必须与“zwp.test.exp0.box”中的“test”名称一致。
7、使用tesseract生成.tr训练文件:
执行下面命令,执行完之后,会在当前目录生成zwp.test.exp0.tr文件。
tesseract zwp.test.exp0.tif zwp.test.exp0 nobatch box.train
8、生成字符集文件:
执行下面命令:执行完之后会在当前目录生成一个名为“unicharset”的文件。
unicharset_extractor zwp.test.exp0.box
9、生成shape文件:
执行下面命令,执行完之后,会生成 shapetable 和 zwp.unicharset 两个文件。
shapeclustering -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr
10、生成聚字符特征文件:
执行下面命令,会生成 inttemp、pffmtable、shapetable和zwp.unicharset四个文件。
mftraining -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr
11、生成字符正常化特征文件:
执行下面命令,会生成 normproto 文件。
cntraining zwp.test.exp0.tr
12、文件重命名:
重新命名inttemp、pffmtable、shapetable和normproto这四个文件的名字为[lang].xxx。
这里修改为zwp.inttemp、zwp.pffmtable、zwp.shapetable和zwp.normproto
执行下面命令:
mv normproto zwp.normproto
mv inttemp zwp.inttemp
mv pffmtable zwp.pffmtable
mv shapetable zwp.shapetable
13、合并训练文件:
执行下面命令,会生成zwp.traineddata文件。
combine_tessdata zwp.
Log输出中的Offset 1、3、4、5、13这些项不是-1 (其余的不用在意),表示新的语言包生成成功。
** 将生成的“zwp.traineddata”语言包文件复制到Tesseract-OCR 安装目录下的tessdata文件夹中,就可以使用训练生成的语言包进行图像文字识别了。**
14、测试:
输入下面命令,-l后面为训练生成的语言包。(当然在输入下面的命令之前,将生成的“zwp.traineddata”语言包文件复制到Tesseract-OCR 安装目录下的tessdata文件夹中,就可以使用训练生成的语言包进行图像文字识别了)
tesseract test.PNG test -l zwp
使用新训练的语言包进行文字识别后,会发现之前识别不出来的文字也可以识别出来了。
关于合并字库,
只需要有tif和box两个文件就可以合并了.上面的步骤执行到第6步差不多都是一样的,唯一不同就是名字,上面说道,名字的第二个单词是字体,也就是zwp.test.exp0.tif 中的test. 这个test(自己定义)可以一样,然后第6步也和上面的一样, 比如zwp.test.exp0.tif
zwp.test.exp1.tif等
从7步开始不太一样,首先要生成的是所有box文件的tr文件
tesseract zwp.test.exp0.tif zwp.test.exp0 nobatch box.train
tesseract zwp.test.exp1.tif zwp.test.exp1 nobatch box.train
tesseract zwp.test.exp2.tif zwp.test.exp2 nobatch box.train
8.提取字符
unicharset_extractor zwp.test.exp0.box zwp.test.exp2.box zwp.test.exp3.box
9.执行下面命令,执行完之后,会生成 shapetable 和unicharset 两个文件
shapeclustering -F font_properties -U unicharset -O unicharset zwp.test.exp0.tr zwp.test.exp1.tr zwp.test.exp2.tr
10、生成聚字符特征文件:
执行下面命令,会生成 inttemp、pffmtable、shapetable和unicharset四个文件。
mftraining -F font_properties -U unicharset -O unicharset zwp.test.exp0.tr
11、生成字符正常化特征文件:
执行下面命令,会生成 normproto 文件。
cntraining zwp.test.exp0.tr
12.然后将上面生成的五个文件全部改名为 zwp开头的 , 如: zwp.inttemp
执行下面命令:
mv unicharset zwp.unicharset
mv normproto zwp.normproto
mv inttemp zwp.inttemp
mv pffmtable zwp.pffmtable
mv shapetable zwp.shapetable
13.合并所有文件,生成一个大的字库文件,
combine_tessdata zwp.
原文:https://blog.youkuaiyun.com/a745233700/article/details/80175883