如何用 combine_lang_model 生成用于 LSTM 训练的 starter traineddata
【免费下载链接】tesseractTesseract Open Source OCR Engine (main repository)项目地址: https://gitcode.com/GitHub_Trending/te/tesseract
在 Tesseract 4.00 及之后的版本中,训练一个 LSTM 识别模型前,需要先生成一个 starter traineddata 文件——它把 unicharset、recoder(unicharcompress)以及可选的 DAWG 词库打包成lstmtraining可直接读取的初始数据。combine_lang_model就是为此提供的训练工具:它接收一个 unicharset 和可选的 wordlists,一次完成过去需要分别运行set_unicharset_properties、wordlist2dawg、生成 recoder 的独立程序以及combine_tessdata才能完成的工作(见 doc/combine_lang_model.1.asc)。
该工具自 tesseract 4.00.00alpha 起可用,因此前提是已经编译或安装了对应版本的 Tesseract 训练二进制文件。
准备输入:unicharset 与 langdata 目录
执行命令前需要准备两样东西:
- 输入 unicharset 文件:一个文本文件,描述该语言要识别的字符集合。文档说明它「可以是字段不完整的手工创建文件(hand-created file with incomplete fields)」,
combine_lang_model会在实际使用它之前自动设置 basic properties 和 script properties,因此不需要事先单独运行set_unicharset_properties。 - langdata 目录:
--script_dir参数要求指向 langdata(GitHub 仓库)目录的位置,其中包含脚本级 unicharsets、font xheights,以及编码所需的radical-stroke.txt文件。
另外,--script_dir/<lang>/<lang>.config如果存在,会被读入并作为语言配置写入 traineddata(见 lang_model_helpers.cpp 中CombineLangModel的实现)。这是可选的,不存在时照常继续。
有一个源码层面的硬性要求需要注意:程序在生成 recoder 之前会读取<script_dir>/radical-stroke.txt,如果读不到该文件(包括使用--pass_through_recoder的情况下),会打印Error reading radical code table <path>并以失败退出。所以 langdata 目录下必须包含radical-stroke.txt。
执行命令生成 starter traineddata
基本调用形式(参数取自 doc/combine_lang_model.1.asc 的 SYNOPSIS):
combine_lang_model \ --input_unicharset mylang.unicharset \ --script_dir langdata/ \ --output_dir train_output/ \ --lang myl执行前需要替换的值:
| 占位 | 含义 |
|---|---|
mylang.unicharset | 你的语言 unicharset 文件路径 |
langdata/ | 本地 langdata 目录路径(需含radical-stroke.txt) |
train_output/ | 输出根目录,任意可写路径 |
myl | 语言代码,Tesseract 使用 3 字符的 ISO 639-2 语言代码 |
输出固定写在<output_dir>/<lang>/下,文件前缀为<lang>.,例如train_output/myl/myl.traineddata。
可选参数:recoder、RTL 与词表
以下选项按实际需要添加,不影响主路径:
--pass_through_recoder(bool,默认 false):为 true 时,recoder 是 unicharset 的简单直通(pass-through),不做压缩;为 false 时,recoder 会对符号空间做压缩——例如把 Hangul 编码为 Jamo、把多 unicode 符号分解为 unicode 序列、用radical-stroke.txt中的数据编码 Han 字。如果你手工构造的 unicharset 已经是一个紧凑的编码,用直通 recoder 即可。--lang_is_rtl(bool,默认 false):语言为从右向左书写(如阿拉伯语、希伯来语)时设为 true,它决定 punct DAWG 的反转策略。--words FILE/--puncs FILE/--numbers FILE:可选的词表文件,分别用于系统词典、标点模式、数字模式。约束是:三个列表可以全为空,但只要有一个非空,--puncs必须非空,否则程序会打印Must have non-empty puncs list to use language models!!并以失败退出(见 lang_model_helpers.cpp 中WriteDawgs的实现)。词表文件的格式与wordlist2dawg的输入一致:UTF-8 纯文本,每行一个词(见 doc/wordlist2dawg.1.asc)。--version_str STRING:任意版本标签,会被附加到 traineddata 的版本字符串中,方便在多个产物中区分来源。
注意:只有当至少提供了一份词表时,对应的 DAWG(system/punc/number)才会写入 traineddata;不提供词表时产物只包含 unicharset 和 recoder。
输出文件与结果验证
combine_lang_model成功后打印Created <output_dir>/<lang>/<lang>.traineddata,并产生以下文件(见 combine_lang_model.cpp 头部注释与实现):
<output_dir>/<lang>/<lang>.traineddata:最终产物,供lstmtraining使用;<output_dir>/<lang>/<lang>.unicharset:补全属性后的 unicharset,仅为人类可读性输出;<output_dir>/<lang>/<lang>.charset_size=N.txt:recoder 编码的文本形式,N 为 recoder 的 code range,同样仅供人工查看。
验证产物内部组件可以借助combine_tessdata(见 doc/combine_tessdata.1.asc):
combine_tessdata -d train_output/myl/myl.traineddata combine_tessdata -l train_output/myl/myl.traineddata-d列出 traineddata 中包含的组件目录,-l列出网络信息。用这两条命令可以确认 unicharset、recoder 等条目确实被写入了文件;文档未给出固定输出样例,具体条目以实际版本输出为准。
交给 lstmtraining 训练
生成的 starter traineddata 是下一步lstmtraining的输入:其--traineddata参数的定义正是「Starter traineddata with combined Dawgs/Unicharset/Recoder for language model」(见 doc/lstmtraining.1.asc)。例如微调场景下:
lstmtraining \ --continue_from train_output/continue_from_lang.lstm \ --old_traineddata bestdata_dir/continue_from_lang.traineddata \ --traineddata train_output/myl/myl.traineddata \ --train_listfile train_output/lang.training_files.txt \ --model_output train_output/newlstmmodel其中--traineddata指向上一步生成的 starter traineddata,其余参数(--continue_from、--train_listfile等)按各自的训练数据准备情况替换。lstmtraining的文档同时说明:不推荐用户从零开始训练,优先使用微调(finetuning)或替换网络层的方式。
【免费下载链接】tesseractTesseract Open Source OCR Engine (main repository)项目地址: https://gitcode.com/GitHub_Trending/te/tesseract
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考