由于tesseract的中文语言包“chi_sim”对中文手写字体或者环境比较复杂的图片,识别正确率不高,因此需要针对特定情况用自己的样本进行训练,提高识别率,通过训练,也可以形成自己的语言库。

对其他语言库有兴趣的:​​https://github.com/tesseract-ocr/tessdata​

mac安装:brew install tesseract

1.前期准备工作:

1. 安装 jdk1.8或以上 配置jdk环境变量

2. 安装 tesseract-ocr 4.0

下载地址:https://digi.bib.uni-mannheim.de/tesseract/


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录

配置环境变量:系统变量path添加 C:\Program Files (x86)\Tesseract-OCR; D:\Tesseract-OCR(对应自己的tesseract安装目录)

3. jTessBoxEditor2.0工具,用于调整图片上文字的内容和位置,

下载地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

安装包解压后双击里边的“jTessBoxEditor.jar”,或者双击该目录下的“train.bat”脚本文件,就可以打开该工具了。


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_02

4.准备Tess4J-3.4.8 下载: ​​https://sourceforge.net/projects/tess4j/files/tess4j/​

解压即可得到 tessdata训练库(后面自定义的语言库会用到)


Tesseract4.0训练字库 OCR 提高识别率必备_下载地址_03


2.样本图片准备:(进行训练的样本图片数量越多越好)

这里只准备2种不同字体样本进行测试:


Tesseract4.0训练字库 OCR 提高识别率必备_自定义_04 Tesseract4.0训练字库 OCR 提高识别率必备_自定义_05


3.使用jTessBoxEditor生成训练样本的的合并tif图片:

(1)打开jTessBoxEditor,选择Tools->Merge TIFF,进入训练样本所在文件夹,选中要参与训练的样本图片:


Tesseract4.0训练字库 OCR 提高识别率必备_desktop_06

(2)点击 “打开” 后弹出保存对话框,选择保存在当前路径下,文件命名为 “zwp.test.exp0.tif” ,格式只有一种 “TIFF” 可选。


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_07

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 batch.nochop makebox


Tesseract4.0训练字库 OCR 提高识别率必备_.net_08

5.使用jTessBoxEditor矫正.box文件的错误:

.box文件记录了每个字符在图片上的位置和识别出的内容,训练前需要使用jTessBoxEditor调整字符的位置和内容。

打开jTessBoxEditor点击Box Editor ->Open,打开步骤2中生成的“zwp.test.exp0.tif”,会自动关联到“zwp.test.exp0.box”文件,这两文件要求在同一目录下。调整完点击“save”保存修改。


Tesseract4.0训练字库 OCR 提高识别率必备_下载地址_09

注意采坑点:1.修改文字是乱码

Tesseract4.0训练字库 OCR 提高识别率必备_.net_10


解决方法: jtessboxeditor的setting ---> Font 里改字体为宋体,regular就可以了。


Tesseract4.0训练字库 OCR 提高识别率必备_自定义_11


                    2.修改文字必须是白底黑字,要不然训练时会出现错误

6.生成font_properties文件:(该文件没有后缀名)

(1)执行如下命令: 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


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_12


8.生成字符集文件:

执行下面命令:执行完之后会在当前目录生成一个名为“unicharset”的文件。

执行命令: unicharset_extractor zwp.test.exp0.box


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_13


9、生成shape文件:

执行下面命令,执行完之后,会生成 shapetable 和 zwp.unicharset 两个文件。

执行命令: shapeclustering -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr


Tesseract4.0训练字库 OCR 提高识别率必备_.net_14

10、生成聚字符特征文件:

执行下面命令,会生成 inttemp、pffmtable、shapetable和zwp.unicharset四个文件。

执行命令: mftraining -F font_properties -U unicharset -O zwp.unicharset zwp.test.exp0.tr


Tesseract4.0训练字库 OCR 提高识别率必备_下载地址_15

11、生成字符正常化特征文件:

执行下面命令,会生成 normproto 文件。

执行命令: cntraining zwp.test.exp0.tr


Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_16

12、文件重命名:

重新命名inttemp、pffmtable、shapetable和normproto这四个文件的名字为[lang].xxx。

这里修改为zwp.inttemp、zwp.pffmtable、zwp.shapetable和zwp.normproto

执行下面命令:

rename normproto zwp.normproto

rename inttemp zwp.inttemp

rename pffmtable zwp.pffmtable

rename shapetable zwp.shapetable


Tesseract4.0训练字库 OCR 提高识别率必备_自定义_17

13、合并训练文件:

执行下面命令,会生成zwp.traineddata文件。

执行命令: combine_tessdata zwp.


Tesseract4.0训练字库 OCR 提高识别率必备_自定义_18

Log输出中的Offset 1、3、4、5、13这些项不是-1,表示新的语言包生成成功。

将生成的“zwp.traineddata”语言包文件复制到Tesseract-OCR 安装目录下的tessdata文件夹中,就可以使用训练生成的语言包进行图像文字识别了。


Tesseract4.0训练字库 OCR 提高识别率必备_自定义_19

三、代码测试

1.maven 依赖 (依赖过程有点儿漫长→_→)

<dependency>

<groupId>net.java.dev.jna</groupId>

<artifactId>jna</artifactId>

<version>4.1.0</version>

</dependency>

<dependency>

<groupId>net.sourceforge.tess4j</groupId>

<artifactId>tess4j</artifactId>

<version>3.4.0</version>

<exclusions>

<exclusion>

<groupId>com.sun.jna</groupId>

<artifactId>jna</artifactId>

</exclusion>

</exclusions>

</dependency>

2.测试代码

public void testOCR()throws Exception {

//你的图片路径 51.png 为我自定义图片名字 其实使用的就是 上面的测试图片

File imageFile =new File("C:\\Users\\ljf\\Desktop\\51.png");

//你训练库的路径 tessdata

instance.setDatapath("C:\\Users\\ljf\\Desktop\\tessdata");

//你刚刚新建的语言库 zwp (还记得吗?)

instance.setLanguage("zwp");

String result =instance.doOCR(imageFile);

System.out.println(result);

}

3.输出结果

Tesseract4.0训练字库 OCR 提高识别率必备_当前目录_20 著作权归作者所有。