Tesseract5.4.0自定义LSTM训练
准备jTessBoxEditor,然后配置环境变量。
1、将图片转换成tif格式的,这里需要用画图工具另存为;
2、生成box文件
执行命令:
tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox
关于box文件的生成,对于Tesseract3可以使用makebox,但是对于Tesseract的lstm训练,需要使用lstmbox。否则再后面会报如下的错误。

生成lstmbox的命令如下:
D:\agvtest2>tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng lstmbox
关于PSM的说明
0 = 仅方向和脚本检测 (OSD)。
1 = 自动页面分割,带 OSD。
2 = 自动页面分割,但无 OSD 或 OCR。(未执行)
3 = 完全自动页面分割,但无 OSD。(默认值)
4 = 假设一列文字大小可变。
5 = 假定垂直对齐的单个统一文本块。
6 = 假定单个统一的文本块。
7 = 将图像视为单一文本行。
8 = 将图像视为单个单词。
9 = 将图像视为圆圈中的单个单词。
10 = 将图像视为单个字符。
11 = 文本稀疏。不按特定顺序查找尽可能多的文本。
12 = 带 OSD 的稀疏文本。
13 = 原始行。将图像视为单行文本、
3、校正box文件中的信息
使用jTessBoxEditor打开tif文件。执行train.bat,打开jTexxBoxEditor.jar

校正完成后,一定要点保存。如下

关于box文件的内容,这里需要注意。它与tesseract3生成的box格式有所区别。
下面是tesseract5中识别的内容。


文档中说明了一行内容之后,必须标注一个结束行。


4、下载训练文件
从github仓下载traineddata_best类型的traineddata文件,可以选择eng.traineddata,用来初次训练字体;下载地址:https://github.com/tesseract-ocr/tessdata_best,下载后保存在当前工作目录下,另外拷贝一份到系统变量“TESSDATA_PREFIX”路径下,也即tesseract安装路径的tessdata\\文件夹下,这里一定要下载tessdata_best目录下面的,不能是tesssdata下面的,否则后面会报:
eng.lstm is an integer (fast) model, cannot continue training
这样的错误。
同时,将eng.traineddata文件复制一份到图片目录下,如下所示。

5、生成生成基于通用模型的lstm文件
D:\agvtest2>combine_tessdata -e eng.traineddata eng.lstm

可以看到目录下多了一个eng.lstm文件

6、生成lstmf文件
如果前面使用的是makebox生成的lstmf文件,需要将lstmf文件删除,重新执行一下生成listbox的命令。生成lstmf文件的执行命令:
tesseract agv.normal.exp1.tif agv.normal.exp1 --psm 6 lstm.train

可以看到目录下多了一个lstmf文件

7、设置.lstm文件路径
新建一个eng.trainingfile.txt文件,在文件中填写lstmf文件的完整路径。

8、开始训练
新建output目录,执行命令:
D:\agvtest2>lstmtraining --model_output=output\agv.traineddata --continue_from="D:\agvtest2\eng.lstm" --train_listfile="D:\agvtest2\eng.trainingfile.txt" --traineddata="D:\agvtest2\eng.traineddata" --debug_interval -1 --max_iterations 5000 --target_error_rate 0.01
注意路径冒号不要有空格
–modeloutput 模型训练输出的文件目录
–continue_from 训练从哪里继续,这里指定从上面提取的 eng.lstm文件,
–train_listfile 指定上一步创建的文件的路径
–traineddata 指定.traineddata文件的路径
–debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数
–max_iterations 指明训练遍历次数
–target_error_rate 0.01 期望错误率
此时命令窗口中会有滚动的训练历程,这一步操作比较耗费时间。
如果在第8步的时候报了“Compute CTC targets failed for D:\agvtest2\agv.normal.exp1.lstmf!”,需要检查一下box文件内容的格式,是否是采用listbox生成的,如果不是,重新生成一次,并重新校正内容,在重新生成lstmf文件。
命令执行成功后,看到如下的日志信息:

然后在output目录下生成了一些output_checkpoint文件,如下所示。

9、生成traineddata文件
执行命令:
D:\agvtest2>lstmtraining --stop_training --model_output=output\agv.traineddata --continue_from="D:\agvtest2\eng.lstm" --traineddata=eng.traineddata
–stop_training 停止训练
–traineddata=eng.traineddata 训练使用的字体,当前工作目录下
–continue_from="D:\agvtest2\eng.lstm" 中间文件名称
--model_output=output\agv.traineddata 生成字体文件的traineddata文件名称
可以看到,在output目录下生成了agv.traineddata文件。

10、测试训练的模型
将agv.traineddata文件拷贝到tesseract的tessdata目录下:

执行命令:
D:\agvtest2>tesseract 2.jpg result -l agv
如下所示:

输出了识别结果到result.txt文件中,但识别结果不准。
11、提升准确率
从前面的训练步骤可以看到,开始训练时需要用到一个已经存在的字体eng.traineddata,比如第5步抽取它的lstm文件、第9步的训练等。既然这个原始字体训练出来的新字体识别的准确率不高,很可能跟选择的这个初始字体有关,那是不是可以用我们训练好的新字体替代eng.traineddata再训练一次呢,这样产生的第2代的新字体是不是可以有更好地表现?如此迭代多次之后,得到第3代、第4代、第5代字体呢? 将eng.traineddata相关的内容替换为agv.traineddata,新生成的第2代字体取名为agv2,依次替代命令行里面的参数训练第2代字体,类似的方法再训练出第3、第4、第5代字体,将每一代字体都用测试集进行测试。
常见问题解决:
1、Deserialize header failed: D:\agvtest2\agv.normal.exp1.lstmf

这是因为在eng.trainingfile.txt文件中,lstmf文件路径的换行符问题,如下所示。

将其中的CR去掉,只保留LF。
最简单的解决办法是去掉2个换行符\r\n(CR LF)。 当使用多个lstmf文件训练时,每个文件名之间必须要保留一个换行符,则必须去掉\r(CR)符号,只保留\n(LF)。去掉的方式如下所示。

相关文章:
Tesseract5.4.0自定义LSTM训练
准备jTessBoxEditor,然后配置环境变量。 1、将图片转换成tif格式的,这里需要用画图工具另存为; 2、生成box文件 执行命令: tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox 关于box文件…...
centOS7
特殊权限 set_uid 赋予所有者身份 chmod us 文件 set_gid 赋予所有组身份 chmod gs 文件/目录 sticky_bit 防火墙 firewall-cmd 开启端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent 重启防火墙 systemctl restart firewalld 查看开启的所有端口 fi…...
HTML5 弹跳动画(Bounce Animation)详解
HTML5 弹跳动画(Bounce Animation)详解 弹跳动画是一种动态效果,使元素在出现或消失时看起来像是在跳动。这种效果可以通过 CSS 动画或 JavaScript 来实现,增强用户体验。 1. 使用 CSS 实现弹跳动画 可以使用 CSS 的 keyframes…...
4.1.3 串
文章目录 串的基本概念串的基本操作串的存储结构 串的基本概念 串,仅由字符构成的有限序列。 串长:串中的字符个数。空串:长度为0的串。空格串:一个或多个空格构成的串。子串:串中任意长度连续字符构成的序列。含有字…...
国产编辑器EverEdit - 两种删除空白行的方法
1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …...
1月7日星期二今日早报简报微语报早读
1月7日星期二,农历腊月初八,早报#微语早读。 1、公安部:已为一线民警配备执法记录仪130万余部,规范现场执法; 2、浙江提出2035年全省域基本实现共同富裕; 3、“汕头牛肉丸”有新标准!1月6日起…...
随机置矩阵列为0[矩阵乘法pytorch版]
文章目录 1. 举例:2. python 代码 1. 举例: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] , r a n d [ 0 , 5 , 2 ] → A [ 0 1 0 3 4 0 6 7 0 9…...
C# 中mysql数据库,已经在原有数据库升级数据库脚本,去管理可以一次,和多次执行的,nuget包
在C#中,如果你需要管理数据库升级脚本,并且希望这些脚本能够支持一次执行和多次执行(即幂等性),你可以使用一些现成的NuGet包来简化这个过程。以下是一些常用的NuGet包: 1. DbUp 描述: DbUp 是一个轻量级…...
PCL 分段线性函数
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设我们有一个分段线性函数,并且我们希望在某个区间内对这个函数进行均匀采样,生成一系列的点。相对通用一些的思路就是对这个函数进行参数化,方法有很多,这在其他的博客中也有提到,不过PCL也为我们提供了一种…...
王静波页岩气:工厂蜕变的创业传奇
【小说】上世纪90年代,西部某工业园区的一家化工厂正面临着生存危机。厂里的锅炉设备老旧,煤炭价格飞涨,能源成本几乎压垮了生产线。王静波是这家工厂的技术主管,眼看工厂一天比一天萧条,他心里焦急万分,却…...
php反序列化 ctf例题演示 框架安全(TP,Yii,Laravel) phpggc生成框架利用pop
前言 php反序列化的框架的利用的pop是非常难写的 并且 我们不知道他的利用方法 所以PHPGGC是一个包含unserialize()有效载荷的库以及一个从命令行或以编程方式生成它们的工具。当在您没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具…...
Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念上
1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…...
入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】
🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网…...
vulnhub靶场【DC系列】之5
前言 靶机:DC-5,IP地址为192.168.10.4 攻击:kali,IP地址为192.168.10.2 都采用VMWare,网卡为桥接模式 对于文章中涉及到的靶场以及工具,我放置网盘中https://pan.quark.cn/s/2fcf53ade985 主机发现 使用…...
前端面试题合集
1.有哪些方式可以实现数据的实时更新? 一. AJAX轮询(Polling) 轮询是一种通过定时发送HTTP请求到服务器来检查数据更新的方法。客户端每隔一定时间(如每5秒)发送一个请求到服务器,服务器响应当前的数据状态…...
基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS
产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统,通过车身四周安装的超广角像机,经算法合成全景鸟瞰图,通过鸟瞰图,司机非常清楚的看清楚车辆四周情况,大大降低盲区引发的交通事故。 产…...
基于 GEE Sentinel-1 数据集提取水体
目录 1 水体提取原理 2 完整代码 3 运行结果 1 水体提取原理 水体提取是地理信息和遥感技术的关键应用之一,对于多个领域都具有重要的应用价值。它有助于更好地管理水资源,保护环境,减少灾害风险,促进可持续发展,以…...
Python判断、循环练习
01 02 03...
【简博士统计学习方法】第1章:4. 模型的评估与选择
4. 模型的评估与选择 4.1 训练误差与测试误差 假如存在样本容量为 N N N的训练集,将训练集送入学习系统可以训练学习得到一个模型,我们将这么模型用决策函数的形式表达,也就是 y f ^ ( x ) y\hat{f}(x) yf^(x),关于模型的拟合…...
解密Navicat密码(Java)
最近从Navicat换到了DBeaver,导出配置文件发现配置文件里的密码都是加密的,看网上的都是给的PHP代码,因为环境问题,就算是在线上运行的PHP代码也会报错,所以就把这段代码改成Java了。 package com.unicdata.system.con…...
5分钟掌握Windows任务栏美化:TranslucentTB终极透明化指南
5分钟掌握Windows任务栏美化:TranslucentTB终极透明化指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在为Windows任务…...
三菱A800变频器A8NC板卡与CC-Link网络配置实战指南
1. A8NC板卡基础认知与安装要点 第一次接触三菱A800变频器的A8NC板卡时,很多人会被这个火柴盒大小的模块难住。其实它的本质就是让变频器具备CC-Link通信能力的"翻译官"。我经手过的自动化产线项目里,90%的通信故障都源于初期安装不规范。这里…...
35岁程序员必看:收藏这份智能体(Agent)开发指南,开启你的“第二曲线”!
35岁,已经成为职场人的魔咒。 尤其是IT行业打工人。 很多人到了35岁,被裁了。 没被裁的,也在担心被裁。 还没到35岁的,已经开始焦虑—— “到了那时候,我该怎么办?” 以前,还真没什么好办法。 但…...
链栈(链式栈) 超详细实现(C 语言 + 逐行精讲)
前言栈(Stack) 是一种后进先出(LIFO)的线性数据结构。前面我们学习了顺序栈(数组实现),今天我们学习它的兄弟 ——链栈(链式栈)。链栈 用单链表实现的栈它完美解决了顺序…...
从Matlab到FPGA:CIC滤波器设计验证全流程(附可下载的Verilog代码与测试脚本)
从Matlab到FPGA:CIC滤波器设计验证全流程实战指南 在数字信号处理领域,CIC(Cascaded Integrator-Comb)滤波器因其无需乘法器的硬件友好特性,成为数字下变频、采样率转换等场景的首选方案。本文将带领算法工程师和FPGA开…...
2026年最值得玩的狼人杀,经典版口碑拉满
2026年市面上的狼人杀APP琳琅满目,但真正值得长期玩、口碑好的寥寥无几,而狼人杀经典版就是其中的佼佼者!它是2016年底国内第一款狼人杀APP,红色logo、平面卡通画风,玩家俗称“红狼”“口袋狼人杀”,由假面…...
2024年山东联通SK-D740-C光猫超级密码破解实战指南
1. 准备工作:了解SK-D740-C光猫的基本信息 山东联通SK-D740-C光猫是创维为联通定制的一款千兆光猫设备,主要用于家庭宽带接入。这款设备默认采用路由模式,由运营商远程管理,普通用户只能使用user账户登录,权限非常有限…...
OpenHarmony轻量系统移植避坑指南:STM32F407内存配置与printf适配详解
OpenHarmony轻量系统移植实战:STM32F407内存优化与调试输出深度解析 1. 嵌入式开发者的OpenHarmony移植挑战 在物联网设备爆炸式增长的时代,高效能嵌入式操作系统成为智能设备的核心支柱。OpenHarmony作为面向全场景的分布式操作系统,其轻量系…...
EtherCAT同步模式全解析:从Free Run到DC同步,如何为你的伺服系统(如清能德创)选择最佳时钟源?
EtherCAT同步模式决策指南:从Free Run到DC同步的时钟源选型策略 在工业自动化系统中,毫秒级的同步误差可能导致机械臂轨迹偏移、多轴联动失步,甚至引发安全事故。作为实时以太网协议的标杆,EtherCAT提供了三种同步模式与三种时钟源…...
M5Unit-8Encoder驱动库:工业级8路编码器I²C嵌入式实践
1. M5Unit-8Encoder 库深度解析:面向嵌入式工程师的工业级旋转编码器驱动实践指南1.1 项目定位与工程价值M5Unit-8Encoder 是专为 M5Stack 生态中 UNIT-8Encoder 模块设计的嵌入式驱动库,其核心价值在于将一款具备 8 路独立增量式编码器接口、支持高速计…...
