OCR技术探讨(三)
[作者:令狐冲]
原文标题: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技术探讨(三)相关推荐
- 数平精准推荐 | OCR技术之系统篇
导语:如果说算法和数据是跑车的发动机和汽油,那么系统则是变速箱,稳定而灵活的变速箱,是图像识别服务向前推进的基础.算法.数据.系统三位一体,随着算法的快速发展和数据的日益积累,系统也在高效而稳定地升级 ...
- ETSI MEC — 面向边缘计算的 5G 增强技术探讨
目录 文章目录 目录 面向边缘计算的 5G 增强技术探讨 边缘应用服务器(EAS) 边缘应用服务器(EAS)的发现机制 应用迁移,EAS 重定向,业务连续性保障 网络向本地边缘应用平台快速提供网络信息 ...
- 数平精准推荐 | OCR技术之数据篇
导语:深度学习在OCR领域的成功应用需要大量数据,数平精准推荐团队利用图像增强,语义理解,生成对抗网络等技术生成高质足量的数据,为算法模型提供燃料,帮助OCR技术服务在多种业务场景中快速迭代,提升效果 ...
- 计算机网络中 数据交换的方式有,计算机网络中的通信数据交换技术探讨
计算机网络中的通信数据交换技术探讨 摘要:随着科技不断发展,人们对计算机网络技术越来越关注,计算机网络为人们生活带来诸多便利,是科技发展的基础工程.近年来,计算机网络中的通信数据交换技术被广泛应用,网 ...
- 安卓Android、iOS移动端车牌识别OCR技术原理
核心内容:移动端车牌识别.安卓端车牌识别.Android车牌识别.iOS端车牌识别.OCR识别技术 一.安卓Android.iOS移动端车牌识别OCR技术识别流程 安卓Android.iOS移动端车牌 ...
- ABBYY OCR技术教电脑阅读缅甸语(上)
2019独角兽企业重金招聘Python工程师标准>>> 缅甸联邦共和国,原名缅甸,是东南亚的一个国家,从1962年到2010年,缅甸一直被政变后上台的军政府统治,直至最近5年它才对外 ...
- 腾讯数平精准推荐 | OCR技术之识别篇
腾讯数平精准推荐(Tencent-DPPR)团队一直致力于实时精准推荐.海量大数据挖掘等领域的技术研发与落地. 在社交广告推荐领域,团队自研的深度在线点击率预估算法及全流程实时推荐系统,持续多年提升社 ...
- python用ocr技术识别_使用Python和OCR实现图像识别
背景 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷. ...
- OCR技术在爱奇艺的应用实践及演进
随着人工智能的热度上升,图像识别这一细分领域也渐渐被人们所关注.在很多公司的业务中,有很多需要对图片进行识别的需求.为了帮助业务实现对这些图片.文档的识别和结构化,业界进行了一系列的实践和探索,最终确 ...
最新文章
- Microsoft 用户体验虚拟化 UE-V 1.0 RC 发布
- CentOS中安装mysql
- 模板 - 快速输入输出
- saltstack的状态文件
- 上财的计算机专业408,【2020考研】上财408分经验分享
- matlab生成exe独立运行文件已破解(好用)
- 基于OPENldap搭建postfix 虚拟用户
- c语言如何运行txt文件,如何使用EOF在C中运行文本文件?
- jQuery+AJAX+PHP+MySQL数据库开发搜索功能,无跳转无刷新搜索。
- 计算机二级晓云是企业人力,全国计算机二级Ms-Office精选真题试卷
- UncategorizedSQLException异常处理办法
- 如何下载vue.js
- STM32单片机实现二维码显示
- 威漫哨兵机器人_漫威:哨兵机器人能不能打过复仇者联盟?
- Java工具-根据出生年月日计算出年龄
- 海信e5k和e5h区别 对比评测 哪个好
- DIV+CSS布局之圣杯布局与双飞翼布局
- html5圆圈,javascript – 如何在HTML5画布中绘制带有文本的圆圈
- 【宋红康 MySQL数据库 】【高级篇】【07】MySQL的存储引擎
- DataBase培训