Win10 Tesseract4.1 LSTM training

Train Tesseract LSTM methods Comparison

Train Tesseract LSTM with tesstrain.sh on Windows

Train Tesseract LSTM with make on Windows

How the makefile in tesstrain-win work

本文记录win10 x64 Tesseract4.1 LSTM training的两种方法,均属于Fine Tune。一种是使用待训练字库 + 待训练文本 + text2image + lstmtraining,另一种是待训练图像 + jTessBoxEditor + lstmtraining。这两种方式训练时的主要差异是准备.box和.tif文件的方法不一样,其他部分基本相同。

若.box和.tif文件已准备好,则可以直接使用text2image + lstmtraining方案的第3~9步进行字库训练。

环境说明

1. win10 x64 VS2017

2. 源码编译的Tesseract4.1发布版

Tesseract4.1源码编译的方法与Tesseract4.0类似,可以参考这里Tesseract4.0+VS2017+win10源码编译攻略。源码编译且安装完成后,训练用的相关工具也随之安装完成,无须其他额外操作。目前Tesseract最新版已经是Tesseract5.0 alpha,Tesseract5.0的编译方法有了很大的变化,待Tesseract5.0正式发布时,我会尝试去编译并将编译过程在此分享。

编译完成后,将tesseract\bin所在路径添加到系统变量Path中,另外将Tessdata(训练的字库文件) 加到管理员用户变量,变量名TESSDATA_PREFIX,变量值为tessdata目录的路径。

系统变量与用户变量修改完成后,需要重启电脑让设定生效。在正式开始训练之前,可以在命令提示符中输入以下命令,若收到的回复与安装路径或内容相符,则已设定OK。

参考链接

Tesseract-OCR 4.0LSTM训练流程 (Windows环境下)

Tesseract-OCR 4.1 LSTM训练流程 (win10环境)

上述两篇文章分别对应本文要介绍的两种方法,原文介绍是非常清晰的,感谢原作者的探索与分享。

不过原文所使用的命令与Tesseract源码使用的训练文件src/training/tesstrain.sh以及tesseract-ocr/tesstrain相比,缺少了unicharset_extractor和combine_lang_model这两个命令,其中unicharset_extractor用于从.box文件中收集待训练的字符集,combine_lang_model根据待训练字符集和单词符号列表来生成训练初始文件。它们生成的训练初始文件在执行lstmtraining时会用到。

How to use the tools provided to train Tesseract 4.00 的仅在介绍Fine Tuning for plusminus a few characters时,用到了该初始训练文件,lstmtraining命令如下:

其中traineddata参数应该设定为包含新字符的初始训练文件;old_traineddata则应设定为基础字库的traineddata。我们大部分时候都只用到traineddata参数,且将该参数设定为基础字库。我猜实质上若未在基础字库字符集上新增或减少字符的话,这两个文件可能并没有区别。

本文介绍的训练步骤主要来自于这两篇文章,另外单步训练过程参考src/training/tesstrain.sh的完整流程,修改了部分参数,以及实际操作过程中的经验总结。

text2image + lstmtraining 训练步骤

1. 准备工作与适用场合

text2image在Tesseract4.1源码编译生成的训练工具之一,它可以将text.txt中的文本变成指定字体的图像,在后续的训练中使用。

1.1 此方案训练前需要提前准备.ttf格式的字体文件和待训练文本.txt格式的文件(本文将其命名为text.txt)。text.txt可以根据具体需求自行进行设定,可以包含待识别图像中包含的文字和符号,保存时注意以UTF8的编码保存,否则训练中可能会出错。

1.2 关于字体文件,Tesseract的文档中Fonts for Tesseract training明确说明:训练中需要的字体文件必须在运行培训过程的主机上可用。以Win10为例,其可用的字体文件的路径为C:/windows/fonts,fonts属于隐藏文件夹。Windows环境下可用的字体列表可用以下命令查询:

1.3 提前下载训练用的traineddata 。特别提醒:github/tesseract-ocr下有tessdata/tessdata_best/tessdata_fast三个traineddata 相关的文件夹,LSTM训练必须使用tessdata_best。下载完成后,将其放在与text.txt相同的路径下。

本文中我使用C:/windows/fonts下一款名为Inkfree.ttf的字体,下载了tessdata_best/eng.traineddata的文件。

1.4  下载angdata_lstm/eng相关文件放在文件夹langdata_lstm下。

根据训练方法,推测该方案的适用场合:若待识别的图像文件使用的是某一种固定已知字体,Tesseract已有的字库识别效果不佳,那么我们可以单独对此字体进行训练以便得到更好的识别结果。总体而言,单独输入每一步的命令,还是相当繁琐的,建议使用Train Tesseract LSTM with tesstrain.sh on Windows来实现。

在正式开始训练之前,我们先介绍本文训练文件夹的结构,请参考并根据实际需求修改相关命令。

训练基础字库路径:D:\TESS_TRAIN\trueTypeTest\tessdata\eng.traineddata

训练基础字库语言文件路径:D:\TESS_TRAIN\trueTypeTest\langdata_lstm\eng,从langdata_lstm可以下载得到。该路径下包含eng.numbers/eng.punc/eng.wordlist这三个文件。

训练用语言文件路径:D:\TESS_TRAIN\trueTypeTest\langdata_lstm,该路径下包含Latin.unicharset和radical-stroke.txt两个文件。

待训练字符文本文件路径:D:\TESS_TRAIN\trueTypeTest\train\text.txt, 训练过程中产生的中间文件也会放在D:\TESS_TRAIN\trueTypeTest\train路径中。

训练得到的新字库存放路径:D:\TESS_TRAIN\trueTypeTest\output.

2. 用text2image生成.tif和.box文件

管理员身份打开命令行提示符,切换至路径D:\TESS_TRAIN\trueTypeTest下,输入以下命令并运行:

参数意义:

–text train\text.txt 待训练字符文件路径

–outputbase train\eng.Inkfree.exp0将要生成的.tif和.box文件的路径和命名。

–fontconfig_tmpdir=”%temp%” 指明config,这个在windows中默认这么写,不写会报错

–font=“Inkfree” font文件夹中的字体名称

–fonts_dir=“C:\Windows\Fonts” font文件夹的路径

至此,会在train文件夹下生成两个新的文件,分别为.tif和.box格式的文件

我在text.txt中设置的文字为:How to use the tools provided to train Tesseract 4.00。在实际训练中使用的文本中,文字数量应该是较大的或者非常特殊的。本文为了举例说明,只选了一句话。text2image生成的tif图像如下:

我验证时碰到过的错误以及解决方案,供大家参考:

错误1:

Could not find font named ‘Inkfree’.
Pango suggested font ‘Ink Free’.
Please correct –font arg.

我在C:\Windows\Fonts找到的字体文件的名称是”Inkfree”,但是text2Image并不认识,报以上错误。所以我按照它的建议修改字体名称为”Ink Free”,执行成功。我猜测可能text2Image获取到的字体列表中名称为”Ink Free”的字体实际上对应的是我看到的名称为”Inkfree”。

这种状况并不是个例,我在C:\Windows\Fonts看到名为”STXINGKA.TTF“的字体(实际对应华文行楷),如果我这样设置:–font=“STXINGKA”,系统会报错并建议我这样设置:–font=“STXingkai”,按照系统设置后可以执行成功。

错误2:

在第1步中我提到过的text.txt的编码问题,我曾经尝试过用ANSI编码存储text.txt,报如下错误,因此text.txt必须是UTF-8的编码。

** (text2image.exe:22736): WARNING **: 13:09:45.941: Invalid UTF-8 string passed to pango_layout_set_text()

3. 利用.tif和.box文件生成.lstmf文件用于lstm训练

参数意义:

train\eng.Inkfree.exp0.tif 上一步生成的.tif 格式的文件

train\Inkfree.font.exp0 指明要生成的.lstmf文件的名称

-l eng表示用到的语言

–psm 6 表示采用的识别模式,通常6 效果会好些

可通过tesseract –help-psm查看所有的识别模式,6指的是假设去识别一个单一的文本块。

此命令运行后会,train文件夹中会多出一个eng.Inkfree.exp0.lstmf文件

4. 从已有的.traineddata中提取.lstm文件

这里的eng.traineddata即前面提到的从tessdata_best中下载的文件,此命令运行后会从.traineddata文件中提取出eng.lstm 文件.

5. 创建eng.training_files.txt文件,内容为.lstmf文件的路径地址

我的eng.training_files.txt文件中的内容:D:\TESS_TRAIN\trueTypeTest\train\eng.Inkfree.exp0.lstmf

6. 从.box文件中提取待训练字符集

参数意义:

–output_unicharset:提取得到的字符集的文件名与路径

–norm_mode:指明当前语言的书写顺序,是从左至右,还是从右至左。2表示从左至右。

eng.Inkfree.exp0.box:待训练的box文件,从该文件中提取字符集

如果希望训练时仅包含.box文件中的字符,运行以上命令即可;如果希望训练时包含.box文件中的字符和基础字库中的字符集,则还需要运行以下命令:

第一行命令用于从基础字库中提取字符集;第二行命令用于合并基础字符的字符集和待训练文本的字符集。

友情提醒:若您使用的tesseract4.1的编译的发布版本是参考Tesseract4.0+VS2017+win10源码编译攻略完成的,有可能会出现如下错误:

原因是这种方式编译的tesseract发布版本中,没有merge_unicharsets这个命令,具体原因与解决方案暂未知。

因此,运行第二行命令之前,请先确认Tesseract训练工具中是否有merge_unicharsets该命令。

7. combine_lang_model生成训练初始文件

参数说明:

input_unicharset:生成初始训练文件的字符集

script_dir:应该指向包含* .unicharset文件的目录。 对于基于英语和其他基于拉丁语的脚本,文件为Latin.unicharset。

words/numbers/puncs:分别对应langdata_lstm\eng路径下的单词列表/数字列表/符号列表三个文件。

output_dir:生成的初始训练文件的存放路径。

lang:生成初始训练文件的所属的语言类型。

该命令根据字符集和可选的单词列表,数字列表,符号列表生成一个初始训练文件,存放在train文件夹中。

8.lstmtraining开始训练

参数意义:

–modeloutput 模型训练输出的路径(trueTypeTest文件夹中新建了一个名为output的文件夹用来存输出的文件)

–continue_from 训练从哪里继续,这里指定从第4步中提取的eng.lstm文件,

–train_listfile 第5步创建文件true.training_files.txt的路径

–traineddata comine_lang_model生成的初始训练文件的路径

–traineddata 基础字库的路径

–debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数

–max_iterations 指明训练遍历次数

此时命令窗口中会有滚动的训练数据。

9.将checkpoint文件和.traineddata文件合并成新的.traineddata文件

参数意义:

–stop_training 将训练模型转化为可运行模型

–continue_from 上一步生成的output_checkpoint文件路径

–traineddata 初始训练字库的路径

–model_output 最终训练字库的输出的路径

此项命令执行完成后,Inkfree.traineddata会在output文件夹下。

jTessBoxEditor + lstmtraining 训练步骤

1. 准备工作与适用场景

如果我们只有图片,并不知道这些图片上的文字所对应的字体,但是有需求对这些图片进行单独训练,这时可以选择jTessBoxEditor + lstmtraining的训练方案。

选择这个方案,首先我们需要安装jTessBoxEditor,我的博客里有一篇训练Tesseract3字库图文详解有介绍安装方法,不过版本略旧;另外网络上也有很多jTessBoxEditor的安装说明,我这里就不再重复了,我使用的版本是jTessBoxEditor-2.2.0。

2. jTessBoxEditor合并待训练图片,生成并调整.box文件

打开jTessBoxEditor,选择菜单Tools -> Merge TIFF,选择文件类型为all the images,选中所有图片 -> 命名为***.tif 合并为.tif文件,tif文件的命名规则如下:

[lang].[fontname].exp[num].tif

如eng.Inkfree.exp0.tif,eng是语言名,Inkfree是字体名,exp0是版本号。

在训练目录下打开cmd,用现有的字体库识别.tif文件,生成对应的.box文件。比如,用eng库识别样本,生成.box文件,命令如下:

命令执行完成后,会生成eng.Inkfree.exp0.box文件。

其中命令参数含义:

eng.Inkfree.exp0.tif 上一步生成的.tif 格式的文件

eng.Inkfree.exp0 指明要生成的.box文件的名称

-l eng表示识别使用的语言是eng,

–psm表示采用的识别模式,通常6比较好。

接下来,在jTessBoxEditor菜单中选择Box Editor -> Open打开.tif文件,会关联同名的.box文件。调整蓝色框框时会对应修改.box文件。有时可能会出现有的字符根本没有蓝色框框导致无法修改的状况,这时可以直接打开.box文件进行手动调整。

3. 第3~9的步骤以及相应操作命令与【text2image + lstmtraining 训练步骤】完全相同,这里就不再重复。

经过验证,jTessBoxEditor + lstmtraining这两种方案得到的traineddata文件可以在命令行中使用,也可以在VS2017中正常调用。

本文到此结束,感谢阅读,欢迎关注。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub