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。
1 2 |
tesseract --version tesseract --list-langs |
参考链接
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命令如下:
1 2 3 4 5 6 7 |
training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \ --continue_from /path/to/existing/model \ --traineddata /path/to/traineddata/with/new/unicharset \ --old_traineddata /path/to/existing/traineddata \ [--perfect_sample_delay 0] [--debug_interval 0] \ [--max_iterations 0] [--target_error_rate 0.01] \ --train_listfile /path/to/list/of/filenames.txt |
其中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 |
text2image --list_available_fonts --fonts_dir C:/windows/fonts |
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文件
1 2 3 4 |
text2image --text train\text.txt --outputbase train\eng.Inkfree.exp0\ --fontconfig_tmpdir="%temp%" --font="Inkfree" \ --fonts_dir="C:\Windows\Fonts" |
参数意义:
–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训练
1 |
tesseract train\eng.Inkfree.exp0.tif train\eng.Inkfree.exp0 -l eng --psm 6 lstm.train |
参数意义:
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文件
1 |
combine_tessdata -e tessdata\eng.traineddata train\eng.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文件中提取待训练字符集
1 2 3 |
unicharset_extractor --output_unicharset train\my.unicharset\ --norm_mode 2 train\eng.Inkfree.exp0.box |
参数意义:
–output_unicharset:提取得到的字符集的文件名与路径
–norm_mode:指明当前语言的书写顺序,是从左至右,还是从右至左。2表示从左至右。
eng.Inkfree.exp0.box:待训练的box文件,从该文件中提取字符集
如果希望训练时仅包含.box文件中的字符,运行以上命令即可;如果希望训练时包含.box文件中的字符和基础字库中的字符集,则还需要运行以下命令:
1 2 3 4 5 6 |
combine_tessdata -u eng.traineddata train/eng merge_unicharsets\ train/eng.lstm-unicharset\ train\my.unicharset\ my.unicharset |
第一行命令用于从基础字库中提取字符集;第二行命令用于合并基础字符的字符集和待训练文本的字符集。
友情提醒:若您使用的tesseract4.1的编译的发布版本是参考Tesseract4.0+VS2017+win10源码编译攻略完成的,有可能会出现如下错误:
1 |
<em>/bin/bash: merge_unicharsets: command not found</em> |
原因是这种方式编译的tesseract发布版本中,没有merge_unicharsets这个命令,具体原因与解决方案暂未知。
因此,运行第二行命令之前,请先确认Tesseract训练工具中是否有merge_unicharsets该命令。
7. combine_lang_model生成训练初始文件
1 2 3 4 5 6 7 8 |
combine_lang_model \ --input_unicharset train/my.unicharset\ --script_dir langdata_lstm\ --words langdata_lstm/eng/eng.wordlist\ --numbers langdata_lstm/eng/eng.numbers\ --puncs langdata_lstm/eng/eng.punc\ --output_dir train\ --lang eng |
参数说明:
input_unicharset:生成初始训练文件的字符集
script_dir:应该指向包含* .unicharset文件的目录。 对于基于英语和其他基于拉丁语的脚本,文件为Latin.unicharset。
words/numbers/puncs:分别对应langdata_lstm\eng路径下的单词列表/数字列表/符号列表三个文件。
output_dir:生成的初始训练文件的存放路径。
lang:生成初始训练文件的所属的语言类型。
该命令根据字符集和可选的单词列表,数字列表,符号列表生成一个初始训练文件,存放在train文件夹中。
8.lstmtraining开始训练
1 2 3 4 5 6 |
lstmtraining --model_output output\ --continue_from train\eng.lstm --train_listfile train\eng.training_files.txt --old_trainddata tessdata\eng.traineddata --traineddata train\eng.traineddata --debug_interval -1 --max_iterations 1000 |
参数意义:
–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文件
1 2 3 4 |
lstmtraining --stop_training \ --continue_from train\output_checkpoint\ --traineddata train\eng.traineddata\ --model_output output\Inkfree.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文件,命令如下:
1 |
tesseract eng.Inkfree.exp0.tif eng.Inkfree.exp0 -l eng --psm 6 batch.nochop makebox |
命令执行完成后,会生成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中正常调用。
本文到此结束,感谢阅读,欢迎关注。