Train Tesseract LSTM with make on Windows
Posted in Tesseract By On 2020年4月24日,2795 Views
Train Tesseract LSTM methods Comparison
Train Tesseract LSTM with tesstrain.sh on Windows
How the makefile in tesstrain-win work
Win10 Tesseract4.1 LSTM training
Train Tesseract LSTM with make 在github上对应的项目为tesseract-ocr/tesstrain,该项目用命令行来实现LSTM的训练,功能强大,简洁易用,但是它仅支持Linux下运行。为了让该项目能在Windows中运行,我对其中的makefile和文件结构进行了一些改动,修改后的项目请参考tesstrain-win。本文主要记录tesstrain-win的使用方法及其改造过程。
环境说明
1. win10 x64
2. 源码编译的Tesseract4.1发布版
本文使用的是源码编译的Tesseract4.1发布版,根据tesseract-ocr / tesstrain的说明,4.0以上的含训练工具的的版本均可以。Tesseract4.1源码编译的方法与Tesseract4.0类似,可以参考这里Tesseract4.0+VS2017+win10源码编译攻略。源码编译且安装完成后,训练用的相关工具也随之安装完成,无须其他额外操作。
这里给出我编译好的包含训练工具的Tesseract4.1的链接,需要的同学自取(The
down load link of the compiled version 4.1 with training
tools):https://drive.google.com/file/d/1ALfBsy5C2l9vJkJ_treAqCvcwS7cfoLX/view?usp=sharing
3. python3.x
makefile中会用到Python的Pillow库进行图像处理,请确认相应版本成功安装。
4. Cygwin
windows下运行makefile需要借助于cygwin,安装方法请参考Install Cygwin on Win10 for makefile.
tesstrain-win文件说明
tesstrain-win项目中有data和old-ocrd两个文件夹以及若干文件,其大致结构如下图所示:
data
–data/foo-ground-truth/ocrd-testset.zip
ground-truth样本数据,解压在当前路径下即可进行训练测试;若训练自定义字库,则用自定义的ground truth替代该文件。
–data/Latin.unicharset
–data/radical-stroke.txt
这两个文件在训练中要用到,Latin编码的语言的字库均可用,一般不需要更改,从tesseract-ocr/langdata_lstm该路径下下载得到。
–data/foo.numbers
–data/foo.punc
–data/foo.wordlist
这三个文件应该与训练的语言相关,例如若基础字库为eng.traineddata,则该文件应该从tesseract-ocr/langdata_lstm/tree/master/eng下载,下载完成后要将相应文件重命名为待训练字库的名称。
old-ocrd:该文件夹是tesseract-ocr/tesstrain的前身,原名为OCR-D/ocrd-train。它的makefile与现有的tesseract-ocr/tesstrain的makefile差异较大,有参考价值,可以协助我们理解makefile工作原理。
makefile: 为了让其在windows中运行,做了相应的修改。
其他文件均与tesseract-ocr / tesstrain相同,这里不做说明。
tesstrain-win使用方法
训练ocrd-testset
在训练自己的数据库之前,建议先用github中示例ocrd-testset.zip进行训练测试,该数据库测试完成,表示您电脑中的各项训练工具均可以正常使用。因此,我们接下来先以ocrd-testset.zip为例,说明tesstrain-win的使用方法。如果训练中遇到错误,可以到本文的《可能会遇到的错误及相应解决方案》小节先查看是否有您遇到的错误,可以参考解决。
1. 解压ocrd-testset.zip
tesstrain-win下载并解压缩之后,将./data/foo-ground-truth/ocrd-testset.zip 解压至./data/foo-ground-truth。
2. 以管理员身份运行命令提示符,进入tesstrain-win所在路径。
1 |
cd %USERPROFILE%/tesstrain-win |
3. 运行make training
1 |
make training --trace |
个人比较推荐运行make training –trace,–trace可以在命令行输出makefile中的每一句命令,若出现错误,方便定位出错的位置和原因。
4. 训练完成命令行内容参考
如果不产生任何错误,ocrd-testset.zip在win10 64位 8G内存笔记本训练完成的时间约8小时,供参考。
1 2 3 4 5 6 7 8 9 10 |
2 Percent improvement time=1059, best error was 3.1 @ 5121 At iteration 6180/10000/10000, Mean rms=0.487%, delta=0.265%, char train=0.924%, word train=3.421%, skip ratio=0%, New best char error = 0.924 wrote best model:data/checkpoints/foo0.924_6180.checkpoint wrote checkpoint. Finished! Error rate = 0.924 Makefile:158: update target 'data/foo.traineddata' due to: data/checkpoints/foo_checkpoint lstmtraining \ --stop_training \ --continue_from data/checkpoints/foo_checkpoint \ --traineddata data/foo/foo.traineddata \ --model_output data/foo.traineddata Loaded file data/checkpoints/foo_checkpoint, unpacking... |
训练自定义字库
1. 为字库命名
可以直接更改makefile中的第11行来命名:
1 |
MODEL_NAME = New_Name |
或者在运行make training时命名
1 |
make training MODEL_NAME=New_Name |
2. 准备基础字库(.traineddata)
若训练时未定义makefile中START_MODEL的值,那么本次训练将属于TRAINING FROM SCRATCH,例如ocrd-testset.zip的训练即属于此类型。TRAINING FROM SCRATCH不需要准备基础字库;若为START_MODEL赋值,例如START_MODEL=eng,那么本次训练则属于Fine-tune,那么我们需要从tessdata_best中下载eng.traineddata,放在data/tessdata文件夹中。
3. 更新data文件夹中的foo.numbers/foo.punc/foo.wordlist
这三个文件应该跟基础字库一致,例如若基础字库为eng,则从langdata_lstm/eng下载相应文件,并放在data文件夹中,然后为这三个文件重命名:New_Name.numbers/New_Name.punc/New_Name.wordlist。
4. 准备ground-truth
ground-truth由图像文件及其对应的文本文件组成。
图像必须为TIFF格式,后缀名可以是.tif/ .png/ .bin.png/ .nrm.png。
文本文件的名称与图像名称相同,内容是图像对应的文本,后缀名为.gt.txt。
图像与相应的文本均要求为单行文本。
gound-truth路径为:data/New_Name-ground-truth.
5. 以管理员身份运行命令提示符,进入tesstrain-win所在路径。
1 |
cd %USERPROFILE%/tesstrain-win |
6. 运行make training
1 |
make training --trace |
个人比较推荐运行make training –trace,–trace可以在命令行输出makefile中的每一句命令,若出现错误,方便定位出错的位置和原因。
可能会遇到的错误及相应解决方案
在训练字库过程中可能会碰到各种各样的错误,来看看这里是否有你碰到的错误:
1. /bin/bash: python3: command not found
若您运行的是tesseract-ocr/tesstrain,可能会碰到此错误,将您的makefile中所有的python3,均修改为python。
修改原因:
在Windows10中,python3执行档在控制台程序中调用时名称为python.exe,在GUI程序中调用时名称为pythonw.exe,参考链接:bash-python3-command-not-found-windows-discord-py
2. UnicodeEncodeError: ‘gbk’ codec can’t encode character
运行OCR-D/ocrd-train的makefile时,会出现上述错误,旧版本的makefile调用python代码的程序是这样写的:
1 |
python generate_line_box.py -i "$(GROUND_TRUTH_DIR)/$*.tif" -t "$(GROUND_TRUTH_DIR)/$*.gt.txt" > "$@" |
解决方案:添加PYTHONIOENCODING=utf-8
1 |
PYTHONIOENCODING=utf-8 python $(GENERATE_BOX_SCRIPT) -i "$*.tif" -t "$*.gt.txt" > "$@" |
3. /bin/bash: ……/Microsoft/WindowsApps/python3: Permission denied
该错误参考链接:
“Permission Denied” trying to run Python on Windows 10
解决方案:
3.1 确保用户变量—>Path中,
……\AppData\Local\Programs\Python\Python36\
在%USERPROFILE%\AppData\Local\Microsoft\WindowsApps的上方,如下图所示:
3.2 通过“管理应用程序执行别名”禁用错误路径下的Python,操作步骤:
右键点击开始菜单—>设置—>应用—>应用和功能—>应用执行别名,关闭python.exe和python3.exe,如下图所示:
有的电脑只需要操作3.1就好,有的则需要3.1和3.2同时操作,我的电脑就需要两步同时操作。
4.command not found
/bin/bash: wget: command not found
/bin/bash: line 1: bc: command not found
请参考Install Cygwin on Win10 for makefile.,确认wget、bc已安装。
5.Failed to load any lstm-specific dictionaries for lang……
若使用tesseract-ocr/tesstrain训练,训练过程中不会出现此错误,在调用训练完成的字库进行识别时也可以正常识别,但会报出该警告。
该错误与data文件夹下后缀名分别是.wordlist/.numbers/.punc的三个文件有关。
[.wordlist]:系统单词列表语言模型。
[.numbers]:带有允许的数字模式。
[.punc]:单词周围允许使用标点符号。
在tesseract-ocr/tesstrain中,上述三个文件的默认路径为$(OUTPUT_DIR)=data/$(MODEL_NAME),该路径下所有的文件均是训练过程中自动生成的。
若未为变量START_MODEL赋值,makefile并不会在该路径下生成任何相关文件;
若已为变量START_MODEL赋值,则makefile中的以下语句会执行:
1 2 |
combine_tessdata -u $(TESSDATA)/$(START_MODEL).traineddata \ data/$(START_MODEL)/$(MODEL_NAME) |
该语句会将基础字库分解为多个文件,例如foo.lstm-number-dawg、foo.lstm-punc-dawg、foo.lstm-word-dawg等等文件,但是训练时需要的是.wordlist/.numbers/.punc文件。因此若使用tesseract-ocr/tesstrain训练,无论选择何种方式,调用训练完成的字库时,均会报出此警告。
目前最新版本的tesseract-ocr/tesstrain的makefile应该是有BUG的,tesstrain-win中makefile关于这个问题也暂未修正,使用了另外一种解决方案:修改了相关变量的路径,在相应路径下准备了.wordlist/.numbers/.punc文件,用tesstrain-win训练完成后调用时不会有此警告。
如果您想用tesseract-ocr/tesstrain训练,又想解决这个问题,可以在makefile中搜索WORDLIST_FILE/NUMBERS_FILE/PUNC_FILE这几个变量,参考tesstrain-win进行修改,自行准备.wordlist/.numbers/.punc文件放入相应路径即可。
理论上而言,可以根据实际需求自行对下载的.wordlist/.numbers/.punc进行微调,我没有尝试过,有兴趣的同学可以试试。
该问题点的相关链接Failed to load any lstm-specific dictionaries for lang xxx
6./bin/bash: merge_unicharsets: command not found
若为变量START_MODEL赋值,当前的训练类型为Fine_tune,会执行以下语句:
1 2 |
merge_unicharsets data/$(START_MODEL)/$(MODEL_NAME).lstm-unicharset\ $(OUTPUT_DIR)/my.unicharset "$@" |
若您使用的tesseract4.1的编译的发布版本是参考Tesseract4.0+VS2017+win10源码编译攻略完成的,有可能会出现如下错误:
/bin/bash: merge_unicharsets: command not found
原因是这种方式编译的tesseract发布版本中,没有merge_unicharsets这个命令,具体原因与解决方案暂未知。
merge_unicharsets的作用是将基础字符集与Fine_tune时新增的字符集合并,将该语句改成如下语句,可以在merge_unicharsets命令缺失的情况下将训练执行完成,最终字库效果可能有差异。
修改之后的功能是用新增字符集作为训练的总字符集。
1 |
cp "$(OUTPUT_DIR)/my.unicharset" "data/unicharset" |
或者也可以用基础字库的字符集作为训练的总字符集。
1 |
cp "/$(START_MODEL)/$(MODEL_NAME).lstm-unicharset" "data/unicharset" |
本文到此结束,谢谢阅读,欢迎关注。