最新工作中涉及到OCR的内容,用了百度的OCR精度不错,但是速度有点慢,看网上有提到Tesseract这一开源的项目,下载试了一试发现速度是比百度快不少,但是精度差很多,所以研究了下怎么可以提高识别的精度,发现可以通过训练识别库的方式,所以才有了这篇文章,按Tesseract官方的说法,训练有三种方式:一从头开始训练(官方不推荐使用此方法);二对现有模型进行微调训练;三对现有模型的部分神经元网络进行训练,本文是使用的方式一,从头始开始训练完全符合自己需要的字库,废话少说下面开始一步步进行说明。
一、准备工作
1、相关程序和资源
tesseract-ocr:tesseract-ocr-w64-setup-v5.0.1.20220118.exe
tessdata_best:https://github.com/tesseract-ocr/tessdata_best
langdata_lstm:https://github.com/tesseract-ocr/langdata_lstm
文本编辑器:我使用的是notepad++(这个按个人使用的习惯,没有要求),还要用到cmd或者Power Shell,另外jTessBoxEditor这个工具也可下载(需要Java环境),虽然本例子中并不需要jTessBoxEditor,但是可用它打开图片+box文件看看。
2、安装Tesseract-OCR
Tesseract-OCR安装过程中需要选择中文的支持,安装完成后在环境变量中增加路径设置,方便cmd中的使用,这一过程网上有详细的说明,不会的百度一下即可。
3、建立目录结构
在e:盘新建文件夹t,把下载的tessdata_best和langdata_lstm放入,新建output和tmp文件夹,注意下面的所有步骤都是按e:\t这个根路径进行的,都是用的绝对路径,用其它路径当做根目录的请自行修改路径,当然也可以使用相对路径,但是我不喜欢相对路径(需要考虑相对的位置,容易出错),最始的目录结构如下:
E:\T
├─langdata_lstm
├─output
├─tessdata_best
└─tmp
4、处理tessdata_best简体中文库chi_sim.traineddata
1)解包简体中文库chi_sim.traineddata
combine_tessdata -u e:\t\tessdata_best\chi_sim.traineddata e:\t\tessdata_best\chi_sim,执行完成上面这条命令后,就会把chi_sim.traineddata解为几个文件,具体文件内容可以自己去e:\t\tessdata_best文件夹中去看一看。
2)转化dawg字典文件为文本文件(Directed Acyclic Word Graph)
文字字典:
dawg2wordlist e:\t\tessdata_best\chi_sim.lstm-unicharset e:\t\tessdata_best\chi_sim.lstm-word-dawg e:\t\tessdata_best\word.txt
数字字典:
dawg2wordlist e:\t\tessdata_best\chi_sim.lstm-unicharset e:\t\tessdata_best\chi_sim.lstm-number-dawg e:\t\tessdata_best\number.txt
标点符号字典:
dawg2wordlist e:\t\tessdata_best\chi_sim.lstm-unicharset e:\t\tessdata_best\chi_sim.lstm-punc-dawg e:\t\tessdata_best\punc.txt
5、研究tessdata_best的字符集文件
用文本编辑器打开字符集文件,就是e:\t\tessdata_best\chi_sim.lstm-unicharset,可以看到4022这个数字(这是一个重要的数字),第5行是字母“S”,第4023行是汉字“掺”,从“S”到“掺”这4019行就是tessdata_best中文的全部编码,同理也可以自己查看一下tessdata_fast中文编码也是4019个,tessdata多一些有5071个(tessdata的文件名为chi_sim.unicharset),编码文件内容看来没有什么规律,为了方便看少了什么字,本人进行了变换处理(只保留编码字符并按GB2312顺序排序),结果如下:字符数字标点符号共有120个(其中多了一个GB2312中没有的〇),汉字有3899个,可GB2312有汉字6763个(一级汉字3755,二级汉字3008个),这个差距有点大呀,所以tessdata汉字识别精度不高在所难免(字符集中都没有还怎么识别呀)。
下面开始关键的步骤
二、生成字符集lstm-unicharset文件
1、生成字符集txt文件
把字符集所要包含的数字、字母、标点符号和汉字,保存在e:\t\chi_si