注:目前仅说明windows下的情况

前言

网上已经有大量的tesseract的识别教程,但是主要有两个缺点:

  • 大多数比较老,有部分内容已经不适用。
  • 大部分只是就英文的训练进行探索,很少针对中文的训练。
    接下来尽可能详细的介绍自己tesseract训练中文识别的经验。

本文中使用的tesseract版本为3.05;
为什么用3.05呢?
从官方文档上看4.0版本(windows版本于2017年1月30号发布)显著的提高了识别率,同时也加大了性能的消耗。理论上我是应该用4.0。但这不是重点。重点是有windows的版本有诡异的bug! 花了好久没有解决。
不过还好,4.0支持3.05版本的所有语法。换而言之,下面的所有内容在4.0都是可以用的。

工具准备

安装过程

 
点击下一步
 
勾选上同意,然后点击下一步
 
点击下一步
 
既然是要训练中文,记得勾选 additional language data
 
找到中文简体和中文繁体,按需勾选,然后点下一步

可以先不勾选,因为这样直接下载语言的包实在太慢。可以从网页上直接下载语言包,然后等程序安装好后,放入安装目录下tessdata目录下面

 
目录。。毕竟是你的电脑,随便选,你开心就好,然后点下一步
 
点击install

安装完毕。

字体训练

我准备了一份含汉语7000字和大小写英文字母和数字的文档.如果你需要训练所有中文的话,请将所有docx文件内所有字改成你要训练的字体。然后转化成tif格式的图片。

步骤(转自tesseract的github)

  1. Prepare training text.
    准备你的训练文本
  2. Render text to image + box file. (Or create hand-made box files for existing image data.)
    将文本转为image+box文件.(如果你已经有image文件的话,只需要手动生成box文件)
  3. Make unicharset file.
    生成unicharset文件
  4. Optionally make dictionary data.
    有选择性的生成字典数据
  5. Run tesseract to process image + box file to make training data set.
    运行tesseract来处理之前的image+box文件生成一个训练数据集合
  6. Run training on training data set.
    在训练数据集合的基础上进行训练
  7. Combine data files.
    合并数据文件

下面所列的步骤其实稍有不同。

如果有多张图片[可选]

如果是其他图片格式,将其转为tif格式。附上一个在线地址

使用之前安装jTessBoxEditor工具将多张图片合并为一张(菜单栏 Tools → Merge TIFF)。并按照格式 [lang].[fontname].exp[num] 重命名合并后的文件,这里我命名为 chi.fangzheng.exp0.tif

为了方便下文中输入路径,在本文中将改好的tif图拷贝至tesseract安装之后的目录下。

步骤二:生成box文件

贴一张官网命令:

 
官方命令

输入路径和输出路径文件名(除了后缀)应该保持一致。
因为我们是要训练中文所以还需要加上-l chi_sim(l代表language chi_sim是放在tessdata目录下中文简体字体名的前缀),实际命令如下所示

tesseract.exe chi.fangzheng.exp0.tif chi.fangzheng.exp0 -l chi_sim batch.nochop makebox

步骤二:校正box文件

打开之前安装的jTessBoxEditor,

 
点击open,然后找到tif图片文件
 
通过这部分区域的按钮对识别结果进行校正

校正完之后点击保存

步骤三:生成unicharset文件

生成tr文件

使用刚才修改正确后的 box 文件,对 Tesseract 进行训练,生成 .tr 文件:

//tesseract.exe [tif图片文件名] [生成的tr文件名] nobatch box.train
tesseract.exe chi.fangzheng.exp0.tif chi.fangzheng.exp0 nobatch box.train

生成Character集合

//unicharset_extractor.exe [box文件名]
unicharset_extractor.exe chi.fangzheng.exp0.box

如果有多个图片的话,则需要合并生成1个Character集合,命令如下

//unicharset_extractor.exe [1个box文件名] [1个box文件名] .....
unicharset_extractor.exe chi.fangzheng.exp0.box chi.fangzheng.exp1.box

创建字体特征文件

定义字体特征文件,Tesseract-OCR 3.01 以上的版本在训练之前需要创建一个名称为 font_properties 的字体特征文件。font_properties 不含有 BOM 头,文件内容格式如下:

<fontname> <italic> <bold> <fixed> <serif> <fraktur>
//其中 fontname 为字体名称,必须与 [lang].[fontname].exp[num].box 中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、<fraktur> 的取值为 1 或 0,表示字体是否具有这些属性。
//本次示例
fangzheng 0 0 0 0 0

步骤五:生成字典数据

如果是单个依次输入下面两条命令,多个文件则输入多个tr

mftraining.exe -F font_properties -U unicharset -O chi.unicharset chi.fangzheng.exp0.tr
//mftraining.exe -F font_properties -U unicharset -O chi.unicharset [第一个tr] [第二个]... cntraining.exe chi.fangzheng.exp0.tr
//cntraining.exe [第一个tr] [第二个]...

接下来手工修改 Clustering 过程生成的 4 个文件(inttemp、pffmtable、normproto、shapetable)的名称为 [lang].xxx。例如我这里改为 chi.inttemp、chi.pffmtable、chi.normproto、chi.shapetable。

步骤七:合并数据文件

生成语言文件:

combine_tessdata chi.
 
 

需确认打印结果中的 Offset 1、3、4、5、13 这些项不是 -1。这样,一个新的语言文件就生成了。

chi.traineddata 便是最终生成的语言文件,将生成的 chi.traineddata 文件拷贝到 tessdata 目录下,就可以用它来进行字符识别了。

我们可以用刚刚的tif文件来测试一下识别能力:

//tesseract [图片文件名] [需要输出的文本文档的文件名] -l [识别的语言]
tesseract chi.fangzheng.exp0.tif out -l chi

作者:aliyu
链接:https://www.jianshu.com/p/31afd7fc5813
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Tesseract训练中文字体识别的更多相关文章

  1. java实现的身份证照片脸部识别(头像截图) 以及OCR字体识别

    断断续续地折腾了大半个月,终于把身份证照片脸部识别以及OCR字体识别功能用Java实现了,需求很简单:通过摄像头所照的一张放在黑色底板上的身份证照,识别照片上身份证里面的人名和地址(OCR中文),再截 ...

  2. 基于Tesseract实现图片文字识别

    一.简介  Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[l ...

  3. Python识别验证码,基于Tesseract实现图片文字识别

    一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...

  4. 基于Tesseract组件的OCR识别

    基于Tesseract组件的OCR识别 背景以及介绍 欲研究C#端如何进行图像的基本OCR识别,找到一款开源的OCR识别组件.该组件当前已经已经升级到了4.0版本.和传统的版本(3.x)比,4.0时代 ...

  5. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  6. EasyPR--一个开源的中文车牌识别系统

    我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Reco ...

  7. 基于LeNet网络的中文验证码识别

    基于LeNet网络的中文验证码识别 由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013 ...

  8. css常用中文字体的英文名称写法

    我们知道网页中使用中文字体最好用其对应的英文名称,这样可以避免出现编码问题导致样式中的中文名称出现乱码,从而不识别.下面是网页中常用的中文字体所对应的英文名称.留着,不用翻资料了 中文 英文 宋体 S ...

  9. Tesseract训练

    最近在用Tesseract做一个图片识别的小应用,目标图像只有数字和英文字母,在实际使用过程中发现个别数识别错误,因此不得不研究学习Tesseract的训练. http://www.cnblogs.c ...

随机推荐

  1. 生命周期(vue的钩子函数)

    生命周期图示 创建前,创建后,挂载前,挂载后,更新前,更新后,销毁前,销毁后 beforeCreate:function(){ console.log('1-beforeCreate 组件还未被创建' ...

  2. centos安装ss教程

    在CentOS 6.6上安装ShadowSocks服务端 1.查看系统[root@localhost ~]# cat /etc/issue CentOS release 6.6 (Final) [ro ...

  3. PHP获取ip与ip所在城市

    1获取真实ip,本地测试总是::1 或者127.0.0.1 或者局域网的ip /** * 获取用户真实 IP */ function getIP() { static $realip; if (iss ...

  4. redis之(十九)redis的管理

    [一]redis的安全 --->redis的简洁美,使得redis的安全设计是在“redis运行在可信环境”这个前提下做出来,. --->在生产环境运行时不能允许外界直接链接到redis, ...

  5. 解决获取图片实际尺寸(宽高)的bug

    需求:获取图片的宽高其实是为了预先做好排版样式布局做准备. 可以利用图片onload事件监听获取图片的宽高属性值.在IE9以下版本只能使用图片的width与height属性,HTMl5中新加入了nat ...

  6. C#使用NOPI生成excel要点记载

    很久没动手写博客了,最近由于公司比较忙,接触了不同类容,对自己的技术和业务理解有了更深入的理解.今天有点小空,将前段时间所运用到的一些知识点记录下来. 由于公司业务需要统计一些数据,所以对于我们来说, ...

  7. jstree无限级菜单ajax按需动态加载子节点

    业余时间研究了一下jstree,更新非常快已经是3.0了,首先看一下效果截图: 1.页面引入样式和脚本(注意路径根据实际情况) <link href="~/Scripts/vakata ...

  8. CentOS7用yum安装MySQL与启动

    首先CentOS7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安 ...

  9. try catch finally 执行顺序面试题总结

    在网上看到一些异常处理的面试题,试着总结一下,先看下面代码,把这个方法在main中进行调用打印返回结果,看看结果输出什么. public static int testBasic(){ int i = ...

  10. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8001 -j DNAT --to-destination 172.17.0.5:8080 ! -i docker0: iptables: No chain/target/match by that name.

    在docker容器上部署项目后,启动docker容器,出现 iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dpor ...