如何用 lstmeval 配合 --traineddata 评估 Tesseract 的 LSTM 训练检查点
【免费下载链接】tesseractTesseract Open Source OCR Engine (main repository)项目地址: https://gitcode.com/GitHub_Trending/te/tesseract
用 Tesseract 的lstmtraining训练 LSTM 网络时,通常不想等训练全部结束才判断效果,而是需要检查训练输出目录里已经产生的中间检查点。lstmeval就是 Tesseract 为 LSTM 网络提供的独立评估程序:输入一个模型(识别模型或训练检查点)加一份 lstmf 文件列表,输出该模型在评估集上的错误率。关键限制是:当--model给的是训练检查点而不是可直接使用的识别模型时,必须同时给出--traineddata,而且它必须是训练时交给 trainer 的那个 starter traineddata 文件。按 man page 记载,lstmeval自 tesseract 4.00.00alpha 起可用。
准备条件:检查点、starter traineddata 与评估列表文件
运行评估前需要凑齐三样东西,缺一都会导致程序直接报错退出:
- 模型文件。可以是识别模型(如
lang.lstm),也可以是训练检查点。doc/lstmeval.1.asc 的 synopsis 把--model的合法形式写为'lang.lstm|modelname_checkpoint|modelname_N.NN_NN_NN.checkpoint',并明确说明 "Intermediate training checkpoints can also be used"(中间训练检查点也可以使用)。如果按 doc/lstmtraining.1.asc 示例中的--model_output 'train_output_dir/newlstmmodel'训练,检查点就按newlstmmodel_N.NN_NN_NN.checkpoint的命名落在该输出目录里。 - starter traineddata,即
lstmtraining --traineddata当时指定的文件。man page 对--traineddata的表述是:若模型是训练检查点,"traineddata must be the traineddata file that was given to the trainer",给错文件评估结果没有意义。 - 评估列表文件,即
--eval_listfile指向的文本文件,内容为 lstmf 格式样本文件的路径清单(man page:"File listing sample files in lstmf training format."),实现上按行读取文件名(见 src/training/unicharset/lstmtester.cpp)。
可选分支:生成 lstmf 评估样本。手头没有 lstmf 文件时,可以用tesseract配合仓库自带的lstm.train配置生成。doc/tesseract.1.asc 说明该配置的作用是 "Output files used by LSTM training ('OUTPUTBASE'.lstmf)",即执行
tesseract image.png base lstm.train会生成base.lstmf。该配置文件位于 tessdata/configs/lstm.train,内容是一组参数设置,其中包含tessedit_train_line_recognizer T等开启训练数据输出的项。生成多个.lstmf后,把路径逐行写入一个文本文件作为评估列表。
另外,lstmeval属于随源码构建的训练工具集:Makefile.am 中trainingtools += lstmeval$(EXEEXT),构建 Tesseract 源码后即可获得该可执行文件。
执行 lstmeval 评估命令
man page synopsis 给出的完整形式是:
lstmeval --model 'lang.lstm|modelname_checkpoint|modelname_N.NN_NN_NN.checkpoint' \ [--traineddata lang/lang.traineddata] --eval_listfile 'lang.eval_files.txt' \ [--verbosity N] [--max_image_MB NNNN]代入检查点场景、并按 doc/lstmtraining.1.asc 示例中的路径写法,实际命令形如:
lstmeval --model 'train_output_dir/newlstmmodel_N.NN_NN_NN.checkpoint' \ --traineddata 'train_output_dir/lang/lang.traineddata' \ --eval_listfile 'train_output_dir/lang.eval_files.txt'各参数的用途与适用条件:
--model:必选。模型文件路径(训练或识别)。检查点文件名中的N.NN_NN_NN是 man page 中的占位形式,需替换为训练输出目录中实际的检查点文件名;train_output_dir、lang.lang.traineddata、lang.eval_files.txt沿用的是两份 man page 示例中的路径,同样替换为你训练时的实际路径。--traineddata:当--model是训练检查点时必选,必须是交给 trainer 的那个 traineddata;若--model是识别模型(如lang.lstm),则不需要该参数。--eval_listfile:必选,lstmf 文件清单。--verbosity:0–2,默认 1,控制诊断输出量。--max_image_MB:图像使用的最大内存(MB),默认 2000。
如何判读评估结果
评估成功时,最终输出一行结果,格式来自 src/training/unicharset/lstmtester.cpp 中RunEvalSync的实现(lstmeval以 iteration 0、stage 0 调用,因此不会出现迭代前缀):
BCER eval=43.500, BWER eval=76.600以上数值仅为格式示例,不是预期值。BCER 对应代码中累计的字符级错误(ET_CHAR_ERROR),BWER 对应词级错误(ET_WORD_RECERR),均以百分比表示,固定 3 位小数。由于同一检查点每次评估用的是同一份列表文件,把多个检查点依次用同一--eval_listfile跑一遍,比较 BCER/BWER 的走向,就能观察训练过程中错误率的变化趋势。
--verbosity决定逐样本细节的多少(由实现代码可确认):
- 0:只输出最终的 BCER/BWER 行;
- 1(默认):对识别不完美(result != PERFECT)的样本额外打印
Truth:与OCR两行对照,可直接看到哪一行认错了; - 2:所有样本都打印对照行,识别不完整的样本还会附上逐行的 BCER/BWER。
排查:错误消息的出处与含义
lstmeval的所有提示信息都在 src/training/lstmeval.cpp 中,可以按消息逐一定位:
| 消息 | 含义 | 处理 |
|---|---|---|
Must provide a --model! | 未给--model | 补上模型路径 |
Must provide a --eval_listfile! | 未给--eval_listfile | 补上评估列表文件 |
Must supply --traineddata to eval a training checkpoint! | 模型不是识别模型,但没有给--traineddata | 补上交给 trainer 的 starter traineddata |
%s is not a recognition model, trying training checkpoint... | 非错误,表示正按训练检查点路径加载 | 等待后续结果 |
Failed to load language model from %s! | --traineddata文件加载失败 | 确认路径正确、文件存在,且确为训练时传给 trainer 的那份 |
Failed to load model from: %s | 模型文件读取失败 | 检查检查点路径与文件完整性 |
Failed to load eval data from: %s | 评估列表文件加载失败 | 检查列表文件路径与其中列出的 lstmf 文件 |
两种非报错的特殊输出也值得注意:反序列化失败时输出Deserialize failed(模型数据与训练配置不匹配时会走到这里);列表文件能加载但总页数为 0 时输出No test data at iteration 0,说明列表里没有可用的评估页,需要检查 lstmf 文件本身。
与训练过程中的评估的关系
lstmtraining自身也接受--eval_listfile(见 doc/lstmtraining.1.asc),训练过程中会定期对评估集做评估。lstmeval提供的是一条独立路径:不重跑训练,单条命令即可检查输出目录中任意一个中间检查点,两者使用同一形式的评估列表文件。检查完检查点后,若确认某轮效果可用,后续操作回到lstmtraining的续训选项(--continue_from等),本文不再展开。
【免费下载链接】tesseractTesseract Open Source OCR Engine (main repository)项目地址: https://gitcode.com/GitHub_Trending/te/tesseract
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考