OCR技术探讨(三)

[作者:令狐冲]

原文标题:Tesseract 4.0 LSTM训练超详细教程

原文链接:Tesseract 4.0 LSTM训练超详细教程 - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Tesseract 4.0 LSTM训练超详细教程

Tesseract 4.0 LSTM训练超详细教程

令狐冲

令狐冲

在机器学习门口徘徊的迷途小书童

Tesseracr 4.0 LSTM训练过程

准备工作

环境配置

训练前需要安装以下依赖,详细

sudo apt-get install libicu-devsudo apt-get install libpango1.0-devsudo apt-get install libcairo2-dev

如果是从源码编译的,需要安装训练工具,在tesseract源码目录下运行

makemake trainingsudo make training-install

注意点:

  • 无论是从源码安装还是其他安装,都需要把github上的项目pull下来。
  • tesserdata需要使用github上tesserdata_best下的数据(其他版本的或被封装,或与传统识别模式混合,不利于使用LSTM训练)
  • 字体安装,许多字体linux系统没有自带

tesseract已训练字体

  • 宋体
  • 楷体
  • 黑体

公文常用字体

标题:二号方正小标宋体

正文:三号仿宋

ubuntu下字体安装

想要知道自己的系统里已有的字体可以使用以下命令来查看

text2image --fonts_dir /usr/share/fonts --list_available_fonts

安装 MS TrueType 字体,包括Times New Roman 和 Arial

#安装$ sudo apt update$ sudo apt install ttf-mscorefonts-installer#更新缓存$ sudo fc-cache -f -v

安装windows的方正小标宋体tiff字体

mkdir /usr/share/fonts/truetype/fzxb

把tiff文件粘贴到此目录下

#更改文件权限cd /usr/share/fonts/truetype/sudo chmod -R 755 fzxb#建立字体缓存cd /usr/share/fonts/truetype/fzxbmkfontscalemkfontdirfc-cache -fv

增加一种新字体还需要在langdata/font_properties文件中添加一行数据:FangSong 0 0 0 0 0(如果langdata/font_properties文件中没有关于FangSong的配置的话)

生成训练数据

训练语料注意一行不要过长,否则会在LSTM训练时报错:image is too large,经验之谈55个字符以内比较合适

方法一:使用tesstrain工具,根据系统字体生成训练语料(推荐)

在tesseract源码下执行,语法如下:

src/training/tesstrain.sh \ --fonts_dir /usr/share/fonts --lang eng --linedata_only \ --noextract_font_properties --langdata_dir ../langdata \ --tessdata_dir ./tessdata --output_dir ~/tesstutorial/engtrain

--fonts_dir 系统字体文件夹

--lang 三个字母的语言标志,中文是chi_sim

--linedata_only 生成的box文件是适合lstm训练的,即每一行结束增加\t

--langdata_dir langdata文件夹,可以从github上pull下来

--tessdata_dir 存放语言模型的文件夹tessdata

--output_dir 生成的lstmf路径

我要生成的是方正小标宋体的训练语料,代码如下

src/training/tesstrain.sh \--fonts_dir /usr/share/fonts \--lang chi_sim --linedata_only \--fontlist "FZXiaoBiaoSong-B05S Semi-Condensed" \--save_box_tiff --noextract_font_properties \--langdata_dir ~/langdata --tessdata_dir ./tessdata \--output_dir ~/tesstutorial/chitrain

方法二:根据text2image生成语料

其实tesstrain.sh工具也是调用了text2image工具的,使用text2image工具有更多可以选择的参数,详见https://github.com/tesseract-ocr/tesseract/blob/master/doc/text2image.1.asc

语法:text2image --text FILE --outputbase PATH --fonts_dir PATH [OPTION]

比如我需要生成36号的方正小标宋体语料,流程如下:

把text转换成tif和box

text2image \--text ~/langdata/chi_sim/chi_sim.training_text \--fonts_dir /usr/share/fonts \--outputbase ~/tesstutorial/chitrain/boxfile/chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0 \--ptsize 36 --font "FZXiaoBiaoSong-B05S Semi-Condensed"

下面就是通过tif和box文件生成lstmf训练语料的过程啦,github官网上说tesstrain.sh工具上增加参数--my_boxtiff_dir可以实现,但经过实践,成功跑完之后生成的lstmf是方法一的结果,并没有用到我们的自定义tif和box,网上的其他方案如修改tesstrain.sh源码等,都试过了无效目前只能一步步来了:

生成unicharset

unicharset_extractor --output_unicharset ~/tesstutorial/chitrain/boxfile/chi_sim/chi_sim.unicharset --norm_mode 1 ~/tesstutorial/chitrain/boxfile/chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0.box

生成原始traineddata

set_unicharset_properties -U ~/tesstutorial/chitrain/boxfile/chi_sim/chi_sim.unicharset -O ~/tesstutorial/chitrain/boxfile/chi_sim/chi_sim.unicharset --script_dir ~/langdata

通过tif、box文件生成lstmf文件

tesseract --psm 6 chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0.tif chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0 nobatch lstm.train

combine

combine_lang_model --input_unicharset ~/tesstutorial/chitrain/boxfile/chi_sim/chi_sim.unicharset --lang chi_sim --script_dir ~/langdata --output_dir ~/tesstutorial/chitrain/boxfile

到这一步就可以啦

方法三:通过jTessBoxEditor手工标注

参考tesseract 3.X的训练方法,注意box文件在每一行结束后增加\t记录。得到box和tif后参考方法二继续进行。

微调训练:对已有的chi_sim.traineddata进行微调训练

官网的chi_sim是比较通用的,如果OCR是使用在具体场景下的如公文扫描文档,重新训练是最好的。

自己重头开始训练需要大量语料和时间,如果语料不足容易过拟合,不适合我们快速出结果,微调训练比较适合。

原始chi_sim模型中提取lstm文件

combine_tessdata -e ~/tessdata/chi_sim.traineddata \ ~/tesstutorial/fz_from_full/chi_sim.lstm

fintune训练

lstmtraining --model_output ~/tesstutorial/fz_from_full/fz \ --continue_from ~/tesstutorial/fz_from_full/chi_sim.lstm \ --traineddata ~/tessdata/chi_sim.traineddata \ --train_listfile ~/tesstutorial/chitrain/boxfile/chi_sim.training_files.txt \ --max_iterations 800

--traineddata 是从这个traineddata开始训练,fintune训练从github下载的traineddata开始,如果是Scratch训练,则指定语料生成时的初始traineddata文件

模型合并输出

lstmtraining --stop_training \ --continue_from ~/tesstutorial/fz_from_full/fz_checkpoint \ --traineddata ~/tessdata/chi_sim.traineddata \ --model_output ~/tesstutorial/fz_from_full/chi_sim.traineddata

微调训练:增加常用的特殊标点,增加wordlist

training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \ --continue_from /path/to/existing/model \ --traineddata /path/to/traineddata/with/new/unicharset \ --old_traineddata /path/to/existing/traineddata \ [--perfect_sample_delay 0] [--debug_interval 0] \ [--max_iterations 0] [--target_error_rate 0.01] \ --train_listfile /path/to/list/of/filenames.txt

原始的chi_sim模型,缺少部分中文常用的标点,如“()—”等,之前的微调训练不改变网络结构,遇到没有的单词就会报错:Encoding of string failed!,这时候需要我们把语料中的特殊字符进行替换,如中文‘!’替换为英文‘!’,中文,替换为英文,等。

但是中文括号‘(’如果替换为英文括号‘(’,实际中遇到了中文(,模型会识别为‘《’或者‘[’,并且中文括号在公文中常常出现,因此不能忽视这个问题,我们使用加强版的微调训练即可解决。

这种修改了字符集的加强版微调训练,需要更多的语料和训练更多的次数,不然容易过拟合。

过滤不常见的字

虽然加强版的微调训练支持在字符表上增加字符,但是一些比较少见的字还是要过滤掉的,因为这些少见的字在我们的语料中的样本也不足,会干扰我们的模型。

增加常用词典

--traineddata /path/to/traineddata/with/new/unicharset

加强版微调的训练参数--traineddata,是指使用tesstrain.sh生成的初始traineddata文件,生成此文件时可以使用自定义词典--wordlist WORDFILE(按照词频从高到低)。

注意.config等其他langdata文件不要缺。

加强版微调训练

lstmtraining --model_output ~/tesstutorial/output0305/gongwen \ --continue_from ~/tesstutorial/output0305/chi_sim.lstm \ --traineddata ~/tesstutorial/train0305/chi_sim/chi_sim.traineddata \ --old_traineddata ~/tessdata/chi_sim.traineddata \ --train_listfile ~/tesstutorial/train0305/chi_sim.training_files.txt \ --max_iterations 3600

模型输出

注意--traineddata的参数是我们利用tesstrain.sh新建立的traineddata

lstmtraining --stop_training \ --continue_from ~/tesstutorial/output0305/gongwen1.013_812.checkpoint \ --traineddata ~/tesstutorial/train0305/chi_sim/chi_sim.traineddata \ --model_output ~/tesstutorial/output0305/chi_sim.trainedda

微调训练:使用已有标点替换特殊标点

由于加强版的微调训练比较容易过拟合,而且需要修改的地方较多。还有一种方法就是,使用text2image生成图片语料(特殊标点还是以原样生成,即中文括号还是以‘(’输出)以及box文件(记录位置和文字信息的文件),对box文件中的特殊标点进行替换(即'('替换为'(')。然后再按照普通微调训练即可。

这种方法就是生产的图片语料还是正常的,在标记数据中把特殊字符(如中文括号)替换为正常字符(如英文括号),其实就是把中文括号和英文括号这两类都归类为英文括号,不产生新的类别就不用大改tesseract 的网络。

步骤如下:

准备语料文本文档

unicharset对比,看我们的语料是否有不在字符表上的特殊符号,如果是不太关注的符号则进行删除,如∰

如果是有用的特殊字符,我们则保留并在后续流程中对box文件进行替换,如中文括号。

生成图片和box

使用text2image工具,从text语料文件生成tif图片和box文档

text2image \--text ~/langdata/chi_sim/chi_sim.training_text \--fonts_dir /usr/share/fonts \--outputbase ~/tesstutorial/train0304/chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0 \--font "FZXiaoBiaoSong-B05S Semi-Condensed" \--rotate_image "false"

修改box文件

根据第一步与unicharset对比,我们把box文件中的特殊字符进行替换,如把中文括号换成英文括号。因为不需要修改基础字符集和网络结构,因此不用生成新的unicharset等文件,直接生成lstmf文件进行训练即可。

从box/tif文件合成lstmf文件

tesseract --psm 6 chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0.tif chi_sim.FZXiaoBiaoSong-B05S_Semi-Condensed.exp0 nobatch lstm.train

从现有的模型提取lstm

combine_tessdata -e ~/tessdata/chi_sim.traineddata \ ~/tesstutorial/output0304/chi_sim.lstm

进行finetune训练

lstmtraining --model_output ~/tesstutorial/output0304/tihuan \ --continue_from ~/tesstutorial/output0304/chi_sim.lstm \ --traineddata ~/tessdata/chi_sim.traineddata \ --train_listfile ~/tesstutorial/train0304/chi_sim.training_files.txt \ --max_iterations 1200

模型输出

lstmtraining --stop_training \ --continue_from ~/tesstutorial/output0304/tihuanplus_checkpoint \ --traineddata ~/tessdata/chi_sim.traineddata \ --model_output ~/tesstutorial/output0304//chi_sim.traineddata

对你有用的话,请随手点赞哦~

发布于 2019-03-05

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值