说实话,别看现在大模型(VLM)微调吹得神乎其神,真要在嵌入式设备或者低功耗服务器上跑特定场景的 OCR,回过头来还得折腾 Tesseract 的微调。尤其是那种工业铭牌上的冷门字体,或者医疗处方里那些鬼画符一样的缩写,通用模型识别率真的一言难尽。
要是你想搞个专属模型,别去硬啃那些陈旧的 C++ 源码了。现在主流路径是用 tesstrain 这一套基于 Python 和 Makefile 的工具链,核心逻辑就是合成数据 -> 训练 LSTM 层 -> 导出 .traineddata。
1. 别废话,先搭环境
Tesseract 5.x 之后全面转向 LSTM 了,所以训练也得按这个路子来。你得先装好基础包,最关键的是 tesseract 的开发库和 pango,不然字符渲染都会出问题。
Bash
git clone https://github.com/tesseract-ocr/tesstrain
cd tesstrain
pip install -r requirements.txt
# 确保系统里有 tesseract 5.0+
2. 准备你的“弹药”:地道的数据集
微调 Tesseract 最忌讳拿通用数据集去灌。如果你做工业铭牌,你就去搜集几十种常见的工业黑体、等线体,甚至是一些老旧的打字机字体。
- 文本语料 (
langdata): 弄一个line-str.txt。里面别放散文,全是你的垂直业务逻辑。比如医疗处方,你就疯狂塞“阿莫西林”、“500mg”、“TID”这种词。 - 字体文件: 把对应的
.ttf或.otf扔进fonts目录。
3. 生成训练数据(最坑的一步)
Tesseract 训练不是直接喂图片,它需要的是成对的 .tif(图像)和 .box(标注文件)。
用 tesstrain 提供的脚本自动合成:
Bash
make training MODEL_NAME=medical_preset START_MODEL=chi_sim TESSDATA=../tessdata
这里的 START_MODEL 很关键,你是做中文医疗就用 chi_sim 做底座,做英文工业件就用 eng。这叫迁移学习,比你从零开始练要快得多。
4. 这里的几个参数得死磕
在 Makefile 或者命令行参数里,有几个坑你得注意:
MAX_ITERATIONS: 别设太大。微调垂直领域,通常几千次迭代(Iterations)就够了。设多了模型就“练废了”,通用识别率掉得亲妈都不认识。LEARNING_RATE: 默认的通常有点高,微调建议压到0.0001左右。
5. 验收和导出
训练完你会得到一个 checkpoints 目录。挑一个 BCER(字符错误率)最低的,把它搞成最终的专属模型:
Bash
lstmtraining --stop_training \
--continue_from checkpoints/medical_preset_checkpoint \
--traineddata ../tessdata/chi_sim.traineddata \
--model_output output/medical_ocr.traineddata
把生成的 medical_ocr.traineddata 往你系统的 tessdata 目录一丢,调用的时候指定 -l medical_ocr,你会发现原本识别不出来的医疗缩写,现在稳得一批。
总结一下
这种微调本质上是让 Tesseract 的 LSTM 层“记住”特定的字形和词频。虽然过程比调 API 痛苦,但一旦跑通,那响应速度和离线稳定性是任何大模型比不了的。