zoukankan      html  css  js  c++  java
  • Tesseract4.0 5.0训练字库 OCR 提高识别率必备(超详情)

    由于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/

      配置环境变量:系统变量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”脚本文件,就可以打开该工具了。

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

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

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

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

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

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

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

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

    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

    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

    执行下面命令:

    rename normproto zwp.normproto

    rename inttemp zwp.inttemp

    rename pffmtable zwp.pffmtable

    rename shapetable zwp.shapetable

    13、合并训练文件:

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

    执行命令: combine_tessdata zwp.

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

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

    三、代码测试

    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.输出结果

  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/interdrp/p/15423165.html
Copyright © 2011-2022 走看看