本文使用tesseract 4.0 LSTM版本训练mnist数据集。
安装过程见此博客:https://blog.csdn.net/ayayayayo/article/details/107811559
训练步骤如下:
1. 下载mnist数据集,并处理数据生成.tif和.box文件。
本文使用Pytorch中的MNIST类进行数据下载,将10个数字拼接成一张tif图片用于后期合成输入Tesseract的tif,对于60000数据样本,总共生成6000张图片和一个.box文件。.box文件的格式如下:
其中从左到右分别代表:数字标签、左上角横坐标、左上角纵坐标、右下角横坐标、右下角纵坐标、数字所在页码。接下来利用 jTessBoxEditor合并之前生成的6000张tif图片为一个tif文件。这里用于lstm训练,每一个数据所在位置都标记为其所在的一整行。因此这些中间四个数字都是一样的。(我也不知道为啥这样,GitHub上有人提出了这个问题,让这么标记,我一开始单独标记每一个数字训练过程会出错)
打开下载的 jTessBoxEditor文件包,点击train.bat即可打开该工具。
点击Tool–MergeTIFF,全选所有6000张图片
注意全选图片后会弹出生成的tif文件保存路径选择框,在命名时要注意最好使用如下格式::<语言名.字体名.版本号>,例如我用的名称为num.mnist.exp0.tif。
图片数量过多生成时间可能会比较长,稍等片刻即可。
至此,用于Tesseract训练的文件以准备完毕。
2. 生成用于训练的lstmf文件
首先展示一下文件路径,以免后期造成路径混乱。
data: 为第一步生成的.tif和.box文件,在第一部中生成之后将其复制至该路径。
lstm: 保存从现有语言包中抽取的lstm文件
lstmf: 保存利用现有语言包生成的用于训练的lstmf文件
output:保存输出的断点文件、中间文件及新生成的模型
testfiles:测试图片文件夹。
traineddata:语言包所在文件
trainfiles: 第一步中6000张图片所在路径
num.test_files.txt: 保存着用于测试的lstmf文件所在路径。
num.training_files.txt: 保存着用于训练的lstmf文件所在路径。
下面开始训练。
tesseract data/num.mnist.exp2.tif lstmf/num.mnist.exp2 -l eng --psm 6 lstm.train
其中,data/num.mnist.exp2.tif为输入的tif文件所在路径, lstmf/num.mnist.exp2为生成的lstmf文件名称, /前是路径。-l eng 表示使用的语言包名称 --psm 6 为分页类型。
3. 从现有包中抽取lstm
combine_tessdata -e traineddata/eng.traineddata lstm/eng.lstm
traineddata/eng.traineddata为语言包名、lstm/eng.lstm为保存的文件名。
4. 创建TXT文件,里边的内容为.lstmf文件的绝对路径地址。
5. 训练
lstmtraining --debug_interval -1 --max_iterations 6000 --target_error_rate 0.01 --continue_from="F:\Python\****\train\lstm\eng.lstm" --model_output="F:\Python\****\train\output\aug2\output" --train_listfile="F:\Python\****\train\num.training_files.txt" --traineddata="F:\Python\****\train\traineddata\eng.traineddata"
训练参数意义:
–model_output 模型训练输出的路径
–continue_from 训练从哪里开始,这里指定从第4步中提取的eng.lstm文件。也可从之前训练生成的阶段文件output_checkpoint开始。
–train_listfile 指定上一步创建的chi_sim.training_files.txt文件路径。
–traineddata 第4步中下载的.traineddata文件的路径。
–debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数,此参数可略去。
–max_iterations 指明训练遍历次数。也可以使用这个参数:–target_error_rate 0.01 训练至错误率低于0.01%终止。
6. 合并模型:
lstmtraining --stop_training --traineddata="F:\Python\****\train\traineddata\eng.traineddata" --continue_from="F:\Python\****\train\output\aug2\output_checkpoint" --model_output="F:\Python\****\train\output\aug2\mnist_aug2.traineddata"
–stop_training 默认要有
–continue_from 上一步生成的output_checkpoint文件路径
–traineddata 第5步中下载的已有.traineddata文件的路径
–model_output chi.traineddata 输出的路径和文件名
7. 测试
有两种测试方式,一是利用测试集进行测试,二是将新生成的语言包导入安装路径进行实际的文字识别。
测试方式1:
首先,用与训练集相同的方式生成测试集的.lstmf文件
tesseract testfiles/num_test.mnist.exp0.tif lstmf/num_test.mnist.exp0 -l eng --psm 6 lstm.train
接着,创建txt文件。
最后进行测试。
lstmeval --model="F:\Python\****\train\output\aug2\mnist_aug2.traineddata" --eval_listfile="F:\Python\SGCC_OCR\train\num.test_files.txt"
–model : 为生成的语言包名称
–eval_listfile: 为刚刚创建的txt文件
测试方式2:
首先,将新生成的语言包复制到Tesseract-OCR根目录中的tessdata文件夹,
然后使用如下代码进行文字识别:
import pytesseract
from PIL import Image
img = Image.open('222.jpg')
img = img.convert('RGB')
print(pytesseract.image_to_string(img, lang='mnist_aug2'))
【遇到的问题】
训练时使用中文包chi_sim进行训练会出现系统内存溢出,直接退出程序,暂时未找到原因,欢迎各位大神解答。
参考:
https://blog.csdn.net/m0_37693841/article/details/105672637
https://blog.csdn.net/Hu_helloworld/article/details/100923215
https://blog.csdn.net/qq_30110069/article/details/98742701