[作者:令狐冲]

原文标题: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

OCR技术探讨(三)相关推荐

  1. 数平精准推荐 | OCR技术之系统篇

    导语:如果说算法和数据是跑车的发动机和汽油,那么系统则是变速箱,稳定而灵活的变速箱,是图像识别服务向前推进的基础.算法.数据.系统三位一体,随着算法的快速发展和数据的日益积累,系统也在高效而稳定地升级 ...

  2. ETSI MEC — 面向边缘计算的 5G 增强技术探讨

    目录 文章目录 目录 面向边缘计算的 5G 增强技术探讨 边缘应用服务器(EAS) 边缘应用服务器(EAS)的发现机制 应用迁移,EAS 重定向,业务连续性保障 网络向本地边缘应用平台快速提供网络信息 ...

  3. 数平精准推荐 | OCR技术之数据篇

    导语:深度学习在OCR领域的成功应用需要大量数据,数平精准推荐团队利用图像增强,语义理解,生成对抗网络等技术生成高质足量的数据,为算法模型提供燃料,帮助OCR技术服务在多种业务场景中快速迭代,提升效果 ...

  4. 计算机网络中 数据交换的方式有,计算机网络中的通信数据交换技术探讨

    计算机网络中的通信数据交换技术探讨 摘要:随着科技不断发展,人们对计算机网络技术越来越关注,计算机网络为人们生活带来诸多便利,是科技发展的基础工程.近年来,计算机网络中的通信数据交换技术被广泛应用,网 ...

  5. 安卓Android、iOS移动端车牌识别OCR技术原理

    核心内容:移动端车牌识别.安卓端车牌识别.Android车牌识别.iOS端车牌识别.OCR识别技术 一.安卓Android.iOS移动端车牌识别OCR技术识别流程 安卓Android.iOS移动端车牌 ...

  6. ABBYY OCR技术教电脑阅读缅甸语(上)

    2019独角兽企业重金招聘Python工程师标准>>> 缅甸联邦共和国,原名缅甸,是东南亚的一个国家,从1962年到2010年,缅甸一直被政变后上台的军政府统治,直至最近5年它才对外 ...

  7. 腾讯数平精准推荐 | OCR技术之识别篇

    腾讯数平精准推荐(Tencent-DPPR)团队一直致力于实时精准推荐.海量大数据挖掘等领域的技术研发与落地. 在社交广告推荐领域,团队自研的深度在线点击率预估算法及全流程实时推荐系统,持续多年提升社 ...

  8. python用ocr技术识别_使用Python和OCR实现图像识别

    背景 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷. ...

  9. OCR技术在爱奇艺的应用实践及演进

    随着人工智能的热度上升,图像识别这一细分领域也渐渐被人们所关注.在很多公司的业务中,有很多需要对图片进行识别的需求.为了帮助业务实现对这些图片.文档的识别和结构化,业界进行了一系列的实践和探索,最终确 ...

最新文章

  1. Microsoft 用户体验虚拟化 UE-V 1.0 RC 发布
  2. CentOS中安装mysql
  3. 模板 - 快速输入输出
  4. saltstack的状态文件
  5. 上财的计算机专业408,【2020考研】上财408分经验分享
  6. matlab生成exe独立运行文件已破解(好用)
  7. 基于OPENldap搭建postfix 虚拟用户
  8. c语言如何运行txt文件,如何使用EOF在C中运行文本文件?
  9. jQuery+AJAX+PHP+MySQL数据库开发搜索功能,无跳转无刷新搜索。
  10. 计算机二级晓云是企业人力,全国计算机二级Ms-Office精选真题试卷
  11. UncategorizedSQLException异常处理办法
  12. 如何下载vue.js
  13. STM32单片机实现二维码显示
  14. 威漫哨兵机器人_漫威:哨兵机器人能不能打过复仇者联盟?
  15. Java工具-根据出生年月日计算出年龄
  16. 海信e5k和e5h区别 对比评测 哪个好
  17. DIV+CSS布局之圣杯布局与双飞翼布局
  18. html5圆圈,javascript – 如何在HTML5画布中绘制带有文本的圆圈
  19. 【宋红康 MySQL数据库 】【高级篇】【07】MySQL的存储引擎
  20. DataBase培训

热门文章

  1. 文字闪烁特效 html+css
  2. Web浏览器兼容模式笔记
  3. 创业必备工作(转载)
  4. 表格说超链接危害计算机怎么办,意外:如果我在计算机上打开Excel超链接并提示由于该机器的限制而取消了操作,该怎么办?...
  5. 使用9Patch图片作为背景
  6. 电脑的时钟相位怎样设置
  7. svn和git的选择
  8. 瑞云科技助力番职院打造虚拟数字人,探索职业教育创新之路
  9. 安装抓图工具scrot
  10. 千万不要小看PCA,大神对PCA的理解