• Tesseract-OCR 5.0LSTM训练流程


    本文主要参考以下几篇文章改编而成:

    http://ask.touchelf.net/ask/article/43.html

    https://zhuanlan.zhihu.com/p/77013854

    https://blog.csdn.net/yasi_xi/article/details/8763385

    简介

    OCR(Optical Character Recognition):光学字符识别,是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。
    Tesseract:开源的OCR识别引擎,初期Tesseract引擎由HP实验室研发,后来贡献给了开源软件业,后由Google进行改进、修改bug、优化,重新发布。

    声明

    本文仅适用于Tesseract-OCR5.0的环境;如果安装的是Tesseract-OCR4.0版本,训练过程请参考:http://ask.touchelf.net/ask/article/43.html

    如果使用Java的Tess4J插件,建议使用Tesseract-OCR4.0版本制作训练包;因为根据本人实测,Tesseract-OCR5.0做出来的训练包,在tess4j-3.4.8版本上,无法测试通过。

    下载与安装

    1、Tesseract-OCR的Windows版本下载地址:https://digi.bib.uni-mannheim.de/tesseract/,本文用的版本是tesseract-ocr-w64-setup-v5.0.0-alpha.20210811.exe。

    注意:安装完成之后,需要把安装目录(通常是:C:Program FilesTesseract-OCR)加入Path环境变量之中,以方便后面执行命令行工具。

    注意:Tesseract-OCR4.0版本,默认安装于C:Program Files (x86)Tesseract-OCR目录。我用的是Tesseract-OCR5.0,64位版本。

    注意:Tesseract-OCR4.0安装之后,需要设置TESSDATA_PREFIX环境变量,指向C:Program Files (x86)Tesseract-OCR essdata;Tesseract-OCR5.0,64位版本则不需要此操作。

    2、各版本对应字库下载地址:https://github.com/tesseract-ocr/tessdata_best,要识别简体中文需要下载chi_sim.traindata字库。

    注意:一定要用从上述链接中下载.traineddata文件;如果从原有tesseract-OCR中的.traineddata文件提取.lstm文件,会造成无法进行训练。我这里下载的是eng.traineddata,因为我不用它来识别中文。
    3、下载工具jTessBoxEditor,地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,将之解压缩到C盘某个目录。这个工具是用来训练样本用的,由于该工具是用JAVA开发的,需要安装JAVA虚拟机才能运行。

    注意:带FX的版本才支持中文。

    初步测试

    假定工作目录为:D:Work estlang,在此目录里面有一张测试图片:3024.jpg;假定Tesseract-OCR安装目录为:C:Program FilesTesseract-OCR,已经将此目录加入到Path环境变量中。

    打开命令行工具(我是以管理员身份打开的,没试过其它方式),切换到工作目录,执行:

    tesseract 3024.jpg result -l eng

    从资源管理器打开工作目录下的result.txt,里面的内容为:3M 2 A;显然,识别率不是很高。

    注意:-l 参数表明用何种语言包;如果是eng,则可以省略。

    训练

    步骤一、首先,准备足够多的训练图片

    将这些图片存放到工作目录orgin子目录,本文全部为JPG格式的图片。

    步骤二,通过画图软件,把这些图片转换为TIF格式

    保存完之后,原先的JPG图片已经无效,可以删除。

    步骤三、通过jTessBoxEditor,将这些TIF合并成一个文件

    资源管理器打开jTessBoxEditor解压缩目录,执行:train.bat;窗口打开之后,单击:Tools->Merge Tiff ,按住Shift键选择工作目录orgin下面的TIF文件,并把合并生成的TIF文件放到工作目录中,重新命名。我这里命名为:num.font.exp0.tif

    tif文件命名格式:[lang].[fontname].exp[num].tif
    tif命名规则:lang为语言名称,fontname为字体名称,num为图片序号;

    步骤四、生成box文件

    切换到命令行工具,在工作目录下执行:

    tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

    Make Box File的命令格式:tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox

    其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。

    注意:tif文件名必须与box文件名保持一致,且位于同一个目录。这么理解吧:TIF文件用来保存图像(可以保存多张图片,用Page来分页);BOX文件用来保存图像中文字的位置信息(每个字符的X、Y坐标,宽度、高度)。

    步骤五、文字校正(这一步是真正自己做的工作)

    运行jTessBoxEditor工具(如果已经打开,切换过去),点击Box Editor->Open,打开num.font.exp0.tif文件,如下图所示。可以看出有些字符识别不正确,需要对每张图片中识别错误的字符进行校正。

    窗口下方有翻页按钮;通过工具栏右上角的微调按钮,修正每个字符的X、Y坐标,宽度、高度。不要的点删除,增加有用的点(Delete、Insert)。

    校正完成,保存即可,建议每页修改完毕都按一次保存按钮,避免意外。至此,jTessBoxEditorg工具的使命完成。

     有文章说,如果jTessBoxEditor char列出现乱码,点击setting->font,然后选择宋体。我没试过,因为我识别英文。有此问题的同学,不妨试一下。

    步骤六、利用.tif和.box文件生成.lstmf文件用于lstm训练

    在工作目录,命令行工具执行:

    tesseract num.font.exp0.tif num.font.exp0 --psm 6 lstm.train

    参数含义:

    • num.font.exp0.tif 上一步生成的.tif 格式的文件
    • num.font.exp0 指明要生成的.lstmf文件的名称
    • -l eng 表示用到的语言,我这里训练的是英语,故省略
    • --psm 6 表示采用的识别模式,通常6 效果会好些

    运行后工作目录会多出一个num.font.exp0.lstmf文件

    步骤七、从已有的.traineddata中提取.lstm文件

    将下载好的.traineddata文件拷贝到工作目录(为什么用下载的,而不用Tesseract-OCR自带的,原因参考前面),我这里是eng.traineddata,命令行工具执行:

    combine_tessdata -e eng.traineddata eng.lstm

    注意:如果你是中文语言包,请自行下载。

    步骤八、创建num.training_files.txt文件,里边的内容为.lstmf文件的路径地址

    我这里是:D:Work estlang um.font.exp0.lstmf

    步骤九、进行训练

    在工作目录创建output子目录,命令行工具执行:

    lstmtraining --model_output="D:Work	estlangoutputoutput" --continue_from="D:Work	estlangeng.lstm" --train_listfile="D:Work	estlang
    um.training_files.txt" --traineddata="D:Work	estlangeng.traineddata" --debug_interval -1 --max_iterations 800

    参数含义:

    • --modeloutput 模型训练输出的路径
    • --continue_from 训练从哪里继续,这里指定从上面提取的 eng.lstm文件,
    • --train_listfile 指定上一步创建的文件的路径
    • --traineddata 指定.traineddata文件的路径
    • --debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数
    • --max_iterations 指明训练遍历次数

    此时命令窗口中会有滚动的训练历程,这一步操作比较耗费时间。训练结束后,在output文件夹中会生成i一个output_checkpoint文件和多个类似output0.012_3.checkpoint的.checkpoint文件。

    步骤十、将checkpoint文件和.traineddata文件合并成新的.traineddata文件

    在工作目录,命令行工具执行:

    lstmtraining --stop_training --continue_from="D:Work	estlangoutputoutput_checkpoint" --traineddata="D:Work	estlangeng.traineddata" --model_output="D:Work	estlangoutput
    um.traineddata"

    参数含义:

    • --stop_training 默认要有的
    • --continue_from 上一步生成的output_checkpoint文件路径
    • --traineddata 第4步中下载的.traineddata文件的路径
    • --model_output zth.traineddata 输出的路径

    然后,将新生成的num.traineddata文件拷贝到tesseract-OCR essdata文件夹下,通过代码进行识别。

    进一步测试

    在工作目录,命令行工具执行:

    tesseract 3024.jpg result -l num

    注意:语言包,必须选择刚刚创建的num。打开工作目录下的result.txt,里面的内容为:3024;至此,训练告一段落。

  • 相关阅读:
    【Quartz】1、Quartz使用说明
    【Servlet】1、Servlet监听器及相关接口
    【IDEA&&Eclipse】5、IntelliJ IDEA常见配置
    Chris Richardson微服务实战系列
    Traefik Kubernetes 初试
    用友iuap云运维平台支持基于K8s的微服务架构
    DCOS中监控和弹性伸缩方案经验
    使用微服务架构改造遗留系统
    kubernetes中port、target port、node port的对比分析,以及kube-proxy代理
    基于prometheus监控k8s集群
  • 原文地址:https://www.cnblogs.com/nayitian/p/15240143.html
Copyright © 2020-2023  润新知