Tesseract程序识别

程序源码 tesseract项目的github地址 (Linux下可通过包管理器下载安装)

基本使用

注意点:1,图片文件类型为tiff/tif,2,output是输出文件名,执行命令后的输出文件是output.txt

tesseract 图片路径名 输出文件名

示例如下

tesseract /home/newcih/a.tiff output

Linux下图片类型转换工具,为了便于批量操作,这里提供命令行工具 convert,该工具在软件ImageMagick包下,可以通过安装这个获取工具

此时可以打开文件output.txt查看识别结果

jTessBoxEditor工具进行训练

程序下载 VietOCR的sourceforge地址

tesseract程序默认使用eng字体进行识别,在输入的图片文件由自定义字体或不明字体的数字或字母或文字组成时,需要使用训练工具进行矫正,这里使用jTessBoxEditor工具(本人下载FX版本,即JavaFX开发,需要JDK 8 支持)(训练的最终结果是生成一款字体识别文件,文件类型是.traineddata,而该工具只是更新box文件),界面如下

这里写图片描述

合并所有待训练的tiff/tif文件

这里写图片描述

合并后进行保存,(文件名的规范是 语言名+字体名的形式等),如 mylang.myfont.exp0.tif(以下教程以该文件名进行描述),合并完成后,使用tesseract工具生成box文件,以进行训练

tesseract mylang.myfont.exp0.tif mylang.myfont.exp0 -l eng -psm 7 batch.nochop makebox

生成后的box文件为mylang.myfont.exp0.box

使用jTessBoxEditor工具进行矫正

这里写图片描述

在该选项卡打开合并后的mylang.myfont.exp0.tif文件,此时jTessBoxEditor将自动加载mylang.myfont.exp0.box,界面如下
这里写图片描述

使用说明

  • Box Coordinates
    这里显示的数据与右边的图片的红色方框内的文字相对应,双击可以进行修改(即矫正部分被tesseract错误识别的数字)

  • 工具栏
    工具栏有Merge,Split,Insert,Delete,这是对图片的操作,点击右边的图片,可以通过工具栏进行图块的合并分割新增,和删除,最终应保证被识别数值在图块里。

  • 分页栏
    下方有分页按钮,当初合并了多少个tiff/tif文件,这里就有多少个页面,需要一一进行矫正。


生成box文件成功后,开始训练,训练方式有两种,可以自行选择(旧版本的jTessBoxEditor工具可能会在某一步崩溃,所以提供Linux Shell版本选择)。

生成字体训练数据(使用jTessBoxEditor工具)

打开菜单项Trainer,设置参数如下:

  • Tesseract Executables tesseract的执行路径
  • Training Data 存放tiff文件box文件的目录
  • Language 自己为新字体起的名字
  • Train with Existing Box 选择该模式,表示根据已有box文件进行训练
  • Run 点击运行即可

这里写图片描述

运行结果截图

这里写图片描述

结果判断 : 第1,3,4,5,13项有值即可,即存在 .unicharset .inttemp .pffmtable .normproto .shapetable这5个文件即可。生成的目标文件在目录下(该目录即存放tiff/tif和box文件的目录)的tessdata文件夹下

生成字体训练数据(使用命令行)

jTessBoxEditor不一定一直可靠,所以这里提供Linux Shell的脚本

#!/bin/bash

echo -e "\033[37m 前提:请将合并后的tif文件命名为 mylang.myfont.exp0.tif,执行该命令之前,请先生成box,执行makeBox即可 \033[0m"

echo -e "\033[37m 正在生成font_properties文件... \033[0m"
echo myfont 0 0 0 0 0 > font_properties
echo -e "\033[37m font_properties文件生成成功 \033[0m"

echo -e "\033[37m 正在生成训练文件... \033[0m"
tesseract mylang.myfont.exp0.tif mylang.myfont.exp0 -l eng -psm 7 nobatch box.train
echo -e "\033[37m 训练文件生成成功 \033[0m"

echo -e "\033[37m 正在字符集文件... \033[0m"
unicharset_extractor mylang.myfont.exp0.box
echo -e "\033[37m 字符集文件生成成功 \033[0m"

echo -e "\033[37m 正在生成shape文件... \033[0m"
shapeclustering -F font_properties -U unicharset -O mylang.unicharset mylang.myfont.exp0.tr
echo -e "\033[37m 生成shape文件成功 \033[0m"

echo -e "\033[37m 正在生成聚集字符特征文件... \033[0m"
mftraining -F font_properties -U unicharset -O mylang.unicharset mylang.myfont.exp0.tr
echo -e "\033[37m 生成聚集字符特征文件成功 \033[0m"

echo -e "\033[37m 正在生成字符正常化特征文件... \033[0m"
cntraining mylang.myfont.exp0.tr
echo -e "\033[37m 生成字符正常化特征文件成功 \033[0m"

echo -e "\033[37m 更名生成的文件中... \033[0m"
mv normproto myfont.normproto
mv inttemp myfont.inttemp
mv pffmtable myfont.pffmtable
mv unicharset myfont.unicharset
mv shapetable myfont.shapetable
echo -e "\033[37m 更名生成的文件完成 \033[0m"

echo -e "\033[37m 合并训练文件,生成myfont.traineddata \033[0m"
combine_tessdata myfont.
echo -e "\033[37m 合并训练文件成功,最终输出的字体文件是 myfont.traineddata,请先将其移动到/usr/share/tesseract/tessdata文件夹,之后方可使用新字体识别图像 \033[0m"

这里提供接受参数的shell脚本下载(生成box文件生成训练数据

最后生成的myfont.traineddata是目标产物,需要放到tessdata文件夹方能生效,我的tesseract工具是通过命令行安装,所以tessdata文件夹在/usr/share/tesseract/tessdata中,之后便可以使用如下命令识别图片

tesseract 图片路径 -l myfont output

生成的字体文件是myfont.traineddata,则使用的时候,选择语言为myfont即可

Java API (tess4j) 识别字体

这里讲述使用Java API来实现图像识别,代码如下

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

public class Main {

    public static final String DATA_PATH = "/usr/share/tesseract/tessdata";

    public static void main(String[] args) {
        File       imageFile = new File("/home/newcih/Tesseract/00.tif");
        ITesseract instance  = new Tesseract();
        /**
         *  配置tessdata目录,该目录的位置已在上述教程说过,这个必须设置,也可以通过系统变量设置TESSDATA_PREFIX变量来实现,
         *  然而必须注意:通过系统变量实现,必须在设置完后重启,尤其是Linux存在父子Shell变量的作用域问题
         */
        instance.setDatapath(DATA_PATH);

        try {
            String result = instance.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
    }
}

目前本教程结束,后续会发布关于使用Java实现自动化训练的教程,谢谢大家

自动化训练项目地址( tesseractAutoTrain


本教程在Fedora 27下实践


备注知识

流程简要描述

这里简单介绍总体步骤

  1. 合并多个tiff/tif文件(一个tiff/tif生成一个对应的字体训练数据)
  2. 生成 .box类型的文件(记录了tesseract对tiff/tif图片的识别情况,如识别值,坐标跟大小)
  3. 进行训练(本教程使用jTessBoxEditor工具进行训练,原本也可以直接编辑box文件,鉴于tesseract对图块的划分无法直接在文本工具查看,所以借助该第三方工具。训练的直接结果,就是修改了box文件的数据
  4. 训练完成,保存训练结果。(整个过程就是更新了box文件
  5. 生成结果
    • 使用jTessBoxEditor工具
    • 使用Linux Shell命令行

Box文件结构

图片的坐标原点在左上角,适用于下面提到的x和y坐标

打开一个box文件如下
这里写图片描述

  • 一行代表一张tiff/tif图片的识别情况(使用jTessBoxEditor合并多张tiff/tif的结果仅仅是将多张tiff/tif存入,所以生成box文件时依然能正常识别出实际上有多少张)
  • 每行数据的各个数字代表的意义如下
    • 1 => tesseract识别的值
    • 2 => tesseract的识别图块的x坐标(即识别图块的左边的x坐标
    • 3 => tiff/tif图片的高度 - tesseract的识别图块的y坐标 - tesseract的识别图块的高度(即识别图块的底边的y坐标
    • 4 => tesseract的识别图块的x坐标 + tesseract识别图块的宽度(即识别图块的右边的x坐标
    • 5 => tiff/tif高度 - tesseract的识别图块的y坐标(即识别图块的顶边的y坐标
    • 6 => 该tiff/tif图片在合并后的tiff/tif图片的索引值,即位置
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐