tesseract OCR文本识别与训练

原创
2021/03/05 20:42
阅读数 3.1K

1、工具下载
tesseract源码下载:https://github.com/tesseract-ocr/tesseract
tesseract安装包下载:https://digi.bib.uni-mannheim.de/tesseract/
tesseract语言包下载: https://github.com/tesseract-ocr/tessdata
jTessBoxEditor下载:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

2、识别文字
下载tesseract中文语言包chi_sim.traineddata,并放入tesseract程序中的Tesseract-OCR\tessdata目录中
执行命令识别文字

tesseract penngo.normal.exp0.png result -l chi_sim
参数说明
penngo.normal.exp0.png 需要识别的文字图片
result 识别结果 
-l chi_sim 指定识别语言,chi_sim为中文简体

如果识别不准确,就需要自己训练字体识别库
3、训练识别库
(1)使用jTessBoxEditor把penngo.normal.exp0.png转成tif,打开菜单Tools->Merge TIFF,同时文件名保存为penngo.normal.exp0.tif
tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言,fontname是字体,num为自定义数字。

(2)生成box文件penngo.normal.exp0.box

tesseract penngo.normal.exp0.tif penngo.normal.exp0 -l chi_sim batch.nochop makebox

(3)jTessBoxEditor调整.box训练文件
“.box” 文件中保存每个字符在图片上的位置以及识别出的内容,训练之前,可以使用jTessBoxEditor调整字符位置和内容,纠正识别错误的内容。
打开jTessBoxEditor点击Box Editor -> Open ,打开步骤(2)中生成的 “penngo.normal.exp0.tif” ,程序会自动关联到 “penngo.normal.exp0.box” 文件。

(4)生成font_properties文件,
执行如下命令:echo normal 0 0 0 0 0 > font_properties
或者记事本新建font_properties,然后输入内容normal 0 0 0 0 0
注意normal与penngo.normal.exp0中的normal一致

(5)使用 tesseract 生成penngo.normal.exp0.tr文件

tesseract penngo.normal.exp0.tif penngo.normal.exp0 nobatch box.train

(6)生成字符集文件

unicharset_extractor penngo.normal.exp0.box

(7)生成字典数据

mftraining -F font_properties -U unicharset -O penngo.unicharset penngo.normal.exp0.tr

生成:penngo.unicharset、shapetable、inttemp、pffmtable四个文件

cntraining penngo.normal.exp0.tr

生成:normproto文件

修改4 个文件(inttemp、pffmtable、normproto、shapetable)的名称为 [lang].xxx。这里改为 penngo.inttemp、penngo.pffmtable、penngo.normproto、penngo.shapetable。


(8)合并数据文件

combine_tessdata penngo.

将生成的 “penngo.traineddata” 语言包文件拷贝到 tessdata 目录下,就可以用它来进行中文字符识别了。

4、测试训练结果

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.penngo.tesseract</groupId>
  <artifactId>tesseract</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>tesseract</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>11</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>net.sourceforge.tess4j</groupId>
      <artifactId>tess4j</artifactId>
      <version>4.5.4</version>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <id>alimaven</id>
      <name>Maven Aliyun Mirror</name>
      <url>https://maven.aliyun.com/repository/central</url>
    </repository>
  </repositories>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
package com.penngo.tesseract;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;

public class TesseractExample {
    public static void main(String[] args) {
        File imageFile = new File("logs/tess1/penngo.normal.exp0.png");
        ITesseract instance = new Tesseract();
        instance.setDatapath("tessdata");
        instance.setLanguage("penngo");
        try {
            String result = instance.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }
    }
}

源码下载

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部