Tesseract中英文正体斜体混合训练
当我们识别数据中包含中文正体,英文斜体字符时,Tess4.0识别英文斜体的效果并不理想。因此,我们需要训练新的模型,以满足识别正体斜体混合文本图片的需求。
预言
在看本篇文章之前,推荐阅读本人之前写的一篇题库特殊字符语言包训练流程(新),这篇文章里提到了Tess4正常的训练的流程,可以快速理解Tess的训练过程。
Tess4正斜体混合训练分析
针对中文正体,英文斜体混合文本识别,一个简单的训练思路是,将中英文混合文本放在一起分别转化成正体和斜体两种形式的图片,然后输入Tess4一起训练。然而,
针对英文文本的训练,Tess4可以有效地应用相应的斜体字体将txt转化成斜体字符图片,从而进一步训练斜体字符;但对于中文,因为没有找到中文斜体的相应字体,所以针对中文斜体识别便一筹莫展。
所以,针对中英文(中文正体,英文斜体)混合文本,Tess4只能将中文正体和英文斜体分开转换图片,然后手工进行合并,最后导入Tess4中的神经网络进行训练。
中英文混合输入数据准备
中文正体输入数据准备
中文正体输入数据的改变比较简单:
- 将需要识别的数据拷贝到./langdata/chi_sim/chi_sim.training_text文件中;
- 输入以下命令:
training/tesstrain.sh --fonts_dir /usr/share/fonts --lang chi_sim --linedata_only
--noextract_font_properties --langdata_dir ../langdata
--fontlist "SIMSUN" --tessdata_dir ./tessdata --output_dir ~/tesstutorial/trainmerge
查看日志可以看到整个过程中执行了/usr/local/bin/text2image命令,此命令将txt文本数据转化成相应的chi_sim.SIMSUN.exp0.tif图片及其相应的chi_sim.SIMSUN.exp0.box文件,因此可以在/tmp/tmp.xxxxxxxxxx/chi_sim/文件夹下查看这两个文件。在后期合并数据时有用到这两个文件。
英文斜体输入数据准备
- 将需要识别的数据拷贝到./langdata/eng/eng.training_text文件中;
- 输入以下命令:
training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only
--noextract_font_properties --langdata_dir ../langdata
--fontlist "Arial Italic" --tessdata_dir ./tessdata --output_dir ~/tesstutorial/traineng
这里,针对英文斜体,这里主要用了Arial Italic字体进行图片转换,同样/tmp/tmp.xxxxxxxxxx/chi_sim/文件夹下可以看到eng.Arial_Italic.exp0.tif图片及相应的eng.Arial_Italic.exp0.box文件。
合并中英文数据
合并tif图片
下载安装jTessBoxEditor工具,具体的工具使用方法可以查看日志:android中tesseract-ocr自定义字库的介绍。这里不再赘述。
将chi_sim.SIMSUN.exp0.tif和eng.Arial_Italic.exp0.tif拷贝到同一目录下,先将两张图片分别split,并删除chi_sim.SIMSUN.exp0.tif和eng.Arial_Italic.exp0.tif图片,然后将split出来的图片一起merge,具体方法查看android中tesseract-ocr自定义字库的介绍日志。注意:将合并后的tif图片命名为:chi_sim.SIMSUN.exp0.tif即可。
合并box文件
box文件的合并,本人写了一段python代码:
box_file1 = open('E:/jTessBoxEditorFX/tesseract-ocr/temp_roman/chi_sim.SIMSUN.exp0.box', 'rb').read().decode('utf-8')
box_file2 = open('E:/jTessBoxEditorFX/tesseract-ocr/temp_roman/eng.Times_New_Roman.exp0.box', 'rb').read().decode('utf-8')
box_content = box_file1 + '\n'
box1_page_num = 0
for line in box_file1.split('\n'):
if len(line) > 0:
page_num = int(line.split(' ')[len(line.split(' '))-1])
if page_num > box1_page_num:
box1_page_num = page_num
box1_page_num += 1
for line in box_file2.split('\n'):
if len(line) > 0:
page_num1 = int(line.split(' ')[len(line.split(' '))-1])
sub_line = ''
for i in range(len(line.split(' '))-1):
sub_line += line.split(' ')[i] + ' '
box_content += sub_line + str(page_num1+box1_page_num) + '\n'
open('E:/jTessBoxEditorFX/tesseract-ocr/temp_roman/merge.box', 'bw').write(box_content.encode('utf-8'))
注:在运行代码之前,需要在chi_sim.SIMSUN.exp0.box文件末尾加入换行提示行,内容如下:
[tab] 1710 222 1755 187 2
注意部分坐标值需要根据现实情况作出相应修改,这个应该不难,稍微总结一下box文件中的规律即可明白。
神经网络输入数据准备
- 合并完tif和box文件后,将它们覆盖到/tmp/tmp.xxxxxxxxxx/chi_sim/文件夹下面,(中文正体输入数据准备生成的目录),并将其他文件清空;
- 修改tesseract/training/tesstrain.sh文件内容:
- 将61行phase_I_generate_image 8内容注释;
- 将source "$(dirname $0)/tesstrain_utils.sh" 改为source "$(dirname $0)/tesstrain_utils1.sh"; - 修改tesseract/training/tesstrain_utils.sh文件内容,修改以下内容:
- WORKSPACE_DIR=$(mktemp -d) 改成WORKSPACE_DIR="/tmp/tmp.xxxxxxxxxx"(目录为中文正体输入数据准备生成的目录)
- export FONT_CONFIG_CACHE=$(mktemp -d --tmpdir font_tmp.XXXXXXXXXX)改成 export FONT_CONFIG_CACHE="/tmp/font_tmp.xxxxxxxxxx"(目录为中文正体输入数据准备生成的目录)
- 注释initialize_fontconfig方法下的run_command text2image命令 - 运行命令:
training/tesstrain.sh --fonts_dir /usr/share/fonts --lang chi_sim --linedata_only
--noextract_font_properties --langdata_dir ../langdata
--fontlist "SIMSUN" --tessdata_dir ./tessdata --output_dir ~/tesstutorial/trainchisim
训练数据
这里给出scratch训练方法:
training/lstmtraining --debug_interval 100
--traineddata ~/tesstutorial/trainmerge/chi_sim/chi_sim.traineddata
--net_spec '[1,0,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx512 O1c379]'
--model_output ~/tesstutorial/mergeoutput/base
--learning_rate 20e-4 --train_listfile ~/tesstutorial/trainmerge/chi_sim.training_files.txt
--eval_listfile ~/tesstutorial/evalmerge/chi_sim.training_files.txt
--max_iterations 3600 &>~/tesstutorial/mergeoutput/basetrain.log
更多训练教程可以查看:题库特殊字符语言包训练流程(新)
最后,合并模型,具体命令可以查看:题库特殊字符语言包训练流程(新)